@Autowired注入原则

前提:了解@Autowired的用处和用法:http://blog.csdn.net/heyutao007/article/details/5981555

@Autowired默认是按照byType进行注入的,但是当byType方式找到了多个符合的bean,又是怎么处理的?Autowired默认先按byType,如果发现找到多个bean,则又按照byName方式比对,如果还有多个,则报出异常。

例子:
@Autowired
private Car redCar;
1. spring先找类型为Car的bean
2. 如果存在且唯一,则OK;
3. 如果不唯一,在结果集里,寻找name为redCar的bean。因为bean的name有唯一性,所以,到这里应该能确定是否存在满足要求的bean了
@Autowired也可以手动指定按照byName方式注入,使用@Qualifier标签,例如:
@Autowired()
@Qualifier("baseDao" )
因为bean的name具有唯一性,理论上是byName会快一点,但spring默认使用byType的方式注入。另外补充一点:@Resource(这个注解属于J2EE的)的标签,默认是按照byName方式注入的。
### Spring `@Autowired` 注解的功能与使用场景 #### 功能概述 `@Autowired` 是 Spring 框架中的核心注解之一,用于实现依赖注入(Dependency Injection)。通过该注解可以简化配置文件的编写工作量并提高代码灵活性。当应用上下文中存在多个候选 Bean 时,Spring 将依据类型匹配原则自动完成对象间的关联关系建立。 - **默认必需属性**:除非特别指定,否则被标记为 `@Autowired` 的字段或参数均被认为是必要的,即容器会尝试寻找相匹配类型的单个 bean 并将其注入到目标位置;如果找不到合适的bean,则抛出异常[^2]。 - **可选注入支持**:可以通过设置 `required=false` 来允许不存在对应bean的情况下不报错继续执行程序逻辑。 #### 使用场景详解 ##### 构造器注入 推荐的方式是在类定义中利用构造函数来进行强制性的依赖项初始化操作。这种方式能够确保所有需要的对象都在创建实例之前就被正确赋值,并且有助于单元测试工作的开展[^3]: ```java public class MyClass { private final MyDependency dependency; @Autowired public MyClass(MyDependency dependency) { this.dependency = dependency; } } ``` ##### 属性(成员变量)注入 对于某些简单情形下可以直接作用于私有域上以减少样板代码数量。不过需要注意的是这种做法不利于后期维护以及mock替换成其他模拟数据源进行调试验证等活动: ```java @Component class SomeClass { @Autowired private AnotherBean anotherBean; // ... } ``` ##### Setter 方法注入 提供了一种较为传统的 setter-based DI 方式,在特定条件下可能更易于理解和接受。特别是针对遗留项目改造升级过程中保持原有编码风格一致性方面具有一定优势: ```java @Service static class YetAnotherService { private transient ThirdPartyAPI apiClient; @Autowired void setApiClient(final ThirdPartyAPI client){ this.apiClient=client; } //... } ``` ##### 普通方法注入 除了上述三种常见形式外还支持任意非静态普通成员函数作为切入点来接收外部传入的服务接口或者工具组件等资源实体: ```java @Configuration class AppConfig { @Autowired void configure(@Qualifier("primaryDataSource") DataSource ds, EntityManagerFactory emf) { // Initialization logic here. } } ``` #### 官方文档解释 官方文档指出,`@Autowired` 可应用于构造函数、setter 方法以及其他带有参数的方法之上。为了保证最佳实践效果建议优先考虑基于构造器的形式因为其具备更好的不可变性和清晰度特性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值