注解
0.@SpringBootApplication
首先标注在主类上的注解,其实是由以下三个注解构成
@SpringBootConfiguration:
代表Main程序实际也是一个核心配置类
@ComponentScan:
包扫描,默认是主类文件夹内的包及以下
@EnableAutoConfiguration:
由以下两个注解构成
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
@AutoConfigurationPackage
@Import({Registrar.class})
public @interface AutoConfigurationPackage {}
// 利用Registrar给容器中导入一系列组件
// 将指定的一个包(主类MainApplication所在的包)下的所有组件导入进来
@Import({AutoConfigurationImportSelector.class})
1.利用getAutoConfigurationEntry(annotationMetadata);给容器批量导入组件
2.利用List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取到所有需要导入到IOC容器中的类名
3.利用工厂加载 Map<String, List<String>> loadSpringFactories(ClassLoader classLoader);得到所有的组件
private static Map<String, List<String>> loadSpringFactories(ClassLoader classLoader) {
……
Enumeration urls = classLoader.getResources("META-INF/spring.factories");
……
}
最终发现,在spring-boot-autoconfigure-2.5.5.jar
的META-INF/spring.factories
文件内,写死了所有springboot启动时要给容器中加载的所有配置类
虽然是默认全部加载所有场景的配置类,但是最后springboot会进行按需加载,原因就是这些配置类中用了大量的@Conditional注解进行条件装配,在我们没有导入场景相关的starter包时,这些配置类就不会生效,也就实现了按需注册了。
总结:
- SpringBoot先加载所有的自动配置类,xxxxAutoConfiguration
- 每个自动配置类按照条件进行生效,more都会把固定配置文件指定的值从xxxxProperties中拿。xxxxProperties和配置文件(application.properties)进行了绑定。
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有这些组件, 就相当于有这些功能了
- 定制化配置
-
- 用户直接自己@Bean替换底层的组件
-
- 用户去看这个组件是与哪个prefix的前缀在application.properties配置文件进行了字段绑定,修改之。
1.@Configuration
在Spring中经常会使用xml配置去注册容器里的类,使用@Configuration可以直接标注在类上,使一个类变为配置类,然后@Bean标注在类中的方法上,方法名就是实例名,方法返回值就是实例的类型。
Tips:@Configuration(proxyBeanMethods = true)是默认使用代理注册配置类对象,这样配置类里的实例就会是单例模式。proxyBeanMethods = false的话则没有规则使得@Bean成为单例。
2.@Import
可以标注在配置类上,@Import({User.class})这样就会调用类的无参构造器注入一个实例到容器内。
3.@Conditional
条件装配,当满足指定条件时,进行注册或者相关功能
比如@ConditionalOnBean,当容器中有某个Bean时,才进行操作。
4.@ImportResource(“classpath:beans.xml”)
写的位置:随便一个配置类上
作用:导入根路径下beans.xml里的内容注册进容器,相当于兼容了一下旧版本。
5.@ConfigurationProperties
作用:使用Java读取properties文件的内容,并把它封装到JavaBean中,以便使用。
在类名上标注,然后写好前缀去匹配配置文件中的属性
最后要把Car注册到IOC容器中(两种方法),才能享受到自动绑定属性
1.Car上加@Component注解(自己写的类)
2.随便一个配置类上使用@EnableConfigurationProperties注解指定Car.class(可用在第三方类上)
然后随便去哪个组件下自动注入
再输出,会发现已经把属性绑定好了,Car{brand=‘BYD’, color=‘red’}