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