当前位置: 首页 > 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.jsqmd.com/news/931949/

相关文章:

  • QKeyMapper终极指南:Windows游戏手柄键盘映射工具完整使用教程
  • 告别环境冲突:用Anaconda虚拟环境为你的TensorFlow和JAX项目创建独立沙盒
  • 2026年深圳家居消费场景下各轻高定全屋定制品牌多维度解析 - 产品测评官
  • 告别懵圈!图文详解DALI曼彻斯特编码:从波形到代码的完整解码逻辑
  • 高效微信好友关系检测工具:智能识别单向好友,保护社交网络真实性
  • 2026香港卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房漏水 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 企业资讯
  • 保姆级教程:用Python+OpenCV+pupil_apriltags库,5分钟搞定摄像头实时识别Apriltag二维码
  • TTP223电容触摸传感器:从原理到PCB设计的完整实战指南
  • 有了AI帮忙,你的工作积极性会更高吗?
  • 用香蕉皮制作生物电池驱动时钟:DIY电化学实验与可持续能源探索
  • Prometheus Pushgetway详解
  • 3分钟搞定B站缓存视频转换:m4s-converter完整使用教程
  • 逻辑代数基础:数字世界的语言
  • 打破数据孤岛,聚英云平台打造一体化数据分析系统
  • 基于ESP8266的40Hz伽马波光刺激器DIY:从脑波夹带原理到物联网硬件实现
  • 手把手教你搞定反激电源的‘顽疾’:从漏感震荡到准谐振,实测RCD与齐纳钳位怎么选
  • AI如何优化科学传播:从文本简化到公众信任的实证研究
  • 2026必看:东莞甲醛检测治理公司推荐|专业靠谱选东莞佰家环保科技有限公司,技术口碑双在线 - 专注室内空气检测治理
  • Haskell依赖类型实现TensorFlow张量操作编译时维度安全
  • 2026浮子流量计国产品牌综合实力权威排名及深度选型指南 - 水质仪表品牌排行榜
  • 3步解锁屏幕翻译黑科技:Translumo带你打破语言壁垒
  • UnityExplorer深度指南:如何成为Unity游戏调试与修改的专家?
  • ScottPlot实战:在WPF中打造一个实时监控仪表盘(CPU/内存/网络流量动态曲线)
  • 基于ESP32与LoRa的探空气球数据采集系统:从硬件设计到实战部署
  • 别再傻傻分不清了!用Python代码实战演示KNN分类和K-means聚类的核心区别
  • 2026学生降AIGC软件盘点:省时省力+高分适配哪家强?
  • 从AI决策到万物互联:技术趋势的商业落地与个人应对策略
  • Qt5.15项目里QWebEngine加载网页慢到超时?别急着改源码,先试试这个Windows证书策略
  • 【Sora 2展厅制作倒计时72小时】:错过本次RTX 6000 Ada驱动更新窗口,将永久丧失光线追踪反射层级支持
  • RoundedTB:解锁Windows任务栏现代化美学的终极实战手册