美文网首页
spring重复注入爬坑

spring重复注入爬坑

作者: onlyHalfSoul | 来源:发表于2018-06-17 16:46 被阅读268次

    在整合RabbitMQ时遇到了spring的属性注入无效的问题,配置问题处如下:

    <!--声明生产者 -->
        <bean id="messageSender"
              class="com.trace.app.framework.services.MessageSender" name="MessageSender">
            <property name="amqpTemplate" ref="rabbitTemplate"/>
            <!-- <property name="routingKey" value="message.test" ></property> -->
        </bean>
    

    这里消费者的amqpTemplate属性应该注入rabbitTemplate的rebbitMq连接实体,但是一直报空指针异常,打印属性也是为空:

    jvm 1    | messageSender.getAmqpTemplate() = null
    jvm 1    | routingKey = message.test
    jvm 1    | Obj = tzFirstMessage
    

    导致生产者无法连接上消息队列,经过一下原生态连接测试发现连接信息没错:

    public void connectionMQ() throws IOException {
            ConnectionFactory connectionFactory = new ConnectionFactory();
            connectionFactory.setHost("127.0.0.1");
            connectionFactory.setPort(5672);
            connectionFactory.setUsername("guest");
            connectionFactory.setPassword("guest");
            connectionFactory.setVirtualHost("test");
            Connection connection = connectionFactory.newConnection();
            int heartbeat = connection.getHeartbeat();
            System.out.println("heartbeat = " + heartbeat);
        }
    
        public static void main(String[] args) throws IOException {
            RabbitMQTest rabbitMQTest = new RabbitMQTest();
            rabbitMQTest.connectionMQ();
        }
     /*
    heartbeat = 60
    */
    

    所以判断是此处spring注入无效,经过测试,发现是注释方法和xml配置方法同时注册了bean,导致此处xml注入无效。问题代码如下:

    @Service(value = "MessageSender")
    public class MessageSender {
     ... ...
    }
    

    此处注解声明和上面的XML声明冲突,覆盖了上面的依赖注入,故删掉此处注解即可解决问题。

    进一步实验发现,该注解上的value导致冲突,不添加value的话spring会自动判断重复,不会出现依赖注入覆盖的情况,删掉Service注解后的括号就可以了。

    通过这个问题,对spring的多种依赖注入方式有了更深的理解,因祸得福。

    相关文章

      网友评论

          本文标题:spring重复注入爬坑

          本文链接:https://www.haomeiwen.com/subject/pjmweftx.html