Spring学习笔记_13——@Autowired
@Autowired
1. 介绍
@Autowired
注解能够自动按照类型注入。
当IOC容器中有且仅有一个类型匹配时,使用@Autowired
注解可以直接注入成功。
当超过一个类型匹配时,则使用变量名称(写在方法上就是方法名称)作为Bean的id,在符合类型的多个Bean中再次进行匹配,如果能匹配上就可以注入成功。如果匹配不上,是否报错要看required属性的取值。
- 类型匹配: 默认情况下,
@Autowired
会基于类型进行自动装配。Spring 会在应用上下文中查找与目标类型相匹配的唯一 bean 来进行注入。如果找到多个相同类型的 bean,那么@Autowired
将无法决定应该注入哪一个,除非你提供了额外的信息(如使用@Qualifier
注解)来指定具体的 bean。
- 名字匹配: 如果存在多个相同类型的 bean,你可以使用
@Qualifier
注解来指定具体要注入哪个 bean
- 可选依赖: 有时你可能希望一个依赖是可选的,即如果没有找到合适的 bean,也不会抛出异常。这时可以结合
@Autowired
和@Nullable
注解来实现
- 默认行为: 如果没有明确指定,Spring 会尝试通过构造器、setter 方法或字段来注入依赖。从 Spring 4.3 开始,如果你只有一个构造器,那么即使不使用
@Autowired
注解,Spring 也会默认使用该构造器进行注入
2. 场景
在开发过程中,将我们自己写的类注入到另一个类的字段、方法参数、方法、构造方法时,就可以使用@Autowired
注解。
3. 源码
/**
* @author Juergen Hoeller
* @author Mark Fisher
* @author Sam Brannen
* @since 2.5
* @see AutowiredAnnotationBeanPostProcessor
* @see Qualifier
* @see Value
*/
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
// 表示是否必须注入成功,取值为true或false。默认值是true,表示必须注入成功。
// 当取值为true时,注入不成功会报错,否则,注入不成功不会报错
boolean required() default true;
}
4. 使用方式
- 字段
@Autowired
private MyDependency myDependency;
- 构造函数
private final MyDependency myDependency;
@Autowired
public MyClass(MyDependency myDependency) {
this.myDependency = myDependency;
}
- setter方法
private MyDependency myDependency
public void setMyDependency(MyDependency myDependency) {
this.myDependency = myDependency;
}
- 任意方法
public void configureSomething(MyDependency myDependency) {
pass
}