首先标注在主类上的注解,其实是由以下三个注解构成
@SpringBootConfiguration:代表Main程序实际也是一个核心配置类@ComponentScan:
包扫描,默认是主类文件夹内的包及以下@EnableAutoConfiguration:
由以下两个注解构成 @AutoConfigurationPackage @import({AutoConfigurationimportSelector.class})@AutoConfigurationPackage
@import({Registrar.class}) public @interface AutoConfigurationPackage {} // 利用Registrar给容器中导入一系列组件 // 将指定的一个包(主类MainApplication所在的包)下的所有组件导入进来@import({AutoConfigurationimportSelector.class})
1.利用getAutoConfigurationEntry(annotationmetadata);给容器批量导入组件 2.利用Listconfigurations = this.getCandidateConfigurations(annotationmetadata, attributes);获取到所有需要导入到IOC容器中的类名 3.利用工厂加载 Map > loadSpringFactories(ClassLoader classLoader);得到所有的组件
private static Map> 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配置文件进行了字段绑定,修改之。
在Spring中经常会使用xml配置去注册容器里的类,使用@Configuration可以直接标注在类上,使一个类变为配置类,然后@Bean标注在类中的方法上,方法名就是实例名,方法返回值就是实例的类型。
Tips:@Configuration(proxyBeanMethods = true)是默认使用代理注册配置类对象,这样配置类里的实例就会是单例模式。proxyBeanMethods = false的话则没有规则使得@Bean成为单例。
2.@import可以标注在配置类上,@import({User.class})这样就会调用类的无参构造器注入一个实例到容器内。
3.@Conditional条件装配,当满足指定条件时,进行注册或者相关功能
比如@ConditionalOnBean,当容器中有某个Bean时,才进行 *** 作。
写的位置:随便一个配置类上
作用:导入根路径下beans.xml里的内容注册进容器,相当于兼容了一下旧版本。
作用:使用Java读取properties文件的内容,并把它封装到JavaBean中,以便使用。
在类名上标注,然后写好前缀去匹配配置文件中的属性
最后要把Car注册到IOC容器中(两种方法),才能享受到自动绑定属性
1.Car上加@Component注解(自己写的类)
2.随便一个配置类上使用@EnableConfigurationProperties注解指定Car.class(可用在第三方类上)
然后随便去哪个组件下自动注入
再输出,会发现已经把属性绑定好了,Car{brand=‘BYD’, color=‘red’}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)