@SpringBootApplication作为springboot项目启动类上的注解,尤为重要。
点开源码我们可以看出其包含了7个注解,我们着重了解@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
@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 {}
@SpringBootConfiguration:其实就是@Configuration;@Configuration是spring3.0的一个注解,用来代替applicationContext.xml文件,和@Bean配合使用,用于修饰配置类,将@Bean下的方法、对象等注册为IOC容器中的bean;(还记得以前的项目中用xml配置文件中的标签来配置所需要用到的bean,这里的注解是以JavaConfig的方式配置bean)。
@EnableAutoConfiguration:这个注解比较陌生,但是看其命名Enable(可以)Auto(自动)Configuration(配置);这个注解集中体现了Springboot的优势:自动配置;@EnableAutoConfiguration借助其内部的@Import(AutoConfigurationImportSelector),AutoConfigurationImportSelector类中有selectImports()方法,通过SpringFactoriesLoader来读取spring-boot-autoconfigure包下的META-INF/spring.factories,收集文件中的key,而作为key的这些类,则由@Configuration和@ConditionalOnXXX来将该bean加载到IOC容器中;这就是为什么项目中一些对象不用我们自己去注册或者编写配置类:例如:JdbcTemplate可以直接使用(在以前的spring项目中,还记得我们要在xml文件中配置数据源生成bean吗);RabbitTemplate等等都是这个道理。
@ComponentScan:这个注解大家比较熟悉了,自动扫描并且加载符合条件的组件,最终将这些bean加载到Ioc容器中;一般情况下放在项目根下面保证能扫描到项目中所有的包;细粒度控制使用basePackages属性即可。
上面只是关于该注解最基本的认识和理解,要深究的话最好研究一下springboot项目的启动原理,能更好的理解springboot。