-
使用spring注入bean常用@Autowired注解,当遇到接口有多实现常用@Qualifier注解来区分;
接口多实现
ContractorInjectServiceImpl.java
@Service("contractorInjectService1")
public class ContractorInjectServiceImpl implements ContractorInjectService {
@Override
public void go(String msg) {
System.out.println("contractorInjectService1" + msg);
}
}
ContractorInjectServiceImpl2.java
@Service("contractorInjectService2")
public class ContractorInjectServiceImpl2 implements ContractorInjectService {
@Override
public void go(String msg) {
System.out.println("contractorInjectService2" + msg);
}
}
Test2.java
@Component
public class Test2 {
@Autowired
@Qualifier("contractorInjectService2")
private ContractorInjectService contractorInjectService;
@PostConstruct
void ts () {
contractorInjectService.go( "==== " + Calendar.getInstance().getTime().toString());
}
}
- 也可以使用lombok的注解来实现构造器注入:
Test.java
@Component
@RequiredArgsConstructor
public class Test {
@Qualifier("contractorInjectService2")
private final ContractorInjectService contractorInjectService;
@PostConstruct
void ts () {
contractorInjectService.go( "==== " + Calendar.getInstance().getTime().toString());
}
}
- 但是启动时发现报错:
Description:
Parameter 0 of constructor in com.pump.demopro.contractorinject.test.Test required a single bean, but 2 were found:
- contractorInjectService1: defined in file [D:\GiteeRepository\my-learn\demo-pro\target\classes\com\pump\demopro\contractorinject\service\impl\ContractorInjectServiceImpl.class]
- contractorInjectService2: defined in file [D:\GiteeRepository\my-learn\demo-pro\target\classes\com\pump\demopro\contractorinject\service\impl\ContractorInjectServiceImpl2.class]
Action:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
Process finished with exit code 1
- 这是因为Lombok does not copy the annotation 'org.springframework beans.factory.annotation.Qualifier’into the constructor,Lombok没有复制@Qualifier注解到构造器中,所以会失效。
- 解决办法:
在项目根目录下创建一个lombok.config文件(跟src和target同级目录下)
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
然后执行 mvn clean,再重新启动即可。
网友评论