侧边栏壁纸
博主头像
秋之牧云博主等级

怀璧慎显,博识谨言。

  • 累计撰写 67 篇文章
  • 累计创建 41 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

@EnableXxx注解的原理

秋之牧云
2024-07-13 / 0 评论 / 0 点赞 / 65 阅读 / 2956 字

@EnableXxx 类型的注解在 Spring 和 Spring Boot 中非常常见,它们主要用于激活或启用特定的功能或配置。这些注解的原理主要基于 Spring 的 @Import 注解和 Spring 的配置类处理机制。

原理概览

  1. @Import 注解: 当一个类上标注了 @Import 注解,它告诉 Spring 容器需要导入额外的配置类或 Bean 定义。@Import 可以接受一个或多个类名作为参数,Spring 会自动将这些类作为配置类加载,从而注册这些类中定义的所有 Bean。

  2. @EnableXxx 注解: 大多数 @EnableXxx 注解最终会通过 @Import 导入一个或多个特定的配置类。这些配置类负责注册与特定功能相关的 Bean,例如连接池、模板引擎、过滤器、拦截器、监听器等。

  3. ConfigurationClassPostProcessor: Spring 的 ConfigurationClassPostProcessor 是一个 Bean 后处理器,它会在 Spring 容器初始化过程中运行,负责解析带有 @Configuration 注解的类,以及处理 @Import 和其他元注解。ConfigurationClassPostProcessor 会读取 @Import 注解并注册相应的 Bean 定义。

举例一:导入配置类

假设有一个 @EnableCaching 注解,它用于启用缓存支持。这个注解的实现可能是这样的:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(CacheConfiguration.class)
public @interface EnableCaching {

    // 可能的自定义属性
    String[] cacheNames() default {};
}

这里的 @Import(CacheConfiguration.class) 表示 @EnableCaching 注解会导入 CacheConfiguration 类。CacheConfiguration 类则可能是一个配置类,如下所示:

@Configuration
public class CacheConfiguration {

    @Bean
    public CacheManager cacheManager() {
        // 创建并返回 CacheManager 的实现
    }

    @Bean
    public CacheAdvisor cacheAdvisor(CacheManager cacheManager) {
        // 创建并返回 CacheAdvisor 的实现,它会使用上面的 CacheManager
    }
}

在这个例子中,CacheConfiguration 类注册了 CacheManagerCacheAdvisor,这些都是 Spring 缓存功能的关键组件。

举例二:导入自定义注解

二/三方包的自定义注解不生效(原因是扫包扫不到),如何才能生效,可以添加扫包路径,或者定义一个下面这样的注解,使用@Import({XxxAop.class})将自定义注解的切面(注解解析类)导进来,然后再将EnableXxx注解添加到SpringBoot启动类上。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({XxxAop.class})
public @interface EnableXxx {

}

总结

@EnableXxx 注解的原理主要是通过 @Import 注解来导入配置类,这些配置类负责注册与特定功能相关的 Bean。通过这种方式,Spring Boot 能够自动配置复杂的功能,而无需用户手动编写大量的配置代码。这种机制大大简化了开发过程,使得开发人员可以专注于业务逻辑而非底层配置。

0

评论区