认识@SpringBootApplication注解
我们把@SpringBootApplication点进去发现有一下几个注解:
主要由是 @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan 三个注解的复合
下面分表说说这三个注解:
@SpringBootConfiguration
这里的@SpringBootConfiguration我们点进去发现是@Configuration,这太熟悉了,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,
这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。本身其实也是一个IoC容器的配置类。
现在SpringBoot官方推荐使用JavaConfig的配置形式,我们基本也不用XML的形式了:
XML是这样的:
...
JavaConfig是这样的:
@Configurationpublic class TestConfiguration{ @Bean public TestService testService(){ return new TestServiceImpl(); } }
任何一个标注了@Bean的方法,其返回值将作为一个bean定义注册到Spring的IoC容器,方法名将默认成该bean定义的id。
@ComponentScan
这个注解我们也很熟悉,@ComponentScan告诉Spring 哪个packages 的用注解标识的类 会被spring自动扫描并且装入bean容器。自动扫描加载组件将这些bean定义加载到IoC容器中;
默认Spring框架实现会从声明@ComponentScan所在类的package进行扫描。所有我们要注意SpringBoot这个启动类别放错地方了。
我们写Config配置类是不是经常用到它
@EnableAutoConfiguration
重要角色出场了,我们点击进来
看出有一特殊的注解@Import,@Import(AutoConfigurationImportSelector.class),再点击AutoConfigurationImportSelector进来
看如下代码,获取类路径下spring.factories下key为EnableAutoConfiguration全限定名对应值
List configurations = getCandidateConfigurations(annotationMetadata,attributes);
继续跟进
再次跟进
是不是就发现了最终是在classpath下的读取META-INF/spring.factories文件的配置,并返回一个字符串数组。
这个外部文件,有很多自动配置的类,以上为Spring Boot中所有的自动配置相关类;在启动过程中会解析对应类配置信息,以MongoDB为例,则会去解析MongoAutoConfiguration
只有spring.boot.enableautoconfiguration为true(默认为true)的时候,才启用自动配置
@EnableAutoConfiguration还可以进行排除,排除方式有2中,一是根据class来排除(exclude),二是根据class name(excludeName)来排除
其内部实现的关键点有
1)ImportSelector 该接口的方法的返回值都会被纳入到spring容器管理中
2)SpringFactoriesLoader 该类可以从classpath中搜索所有META-INF/spring.factories配置文件,并读取配置;
SpringFactoriesLoader配合@EnableAutoConfiguration使用的话,它更多是提供一种配置查找的功能支持,即根据@EnableAutoConfiguration的完整类名org.springframework.boot.autoconfigure.EnableAutoConfiguration作为查找的Key,获取对应的一组@Configuration类
总之@EnableAutoConfiguration从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。
总结:
第一步@SpringBootConfiguration构建bean定义,
第二步@ComponentScan自动扫描加载组件将这些bean定义加载到IoC容器中,
第三步@EnableAutoConfiguration从classpath中搜索所有META-INF/spring.factories配置文件然后,将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration key对应的配置项加载到spring容器。
请大家指正!