我有遵循代码
interface Drivable{
}
@Component
class Bmw implements Drivable {
}
@Component
class Mercedes implements Drivable {
}
class Driver {
private Drivable drivable;
public Driver(Drivable drivable) {
this.drivable = drivable;
}
}
Run Code Online (Sandbox Code Playgroud)
和Spring Java Config
@Configuration
@ComponentScan
class CarConfig {
@Bean
@Qualifier("mercedes")//the code won't work
public Driver getDriver(Drivable drivable) {
return new Driver(drivable);
}
@Bean//I've added the bean
public Drivable getMercedes() {
return new Mercedes();
}
}
Run Code Online (Sandbox Code Playgroud)
如果要指定应传递给方法的对象类型,可以使用@Qualifier带@Bean注释的注释吗?我在Spring doc中找不到如何解决问题的方法。谢谢。
我认为您的用法@Qualifier有点错误。
如果我们有一个以上的豆可以进行春季注射,那么我们可以@Qualifer用来指定需要进行春季注射的豆。
在这种情况下,您有两个bean,Bmw并且Mercedes都实现了Drivable接口。
假设我的意图正确,您想让Spring将Mercedesbean注入Driver对象。
因此,您需要public Driver getDriver(@Qualifier("mercedes") Drivable drivable)在CarConfig类中指定。
@Configuration
@ComponentScan
class CarConfig {
@Bean
public Driver getDriver(@Qualifier("mercedes") Drivable drivable) {
return new Driver(drivable);
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以AnnotationConfigApplicationContext用来加载spring上下文,并随后Driver按以下方式获取bean:
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(CarConfig.class);
Driver bean = ctx.getBean(Driver.class);
}
}
Run Code Online (Sandbox Code Playgroud)
只是为了扩展示例,让我们说一下是否要Driver为每个创建一个bean Bmw,Mercedes然后示例代码将是:
@Configuration
@ComponentScan
class CarConfig {
@Bean(name="mercedesDriver")
public Driver getMercedesDriver(@Qualifier("mercedes") Drivable drivable) {
return new Driver(drivable);
}
@Bean(name="bmwDriver")
public Driver getBmwDriver(@Qualifier("bmw") Drivable drivable) {
return new Driver(drivable);
}
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(CarConfig.class);
System.out.println(Arrays.asList(ctx.getBeanNamesForType(Driver.class)));
Driver mercedesBean = ctx.getBean("mercedesDriver", Driver.class);
Driver bmwBean = ctx.getBean("bmwDriver", Driver.class);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6670 次 |
| 最近记录: |