[英]Spring component scan for beans with no no-args constructor
@Component
public class StringConsumer {
@Autowired
MessageConsumer messageConsumer;
public void m1(Channel channel) {
//MessageConsumer messageConsumer=new MessageConsumer(channel);
//how to use spring to do this, initialize MessageConsumer with channel instance value for this class.
}
}
@Component
public class MessageConsumer implements Consumer {
public MessageConsumer(Channel channel) {
this.channel=channel;
}
public MessageConsumer(Channel channel, String type) {
this.channel=channel;
}
}
如何使用spring初始化MessageConsumer(new Channel())以及如何在其他類中使用自動連線。 如何初始化不同的類的構造函數。
在類中創建一個像這樣的bean
@Configuration
class ConfigClass {
@Bean
public MessageConsumer createMessageConsumer() {
MessageConsumer messageConsumer = new MessageConsumer(new Channell());
return messageConsumer;
}
}
刪除MessageConsumer類上的@Component
。 如果執行上述操作,則是多余的。
現在,如果您在任何類中自動連接MessageConsumer,它將返回在上述方法中創建的Bean(已初始化通道)。
您是否嘗試過使用EnableAspectJAutoProxy注釋類並使用@Bean注釋創建Bean?
@EnableAspectJAutoProxy(proxyTargetClass = true)
嘗試添加新的配置類,並使用@Bean
批注將這些對象定義為bean。 它應該看起來像這樣
@Configuration
public class BeanConfig {
@Bean
public MessageConsumer messageConsumer(){
return new MessageConsumer(this.channel());
}
@Bean
public Channel channel(){
return new Channel();
}
}
如果要進一步擴展上述類,以初始化同一類的不同構造函數。 您可以將代碼進一步擴展為
@Bean(name="withType")
public MessageConsumer messageConsumerWithType(){
return new MessageConsumer(this.channel(), "Some String");
}
@Bean(name="withoutType")
public MessageConsumer messageConsumerWithType(){
return new MessageConsumer(this.channel());
}
好的,所以我們創建了兩個創建相同類但以不同方式的bean。 這兩個豆也有名字。 我們如何指定要使用的那個? 為此,存在一個稱為@Qualifier
的注釋。 @Qualifier
作用是指定在自動裝配對象時要使用哪個bean。 因此,例如,如果您要自動連接沒有String type
的MessageConsumer
,則可以使用
@Autowired
@Qualifier("withoutType")
private MessageConsumer messageConsumer;
對於現場注入和
@Autowired
public StringConsumer(@Qualifier("withoutType") MessageConsumer messageConsumer){
this.messageConsumer = messageConsumer;
}
用於構造函數注入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.