Spring Boot——自动配置
目录
1.bean加载方式
1.1XML方式声明bean
1.2 xml + 注解方式声明bean
1.3通过@Configuration和@Bean
1.4使用@Import注解
1.5使用上下文对象在容器初始化完毕后注入bean
1.6使用ImportSelector接口
1.7实现ImportBeanDefinitionRegistrar接口
1.8bean加载方式(八)
总结
2.bean加载控制
3.bean依赖属性配置
4.自动配置原理
4.1具体源码分析
5.变更自动配置
1.bean加载方式
1.1XML方式声明bean
要注意创建对象会调用它的无参构造方法!
这种定义很繁琐,所以spring为我们提供了使用注解的方式来配置!
1.2 xml + 注解方式声明bean
对于本地的bean使用注解@Component及其衍生注解@Controller,@Service,@Repository定义bean
使用@Bean定义第三方bean,并将其所在类定义为配置类或bean
1.3通过@Configuration和@Bean
- 类上加@Component
- 结合组件扫描器
加上@Configuration注解,其实就是加上@Component注解!
3.1.bean的加载方式——扩展
初始化实现FactoryBean接口的类,实现对bean加载到容器之前的批处理操作
3.2.bean的加载方式——扩展2
加载配置类并加载配置文件(系统迁移)
3.3bean的加载方式——扩展3
使用proxyBeanMethods=true可以保证嗲用此方法得到的对象是从容器中获取的而不是重新创建的
1.4使用@Import注解
使用@Import注解导入要注入的bean对象的字节码
而且定义进来的bean的名称是全路径类名名称
次形式可以有效降低源代码于spring技术的耦合度,在spring技术底层及诸多框架的整合中大量使用
使用@import注解导入配置类
1.5使用上下文对象在容器初始化完毕后注入bean
平时开发不常用,但是平时要做一些框架可能会用到
1.6使用ImportSelector接口
平时使用的很少但是在框架内大量使用
导入实现了ImportSelector接口的类,实现对导入源的编程式处理
1.7实现ImportBeanDefinitionRegistrar接口
导ImBeanDefinitionRegistrar接口的类,通过BeanDefinition的注册器注册实名bean,实现对容器中bean的裁定,例如对现有bean的覆盖,进而达成不修改源代码的情况下更换实现的效果
1.8bean加载方式(八)
导入实现了BeanDefinitionRegistryPostProcessor接口的类,通过BeanDefinition的注册器注册实名bean,实现对容器中bean的最终裁定。
总结
2.bean加载控制
bean的加载控制指根据特定情况对bean进行选择性加载以达到适用于项目的目标。
1.编程式
根据任意条件确认是否加载bean
每出现一种情况就要做一种判断,很复杂,需要优化。
2.注解式
匹配指定环境
加载一个bean利用环境上的特征来控制它加载与不加载
3.bean依赖属性配置
将业务功能bean运行需要的资源抽取成独立的属性类(****Properties)设置读取配置文件信息
配置文件中使用固定格式为属性类注入数据
定义业务功能bean,通常使用@Import导入,解耦强制加载bean
使用@EnableConfigurationProperties注解设定使用属性类时加载bean
- 1.业务bean的属性可以为其设定默认值
- 2.当需要设置时通过配置文件传递属性
- 3.业务bean应尽量比卖你设置强制加载,而是根据需要导入后加载,降低spring容器管理bean的强度
4.自动配置原理
自动配置过程:
- 1.收集Spring开发者的编程习惯,整理开发过程使用的常用技术列表->(技术集A)
- 2.收集常用技术(技术A)的使用参数,整理开发过程中每个技术的常用设置列表(设置集B)
- 3.初始化Springboot基础环境,加载用户自定义的bean和导入的其他坐标,形成初始化环境
- 4.将技术集A包含的所有技术都定义出来,在spring/springboot启动时默认全部加载
- 5.将技术集A中具有使用条件的技术约定出来,设置成按条件加载,由默认开发者决定是否使用该技术(与初始化环境对比)
- 6.将设置集B作为默认配置加载(约定大于配置),减少开发者配置工作量
- 7.开放设置集B的配置覆盖接口,由开发者根据自身需要决定是否覆盖默认配置
4.1具体源码分析
Spring Boot自动配置的核心注解是@SpringBootApplication,该注解是spring boot的启动类注解,它是一个复合注解,里面包含:
1)@SpringBootConfiguration:该注解上有一个 @Configuration注解,表示这个spring boot启动类是一个配置类,最终要被注入到spring容器中。
2)@EnableAutoConfiguration:表示开启自动配置,它也是一个复合注解,里面包含:
① @AutoConfigurationPackage,该注解上有一个@Import(AutoConfigurationPackages.Registrar.class)注解,会将启动类所在包的包名添加到注册器registrar中。其中 Registrar 类的作用是将启动类所在包下的所有子包的组件扫描注入到spring容器中。
② @Import(AutoConfigurationImportSelector.class):其中AutoConfigurationImportSelector类中有一个getCandidateConfigurations()方法,该方法通过SpringFactoriesLoader.loadFactoryNames()方法查找位于META-INF/spring.factories文件中的所有自动配置类,并加载这些类。
spring.factories文件是以key-value键值对的形式存储文件里,其中有一个key=EnableAutoConfiguration,它对应的value值就是一个个以AutoConfiguration结尾来命名的 xxxAutoConfiguration 自动配置类。
所以spring boot在整个的启动过程中,其实就是在类路径的META-INF/spring.factories 文件中找到EnableAutoConfiguration对应的所有的自动配置类,然后将所有自动配置类加载到spring容器中。
5.变更自动配置
1.自定义自动配置(META-INF/spring.factories)
2.控制SpringBoot内置自动配置类加载
变更自动配置:去除tomcat自动配置(条件激活),添加jetty自动配置(条件激活)
总结: