簡體   English   中英

Spring組件掃描沒有no-args構造函數的bean

[英]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 typeMessageConsumer ,則可以使用

@Autowired
@Qualifier("withoutType")
private MessageConsumer messageConsumer;

對於現場注入和

@Autowired
public StringConsumer(@Qualifier("withoutType") MessageConsumer messageConsumer){
    this.messageConsumer = messageConsumer;
}

用於構造函數注入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM