当前位置: 首页 > news >正文

掌握 Spring 框架这 10 个扩展点

1. 全局异常处理=====》RestControllerAdvice

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public String handleException(Exceptione{
        if (e instanceof ArithmeticException) {
            return"params error";
        }
        if (e instanceof Exception) {
            return"Internal server exception";
        }
        returnnull;
    }
}

只需在 handleException 方法中处理异常情况。

2. 自定义拦截器

与 Spring 拦截器相比,Spring MVC 拦截器可以在内部获取 HttpServletRequest 和 HttpServletResponse 等 Web 对象实例。

Spring MVC 拦截器的顶级接口是:HandlerInterceptor,它包含三个方法:

  • preHandle:在目标方法执行前执行。
  • postHandle:在目标方法执行后执行。
  • afterCompletion:在请求完成时执行。

为了方便起见,在一般情况下,我们通常使用 HandlerInterceptor 接口的实现类 HandlerInterceptorAdapter

如果存在权限认证、日志记录和统计等场景,可以使用此拦截器。

第一步,通过继承 HandlerInterceptorAdapter 类定义一个拦截器:

publicclassAuthInterceptorextendsHandlerInterceptorAdapter{
    @Override
    publicbooleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
        String requestUrl = request.getRequestURI();
        if (checkAuth(requestUrl)) {
            returntrue;
        }
        returnfalse;
    }

    privatebooleancheckAuth(String requestUrl){
        System.out.println("===Authority Verification===");
        returntrue;
    }
}



第二步,在 Spring 容器中注册此拦截器。

@Configuration
publicclassWebAuthConfigextendsWebMvcConfigurerAdapter{
    @Bean
    public AuthInterceptor getAuthInterceptor(){
        returnnew AuthInterceptor();
    }

    @Override
    publicvoidaddInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(new AuthInterceptor());
    }
}



3. 获取 Spring 容器对象

在日常开发中,我们经常需要从 Spring 容器中获取 Beans

3.1 BeanFactoryAware 接口

@Service
publicclassStudentServiceimplementsBeanFactoryAware{
    private BeanFactory beanFactory;

    @Override
    publicvoidsetBeanFactory(BeanFactory beanFactory)throws BeansException {
        this.beanFactory = beanFactory;
    }

    publicvoidadd(){
        Student student = (Student) beanFactory.getBean("student");
    }
}

实现 BeanFactoryAware 接口,然后重写 setBeanFactory 方法。从这个方法中,可以获取 Spring 容器对象。

3.2 ApplicationContextAware 接口

@Service
publicclassStudentService2implementsApplicationContextAware{
    private ApplicationContext applicationContext;

    @Override
    publicvoidsetApplicationContext(ApplicationContext applicationContext)throws BeansException {
        this.applicationContext = applicationContext;
    }

    publicvoidadd(){
        Student student = (Student) applicationContext.getBean("student");
    }
}


4. 导入配置
有时我们需要在某个配置类中导入其他一些类,并且导入的类也会被添加到 Spring 容器中。此时,可以使用@Import 注解来完成此功能。

导入普通类

这种导入方式最简单。导入的类将被实例化为一个 bean 对象。

publicclassA{
}

@Import(A.class)
@Configuration
publicclassTestConfiguration{
}

通过@Import 注解导入类 A,Spring 可以自动实例化对象 A。然后,可以在需要的地方通过@Autowired 注解进行注入:

@Autowired
private A a;



4.2 导入带有@Configuration 注解的配置类

这种导入方式最复杂,因为@Configuration 注解还支持多种组合注解,例如:

  • @Import
  • @ImportResource
  • @PropertySource 等
publicclassA{
}

publicclass B {
}

@Import(B.class)
@Configuration
publicclassAConfiguration{
    @Bean
    public A a(){
        returnnew A();
    }
}

@Import(AConfiguration.class)
@Configuration
publicclassTestConfiguration{
}

通过@Import 注解导入一个带有@Configuration 注解的配置类,与该配置类相关的@Import@ImportResource 和@PropertySource 等注解导入的所有类将一次性全部导入。

 

4.3 ImportSelector

这种导入方式需要实现 ImportSelector 接口:

publicclassAImportSelectorimplementsImportSelector{
    privatestaticfinal String CLASS_NAME = "com.demo.cache.service.A";

    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        returnnew String[]{CLASS_NAME};
    }
}

@Import(AImportSelector.class)
@Configuration
publicclassTestConfiguration{
}

这种方法的优点是 selectImports 方法返回一个数组,这意味着可以非常方便的导入多个类。

4.4 ImportBeanDefinitionRegistrar

这种导入方式需要实现 ImportBeanDefinitionRegistrar 接口:

publicclassAImportBeanDefinitionRegistrarimplementsImportBeanDefinitionRegistrar{
    @Override
    publicvoidregisterBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry){
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(A.class);
        registry.registerBeanDefinition("a", rootBeanDefinition);
    }
}

@Import(AImportBeanDefinitionRegistrar.class)
@Configuration
publicclassTestConfiguration{
}
http://www.gsyq.cn/news/1443283.html

相关文章:

  • 告别环境冲突:用Anaconda虚拟环境为你的TensorFlow和JAX项目创建独立沙盒
  • TTP223电容触摸传感器:从原理到PCB设计的完整实战指南
  • 3分钟搞定B站缓存视频转换:m4s-converter完整使用教程
  • 逻辑代数基础:数字世界的语言
  • 2026必看:东莞甲醛检测治理公司推荐|专业靠谱选东莞佰家环保科技有限公司,技术口碑双在线 - 专注室内空气检测治理
  • 2026学生降AIGC软件盘点:省时省力+高分适配哪家强?
  • 从AI决策到万物互联:技术趋势的商业落地与个人应对策略
  • 基于ESP32与LoRa的探空气球数据采集系统:从硬件设计到实战部署
  • Core ML与Watson混合AI架构:打造智能移动应用的新范式
  • 别再只盯着手机了!聊聊HarmonyOS的微内核和Android的宏内核,到底谁更适合你的IoT项目?
  • 别再忍受‘假外观’了!手把手教你用Blender调整Livox Mid-360在Gazebo中的3D模型尺寸
  • 口碑最好的AI论文网站推荐(从开题选题到定稿排版全流程)适合全体毕业生
  • 【Sora 2家具设计视频实战指南】:20年AI+家居工程师亲授5大避坑法则与3类高转化脚本模板
  • 从一次HTTPS拦截调试说起:深度解读浏览器SSL证书验证逻辑与ERR_CERT_COMMON_NAME_INVALID的根源
  • FPGA加速神经网络推理:SNL框架与Auto-SNL工具链解析
  • 基于Arduino与树莓派的室内空气质量监测系统全栈开发指南
  • Redis学习第二篇
  • MobileNetV3配置优化指南:如何调整YAML参数获得最佳训练效果
  • KMS_VL_ALL_AIO:企业级批量许可激活解决方案的技术架构与实践指南
  • Win11Debloat:Windows系统终极优化工具,让你的电脑焕然一新
  • AI英语口语APP定制开发方案
  • 传统整理必须分类规整,编写随性生活整理程序,按照使用习惯整理,拒绝刻板分类收纳。
  • 从A2L文件到数据采集:深入理解XCP协议中DAQ命令配置与优化技巧
  • 2026树洞平台全榜单:隐私安全、陪伴质量、价格透明度三重测评 - 时时资讯
  • 【Vue知识点总结】Watch(监听器)
  • 深度解析Sunshine开源游戏串流架构:构建高性能自托管游戏云的技术实现
  • 2026汕头卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房漏水 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 企业资讯
  • 04|精准测试平台的数据存储:MySQL、Redis、Elasticsearch 怎么分工?
  • Promise 与 Async Await 深度解析
  • Chinese-LLaMA-2-7B与原始Llama-2对比:中文理解能力提升分析