美文网首页
@EnableXX原理

@EnableXX原理

作者: 疯子92 | 来源:发表于2019-06-19 16:46 被阅读0次

    先说AutoConfigure

    引入了相关的依赖,就自动配置或者注册一些相关的Bean到容器内,而不需要我手动ComponentSacn这些第三方的包路径,也不想知道具体该用哪些,而是希望类库的提供者已经编写好了"spring.xml"或者@Configuration注解的一个入口配置

    具体实现就是需要自动配置的类库META-INF/spring.factories这个文件里指定了自动配置的入口类列表,典型的XXAutoConfiguration类上一般是由@Configuration + @ConditionalOnBean + @Import

    Auto有时候太暴力,希望能手动开启

    我不想因为我引了一个jar给我注入了一些我可能并不知道或者用不到的Bean或者配置信息,拿回我自己的控制权,所以需要有一个开关来供我选择。

    如何实现开关的效果

    @Condition以及相关的复合注解可以实现满足某个条件(比如我要求容器内必须有某个类型的Bean,某个Class等等)才会注入

    比如某个类库依赖mysql的driver,我发现你容器内没有检测到这个driver,也就是你pom依赖配置不完整,我就不会自动配置,就算配置了也会有问题

    说白了就是所谓的开关,可能会在一个jar里,也可能是你依赖的第三方jar里。

    然后就出现了很多类似@Enable*的注解,仅仅是往容器内注册了一些相关的Bean,为了满足AutoConfigure的触发条件

    看个具体例子

    我们常见的配置中心、注册中心的服务程序都是一个模式,比如:
    @EnableConfigServer
    @EnableEurekaServer

    比如 @EnableConfigServer 的源码:
    
    @Import(ConfigServerConfiguration.class)
    
    public @interface EnableConfigServer {
    
    }
    
    他引入的ConfigServerConfiguration类源码:
    
    @Configuration
    public class ConfigServerConfiguration {
       
        @Bean
        public Marker enableConfigServerMarker() {
            return new Marker();
        }
        class Marker {
        }
    }
    

    这种Marker类没有任何实质的主体,就是单纯一个实现开关的效果。

    对应的自动配置类:

    @Configuration
    
    @ConditionalOnBean(ConfigServerConfiguration.Marker.class)
    
    @EnableConfigurationProperties(ConfigServerProperties.class)
    
    @Import({ EnvironmentRepositoryConfiguration.class...})
    
    public class ConfigServerAutoConfiguration {
    
    }
    

    总结

    @EnableAutoConfiguration 开启了自动配置的功能

    @EnableXX 开启了具体某个类库提供的功能,满足了@XXAutoConfiguration上的Condition触发条件

    相关文章

      网友评论

          本文标题:@EnableXX原理

          本文链接:https://www.haomeiwen.com/subject/ewbkqctx.html