在整合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的多种依赖注入方式有了更深的理解,因祸得福。