Spring组件扫描没有no-args构造函数的bean

时间:2018-08-06 07:03:36

标签: java spring

@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())以及如何在其他类中使用自动连线。 如何初始化该类的不同构造函数。

3 个答案:

答案 0 :(得分:3)

在类中创建一个像这样的bean

@Configuration
class ConfigClass {

  @Bean
  public MessageConsumer  createMessageConsumer() {
    MessageConsumer messageConsumer = new MessageConsumer(new Channell());
    return messageConsumer;
 }
}

删除MessageConsumer类上的@Component。如果执行上述操作,则是多余的。
现在,如果您在任何类中自动连接MessageConsumer,它将返回在上述方法中创建的Bean(已初始化通道)。

答案 1 :(得分:0)

您是否尝试过使用EnableAspectJAutoProxy注释类并使用@Bean注释创建Bean?

@EnableAspectJAutoProxy(proxyTargetClass = true)

答案 2 :(得分:0)

尝试添加新的配置类,并将这些对象定义为带有@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。因此,例如,如果您要自动连接MessageConsumer而没有String type,则可以使用

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

用于现场注入和

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

用于构造函数注入。