context.getbeans 的依赖注入

Dependency injection with context.getbeans

这是我获取 bean 的控制器代码

@RequestMapping("/suscribetest")
    @ResponseBody
    public String subscribeTest(){
        try{
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MqttInboundBeans.class);
            MqttPahoMessageDrivenChannelAdapter messageChannel = context.getBean("inbound",MqttPahoMessageDrivenChannelAdapter.class);
            messageChannel.addTopic("test", 2);


        }catch(Exception ex){
            System.out.println("err "+ex.getLocalizedMessage());
        }
        return "";
    }

下面是我的豆子class

@Configuration
public class MqttInboundBeans {
  @Autowired
private UserService service;


@Bean
public MessageChannel mqttInputChannel() {
    return new DirectChannel();
}

@Bean
public MessageProducer inbound() {
    MqttPahoMessageDrivenChannelAdapter adapter =
            new MqttPahoMessageDrivenChannelAdapter("tcp://localhost:1883", "testClient",
                                             "DATA/#", "LD/#");
    adapter.setCompletionTimeout(0);
    adapter.setConverter(new DefaultPahoMessageConverter());
    adapter.setQos(2);
    adapter.setOutputChannel(mqttInputChannel());
    return adapter;
}

@Bean
@ServiceActivator(inputChannel = "mqttInputChannel")
public MessageHandler handler() {
    return new MessageHandler() {

        @Override
        public void handleMessage(Message<?> message) throws MessagingException {
            System.out.println(message.getHeaders()+"  "+message.getPayload());

        }

    };
}
}

当我尝试 运行 应用程序时它工作正常并且我可以从 messageHandler 获取消息但是当我在 运行 尝试从控制器获取 Bean 时我收到错误

Error creating bean with name 'mqttInboundBeans': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.ehydromet.service.UserService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

谢谢。

Bean UserService 不是由 MqttInboundBeans 生成的。 AnnotationConfigApplicationContext 创建 Spring Application Context 接受输入作为我们的配置 class 用 @Configuration 注释,在 Spring 运行时注册配置 class 生成的所有 bean。 尝试自动连接应用程序上下文,然后从中获取 bean。

@Autowired
private ApplicationContext context;
@RequestMapping("/suscribetest") @ResponseBody public String subscribeTest(){ 
try{ 
 MqttPahoMessageDrivenChannelAdapter messageChannel =(MqttPahoMessageDrivenChannelAdapter) context.getBean("inbound");


messageChannel.addTopic("test", 2); ....