zoukankan      html  css  js  c++  java
  • 建立METAINF/spring.factories文件的意义何在

    平常我们如何将Bean注入到容器当中

    @Configuration
    @EnableConfigurationProperties(HelloProperties.class)
    public class HelloServiceAutoConfiguration {
    
        @Autowired
        HelloProperties helloProperties;
    
        @Bean
        public HelloService helloService() {
            HelloService service = new HelloService();
            service.setHelloProperties( helloProperties  );
            return service;
        }
    }

    一般就建立配置文件使用@Configuration,里面通过@Bean进行加载bean

    或者使用@Compont注解在类上进行类的注入

    注意:

    在我们主程序入口的时候:

    @SpringBootApplication这个注解里面的东西

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
            @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
    public @interface SpringBootApplication {

    里面注解@EnableAutoConfiguration

    @ComponentScan注解指扫描@SpringBootApplication注解的入口程序类所在的basepackage下的

    所有带有@Component注解的bean,从而注入到容器当中。

    但是

    如果是加入maven坐标依赖的jar包,就是项目根目录以外的Bean是怎么添加的??

    这个时候注解@EnableAutoConfiguration的作用就来了

    导入了AutoConfigurationImportSelector这个类:

    这个类里面有一个方法

        /**
         * Return the auto-configuration class names that should be considered. By default
         * this method will load candidates using {@link SpringFactoriesLoader} with
         * {@link #getSpringFactoriesLoaderFactoryClass()}.
         * @param metadata the source metadata
         * @param attributes the {@link #getAttributes(AnnotationMetadata) annotation
         * attributes}
         * @return a list of candidate configurations
         */
        protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
            List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
                    getBeanClassLoader());
            Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
                    + "are using a custom packaging, make sure that file is correct.");
            return configurations;
        }

    @EnableAutoConfiguration注解来注册项目包外的bean。而spring.factories文件,则是用来记录项目包外需要注册的bean类名

    为什么需要spring.factories文件,
    因为我们整个项目里面的入口文件只会扫描整个项目里面下的@Compont @Configuration等注解
    但是如果我们是引用了其他jar包,而其他jar包只有@Bean或者@Compont等注解,是不会扫描到的。
    除非你引入的jar包没有Bean加载到容器当中
    所以我们是通过写/META-INF/spring.factories文件去进行加载的。
  • 相关阅读:
    BZOJ1316 树上的询问
    BZOJ2599 IOI2011Race
    BZOJ2594 [Wc2006]水管局长数据加强版
    BZOJ3052 [wc2013] 糖果公园 【树上莫队】
    BZOJ4530 BJOI 2014 大融合
    QTREEⅠ SPOJ
    BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]
    BZOJ3669 NOI2014魔法森林
    BZOJ2002 弹飞绵羊
    BZOJ1878 [SDOI2009]HH的项链
  • 原文地址:https://www.cnblogs.com/java-quan/p/13643041.html
Copyright © 2011-2022 走看看