@Autowired
概念:
@Autowired
是Spring框架中的注解,用于自动装配bean;
当Spring容器创建bean时,它可以自动将依赖的bean注入到使用@Autowired
注解的字段或方法中,
这使得开发者可以专注于业务逻辑,而无需手动配置和注入依赖。
字段注入
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyService {
@Autowired
private MyDependency myDependency;
// ... 其他方法 ...
}
"MyDependency类型的bean",会被自动注入到myDependency字段中,
因为,关于bean的id,在这里并没有直接涉及到,
又因为,字段注入是基于类型的,而不是基于id的,
所以,Spring会查找所有类型为MyDependency的bean,并尝试注入。
如果,容器中只有一个MyDependency类型的bean,那么Spring会成功地将它注入到myDependency字段中;
如果,容器中有多个MyDependency类型的bean,你需要通过其他方式来解决歧义,
比如,使用@Qualifier注解来指定具体的bean名称(id),或者通过其他方式来配置bean的注入。
构造器注入
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyService {
private final MyDependency myDependency;
@Autowired
public MyService(MyDependency myDependency) {
this.myDependency = myDependency;
}
// ... 其他方法 ...
}
使用构造器注入可以确保 `MyDependency` 在`MyService`的整个生命周期中都是可用的,并且是不可变的。
方法注入(这种方法较少使用)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyService {
private MyDependency myDependency;
@Autowired
public void setMyDependency(MyDependency myDependency) {
this.myDependency = myDependency;
}
// ... 其他方法 ...
}
注意:
1、
如果 Spring 容器中有多个相同类型的 bean,那么 @Autowired 可能无法确定要注入哪个 bean,从而导致异常,
为了避免这种情况,
可以使用 @Primary 注解来指定首选的 bean,
或者使用 @Qualifier 注解来明确指定要注入的 bean 的名称。
2、
从 Spring 4.3 开始,@Autowired 注解不再是必须的,因为如果你只有一个构造器,Spring 会自动使用它进行依赖注入。
@Qualifier
概念:
@Qualifier
注解,在Spring框架中用于消除多个相同类型bean
的歧义,
即,当存在多个相同类型的bean时,可以使用@Qualifier
注解来指定注入哪一个bean,
配合@Autowired
使用时,@Qualifier
注解可以指定bean的名称或者其他的限定符。
举例
首先,定义多个相同类型的bean:
@Component
public class MyDependencyA implements MyDependency {
// ...
}
@Component
public class MyDependencyB implements MyDependency {
// ...
}
1、使用@Autowired
和 @Qualifier
注入特定的bean
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class MyService {
private final MyDependency myDependencyA;
private final MyDependency myDependencyB;
@Autowired
public MyService(
@Qualifier("myDependencyA") MyDependency myDependencyA,
@Qualifier("myDependencyB") MyDependency myDependencyB
) {
this.myDependencyA = myDependencyA;
this.myDependencyB = myDependencyB;
}
// ... 其他方法 ...
}
MyService类的构造函数,接受两个 MyDependency 类型的参数,
使用@Qualifier 注解来明确指定注入哪一个bean,
Spring容器会查找名称为 "myDependencyA" 和 "myDependencyB" 的bean,并将它们分别注入到"myDependencyA" 和 "myDependencyB"字段中。
2、使用 @Qualifier 注解在字段注入
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class MyService {
@Autowired
@Qualifier("myDependencyA")
private MyDependency myDependencyA;
@Autowired
@Qualifier("myDependencyB")
private MyDependency myDependencyB;
// ... 其他方法 ...
}
这里,@Autowired 和 @Qualifier 注解被一起用在了字段上,效果与使用在构造函数上是一样的。