一个@Component注解引发的血案

一个注解@Component引发的血案

首先,我们这个是用springboot架构来实现的业务

这是项目包结构和配置文件结构一个@Component注解引发的血案_第1张图片一个@Component注解引发的血案_第2张图片这是定时需要执行的任务一个@Component注解引发的血案_第3张图片
这是我执行PromoCodeCMCJob这个定时器的报错信息一个@Component注解引发的血案_第4张图片

问题是这样的:加了两个MQ之后才报错的这个信息,当我执行启动PromoCodeCMCJob定时任务的时候就报错,报错信息如上,这个时候我两个MQ任务的定时任务都加了@Component和 @Autowired private MQProduceFactory gpRepayProducer 注入,此时就报错了,刚开始的时候我只是 @Autowired private MQProduceFactory gpRepayProducer 注释掉然后再启动PromoCodeCMCJob这个定时任务,什么,居然没问题,这个时候完全能执启动,所以此时我就断定是这个MQProduceFactory注入原因引起的,但是我有MQ队列,这个是MQ的生产者,注释掉就不能忘MQ生产消息了,所以注释掉这个是不行的,然后我就想其它办法去解决,像重新分包,想了各种解决办法都没有解决,始终没有想到去掉@Component这个注解,这个注解翻译是组件的意思,是把当前类注入到IOC容器中,直到我研究了半天左右的时候,一直没有想到点上,浪费了很多时间,快下班了的时候让我想到了,既然被在IOC容器中了,那我不把他注入进去不就完了,这是我就试着把@Component注解去掉,然后在配置文件中加入bean,变成了这样一个@Component注解引发的血案_第5张图片
配置文件中不加这个bean的话启动定时任务也是会报错的,这样的话我就把需要的MQProduceFactory这个放入到bean里面了,而没有在IOC了,最后就完美的解决了,有MQ三个定时任务都能运行了!

思考:@Component注解是IOC容器层面的,是个很大的容器,能包容很多,而bean只是一个工厂,IOC容器能包含着bean工厂,IOC容器中可以有很多bean工厂,但是bean里面只有一个,一般都是通过bean标签的id来标识的,所以在项目中没有最完美的方案,只有更好的方案,只有把架构,方案都用对了,才能更好去解决业务需求的问题

你可能感兴趣的:(一个@Component注解引发的血案)