@Autowired 是 Spring 框架中的一个注解,用于实现依赖注入(Dependency Injection, DI)。它可以标注在类的成员变量、方法以及构造函数上,让 Spring 自动完成 Bean 的装配工作。
使用方法
- 成员变量注入:直接在类的成员变量上使用 @Autowired 注解,Spring 容器会自动为这些变量找到与其类型匹配的 Bean 实例,并进行注入。
public class MyClass {
@Autowired
private MyService myService;
}
- 构造函数注入:将 @Autowired 应用于类的构造函数上,Spring 容器会自动解析构造函数的参数类型,并为这些参数找到与其类型匹配的 Bean 实例,然后注入到构造函数中。
public class MyClass {
private MyService myService;
@Autowired
public MyClass(MyService myService) {
this.myService = myService;
}
}
- 方法注入:将 @Autowired 应用于类的方法上,当类实例化时,Spring 容器会自动解析这些方法的参数类型,并为这些参数找到与其类型匹配的 Bean 实例,然后调用这些方法并注入参数。
public class MyClass {
private MyService myService;
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
}
解决 Bean 冲突
当容器中存在多个相同类型的 Bean 时,可以使用 @Qualifier 注解来指定要注入的 Bean。
public class FooService {
@Autowired
@Qualifier("fooFormatter")
private Formatter formatter;
}
处理可选依赖
如果某个依赖在 Spring 容器中找不到匹配的 Bean 实例,可以将 @Autowired 注解的 required 属性设置为 false,这样在找不到匹配的 Bean 时,框架将不会抛出异常。
public class MyClass {
@Autowired(required = false)
private MyService myService;
}
工作原理
在 Spring 中,AutowiredAnnotationBeanPostProcessor (AABP) 负责处理带有 @Autowired 注解的成员变量和方法。当 Spring 容器实例化一个 Bean 时,会调用 AABP 的 postProcessProperties 方法来实际注入 @Autowired 注解的成员变量和方法。
通过以上方式,@Autowired 注解可以方便地实现依赖注入,简化了代码的编写和维护。