自动装配:
Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值。
使用@AutoWired

自动装配的Bean和我们直接get的Bean是同一个(对了Bean默认是单例的啊!)

自动注入时,默认优先按照类型找到对应的组件
当同一类型有多个组件被注册,优先装配哪个呢?

配置文件:

Bean文件

测试后,发现:
有多个该类型的组件时,优先按属性名进行匹配
附:
当且仅当CarDao是单实例Bean时,可使用context.getBean(Class requiredType) T
结合@Qualifier注解,指定自动装配的bean

如果指定的bean实例可能不存在,并且允许不存在呢?
可以使用@AutoWired(required=false)
@Bean结合@Primary,指定自动装配首选bean

虽然属性名为carDaoF,但是因为首选注解,实际装配的是carDaoX
注意:@Qualifier的优先级要高于@Primary
在同时使用两个注解的情况下,优先装配Qualifier指定的bean
使用@Resource代替@AutoWired


@Resource默认按属性名称匹配
虽然在配置类中使用了@primary注解,但是@resource默认是按照属性名称匹配!
@resource 不支持 @primary注解,也不支持类似@AutoWired(required=false/true)功能

使用@Inject代替@AutoWired
需要先导入JSR330规范的javax.inject依赖
<!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
@Inject支持@Primary,但是不支持required=false
@AutoWired标注在set方法上

@AutoWired标注在有参构造函数上

@AutoWired放在参数类型前


自定义组件使用Spring容器底层接口
自定义组件实现xxxAware:在创建对象的时候,会调用接口规定的方法注入相关组件;Aware把Spring底层一些组件注入到自定义的Bean中

使用Profile动态激活和切换组件和功能

加了环境注解的Bean只有对应环境被激活时才能被注册到容器中!
使用RunConfig设置环境标志
测试结果

使用代码设置环境标志
当@Profile注解写在配置类上时
只有满足对应环境标志时,才会可能注册配置类内部组件,否则概不注册
对于没有@Profile标志的bean,任何环境下都是可以加载的,可被配置类头部环境判断否决
本文深入解析Spring框架中的依赖注入(DI)机制,包括@AutoWired、@Qualifier、@Primary等注解的使用,以及自动装配、按类型匹配、按名称匹配的原理。探讨不同注解的优先级和如何在多实例环境中指定首选Bean。
932

被折叠的 条评论
为什么被折叠?



