@SpringBootApplication
这个注解主要由三个子注解组成:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@SpringBootConfiguration
这个注解包含了@Configuration,@Configuration里面又包含了一个@Component注解,也就是说,这个注解标注在哪个类上,就表示当前这个类是一个配置类,而配置类也是spring容器中的组件
@Configuration
- 用过的都知道@configuration的作用是什么。它是让我们能够去注册一些额外的Bean,并且导入一些额外的配置。@Configuration还有一个作用就是把该类变成一个配置类,不需要额外的XML进行配置。所以@SpringBootConfiguration就相当于@Configuration。说白了,以前的xml配置。在springboot中我们用打上@configuration这个注解的类来代替。
@Configuration并不是一个新的注解,在Spring3.0时已经存在了。@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
注意:@Configuration注解的配置类有如下要求:
- @Configuration不可以是final类型;
- @Configuration不可以是匿名类;
- 嵌套的configuration必须是静态类。
@Configuration用法:
用@Configuration加载spring
@Configuration配置spring并启动spring容器
@Configuration启动容器+@Bean注册Bean
@Configuration启动容器+@Component注册Bean使用 AnnotationConfigApplicationContext 注册 AppContext 类的两种方法配置Web应用程序(web.xml中配置AnnotationConfigApplicationContext)
2.组合多个配置类
在@configuration中引入spring的xml配置文件在
@configuration中引入其它注解配置
@configuration嵌套(嵌套的Configuration必须是静态类)
3.@EnableXXX注解
4.@Profile逻辑组配置
5.使用外部变量
@ConfigurationProperties
在全局配置的属性如:server.port等,通过@ConfigurationProperties注解,绑定到对应的XxxxProperties配置实体类上封装为一个bean,然后再通过@EnableConfigurationProperties注解导入到Spring容器中。
@Conditional
@Conditional是spring4就提供出来的基于条件的注解。该注解可以根据是否满足某一个特定条件来决定是否创建某个特定的Bean。
比如可以通过@Conditional注解来实现只有当某个Bean被已创建时(存在时)才会创建另外一个Bean,这样就可以依据这一特定的条件来控制Bean的创建行为,这样的话我们就可以利用这样一个特性来实现一些自动的配置。
@Conditional是springboot实现自动配置的关键基础能力。在此基础上,springboot又创建了多个适用于不同场景的组合条件注解。
@ConditionalOnBean:当上下文中有指定Bean的条件下进行实例化。@ConditionalOnMissingBean:当上下文没有指定Bean的条件下进行实例化。@ConditionalOnClass:当classpath类路径下有指定类的条件下进行实例化。@ConditionalOnMissingClass:当类路径下没有指定类的条件下进行实例化。@ConditionalOnWebApplication:当项目本身是一个Web项目时进行实例化。@ConditionalOnNotWebApplication:当项目本身不是一个Web项目时进行实例化。@ConditionalOnProperty:当指定的属性有指定的值时进行实例化。@ConditionalOnExpression:基于SpEL表达式的条件判断。@ConditionalOnJava:当JVM版本为指定的版本范围时进行实例化。@ConditionalOnResource:当类路径下有指定的资源时进行实例化。@ConditionalOnJndi:在JNDI存在时触发实例化。@ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化。具体用法还要具体查看文档或源码
@EnableAutoConfiguration
@EnableAutoConfiguration注解。开启自动配置。主要作用就是让你自动去配置,但并不是所有都是创建好的,是根据你程序去进行决定。
@Import(AutoConfigurationImportSelector.class)AutoConfigurationImportSelector最终是要加载所在jar下的META-INF/spring.factories文件。
打开自动配置功能,也可以关闭某个指定的自动配置选项如关闭数据源自动配置功能:@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。
@ComponentScan
Spring扫描组件。这个注解大家应该都不陌生,扫描包,放入spring容器,那他在springboot当中作用就仅是扫描包那么简单吗?,这个注解要结合SpringBootConfiguration去使用,能选择性的加载需要的类。而不是全部加载。因为内存是有限的。相当于做了一些优化。
@AutoConfigurationPackage
@AutoConfigurationPackage:让包中的类以及子包中的类能够被自动扫描到spring容器中。
@Import
- AutoConfigurationImportSelector的selectImports()方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包。spring-boot-autoconfigure-x.x.x.x.jar里就有一个这样的spring.factories文件。
- 这个@EnableAutoConfiguration注解通过@SpringBootApplication被间接的标记在了Spring Boot的启动类上。在SpringApplication.run(…)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。
@Import(AutoConfigurationImportSelector.class):这个是自动配置的核心,我们说自动配置,那他到底帮我们配置了什么,怎么配置的?我们就来看看这个注解:
这里可以看到它实现了好多接口。在之前版版本,AutoConfigurationImportSelector这个类叫EnableAutoConfigurationImportSelector。
之前我们进去看,他是继承了 AutoConfigurationImportSelector,这个类。
但是2.1.1以上版本。
就直接是AutoConfigurationImportSelector而不是EnableAutoConfigurationImportSelector。
我们重点看一里面的一个方法:内容较多
方法名是 selectImports
这个类会帮你扫描那些类自动去添加到程序当中。我们可以看到getCandidateConfigurations()这个方法,他的作用就是引入系统已经加载好的一些类,
这个类回去寻找的一个目录为META-INF/spring.factories,也就是说他帮你加载让你去使用也就是在这个META-INF/spring.factories目录装配的。