是否使用@Autowired自动检测到了?使用@Qualifier时是按名称依赖注入吗?我们如何使用这些注释进行setter和构造函数注入?
答案 0 :(得分:36)
您可以将@Qualifier
与@Autowired
一起使用。事实上,如果找到不明确的bean类型,spring会要求你显式选择bean,在这种情况下你应该提供限定符
例如,在下列情况下,必须提供限定符
@Component
@Qualifier("staff")
public Staff implements Person {}
@Component
@Qualifier("employee")
public Manager implements Person {}
@Component
public Payroll {
private Person person;
@Autowired
public Payroll(@Qualifier("employee") Person person){
this.person = person;
}
}
修改强>
在Lombok 1.18.4中,当你有@Qualifier 时,最终可以避免构造函数注入上的样板文件,所以现在可以执行以下操作:
@Component
@Qualifier("staff")
public Staff implements Person {}
@Component
@Qualifier("employee")
public Manager implements Person {}
@Component
@RequiredArgsConstructor
public Payroll {
@Qualifier("employee") private final Person person;
}
如果您正在使用新的lombok.config规则copyableAnnotations(通过将以下内容放在项目根目录中的lombok.config中):
# Copy the Qualifier annotation from the instance variables to the constructor
# see https://github.com/rzwitserloot/lombok/issues/745
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
最近在最新的lombok 1.18.4中引入了这个。
答案 1 :(得分:14)
当有多个相同类型的bean时,var $audioEl = $('audio');
var audioEl = $audioEl[0];
注释用于解决自动装配冲突。
@Qualifier
注释可用于使用@Qualifier
注释的任何类或使用@Component
注释的方法。此注释也可以应用于构造函数参数或方法参数。
前: -
@Bean
有两个bean,Car和Bike实现了Vehicle界面
public interface Vehicle {
public void start();
public void stop();
}
使用带有@Component(value="car")
public class Car implements Vehicle {
@Override
public void start() {
System.out.println("Car started");
}
@Override
public void stop() {
System.out.println("Car stopped");
}
}
@Component(value="bike")
public class Bike implements Vehicle {
@Override
public void start() {
System.out.println("Bike started");
}
@Override
public void stop() {
System.out.println("Bike stopped");
}
}
注释的@Autowired
在VehicleService中注入Bike bean。如果您没有使用@Qualifier
,它将抛出 NoUniqueBeanDefinitionException 。
@Qualifier
答案 2 :(得分:7)
@Autowired
按类型自动装配(或搜索)
@Qualifier
按名称自动装配(或搜索)
@Qualifier
的其他备用选项是@Primary
@Component
@Qualifier("beanname")
public class A{}
public class B{
//Constructor
@Autowired
public B(@Qualifier("beanname")A a){...} // you need to add @autowire also
//property
@Autowired
@Qualifier("beanname")
private A a;
}
//If you don't want to add the two annotations, we can use @Resource
public class B{
//property
@Resource(name="beanname")
private A a;
//Importing properties is very similar
@Value("${property.name}") //@Value know how to interpret ${}
private String name;
}
更多关于@value