一、自动装箱流程图(关键注解)
二、SpringBoot中常用到的注解说明
@Configuration
`表名这是一个配置类,将会被注入到容器中,等同于先前使用的xml配置文件。
@Configuration有一个属性,proxyBeanMethods = true,默认属性为true,即被@Configuration注解的类在spring容器中被CGLIB代理,如果在配置类中用@Bean注解标注的方法或属性,在外部被多次调用,那多次调用到的也是同一个对象(单例的)。
相反,如果proxyBeanMethods = false,那么在配置类中的bean对象不再是单实例,如果多次调用的话,那么会产生多个实例对象。
组件依赖:如果配置类中的多个bean示例之间有相互的依赖的关系,proxyBeanMethods 就应该设置为true,可以保证容器中单例,唯一。
@Bean、@Component、@Controller、@Service、@Repository
这些是我们常用到的将bean注入到容器中的注解。
@ComponentScan、@Import
@ComponentScan:包扫描
@Import:
作用在容器中的组件相关的类上(即添加了@Configuration、@Component等等表示这是一个组件)
作用:导入相关的实体类,创建对应的Bean对象。@Import可以导入内部的Class,也可以导入第三方外部引入的Class.默认组件的名字就是全类名。
@Conditional:条件装配,满足相应的条件则装配进容器;
例如:@ConditionalOnBean 容器中有某个实例时,类中或者是对应的方法中的实例才会被注册。
@ImportResource:原生配置文件引入,导入xml配置文件,将配置文件中的bean实例添加进容器。
@ConfigurantionProperties配置绑定
配置绑定这里说两种方式:
方式一:
@ConfigurationProperties(prefix = "") + @Component
@Component注解表示这个类会被注入到容器中;
@ConfigurationProperties将开启属性和配置文件绑定,并且在配置文件中的前缀是prefix中的内容;
方式二:
@EnableConfigurationProperties(T.Class) + @ConfigurationProperties(prefix = "")
@ConfigurationProperties(prefix = "")表示这个类和配置文件绑定,在属性对应的类上面;
@EnableConfigurationProperties(T.Class)在配置类上面,作用有二:一、开启类的自定绑定;二、把这个组件注入到容器中;
三、自动配置原理
SpringBoot的主启动类上面有一个@SpringBootApplication注解,这个注解涵盖了springBoot自动装配的核心思想。
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@SpringBootApplication这个注解里面核心是这三个注解:
- @SpringBootConfiguration:表名这是一个配置类
- @Component:指明了包扫描路径
- @EnableAutoConfiguration:里面有2个注解:
@AutoConfigurationPackage @Import({AutoConfigurationImportSelector.class}) public @interface EnableAutoConfiguration {
@AutoConfigurationPackage:它里面是这样的:是一个@Import组件,导入一系列组件,将主启动类所在的包下的所有组件导进来;
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
// 利用Registrar给容器中导入一系列组件;
// 将指定的包下的所有组件导入进来。这个包指的就是主启动类所在的包。
@EnableAutoConfiguration注解中另外一个注解:@Import({AutoConfigurationImportSelector.class}) :
// 1、利用AutoConfigurationImportSelector中的selectImports()方法选择导入一些组件;
// 2、AutoConfigurationImportSelector中的getCandidateConfigurations来获取所有候选的配置类;
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
// 3、getCandidateConfigurations方法是通过SpringFactoriesLoader.loadFactoryNames来加载,loadSpringFactories方法中可以加载出所有的所有的组件
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
// 4、扫描META-INF/spring.factories文件,得到所有需要加载的文件;扫描得到的就是spring.factories文件中EnableAutoConfiguration下的文件名;
在SpringBoot项目启动的时候,在启动tomcat的时候,会自动扫描SpringBootjar包下的META-INF/spring.factories下的文件,得到其中的auto Configure配置文件的名称:
按需开启自动配置项:
springboot启动的时候上面会扫描达到所有的配置文件中的127个组件,但是最终会按需条件装配,按需装配;
例如下面AspectJAutoProxyingConfiguration要想被装配进IOC容器,需要满足@ConditionalOnClass的条件才会被装载进容器;
@ConditionalOnClass({Advice.class})
static class AspectJAutoProxyingConfiguration {
AspectJAutoProxyingConfiguration() {
}
可以简单的总结为一下几点:
1、SpringBoot会首先加载所有的自动配置类;xxxxAutoConfiguration
2、每个自动配置类会按照条件生效,而且会默认绑定配置文件指定的值;xxxxProperties文件里面获取
3、生效的配置类会在容器中装配很多生效的组件
4、只要容器中有这些组件,就相当于具备了这些功能
5、如果用户自定义了,则以用户自定义的优先