描述一下今天遇到的问题
使用@Configuration注解加@Bean初始化一个工厂类,并且把工厂的三个实现注入到一个map中。伪代码如下
@Configuration
public class A{
private Map<String,class> map = new HashMap();
@Resource
private X x;
@Resource
private Y y;
@Bean
public B getBMap(){
B b = new B();
map.put("x", x);
map.put("y", y);
b.setMap(map);
return b;
}
}
当使用的B对象的map的时候,x取出来是正常的,y取出来是空的,,调用方法报空指针异常,网上找了一下,大概有两种说法
一、使用new创建了需要spring管理的bean
二、使用set方法注入类
都试了一下,还是报错,看了一上午,还是没有解决。
下午的时候想到,是不是Y依赖的其他服务找不到,导致这个服务初始化失败呢?带着这个疑问,看了下Y这个类。
@Component
public class Y{
@Resource
private C c;
@Resource
private D d;
}
引用的第一个C是之前项目中就有的,所以这个不会有问题,第二个D是我新加的一个服务,是不是这个服务有问题呢,带着疑问去看了这个服务的类,竟然发现这个类中引入了B这个类。
这样就能解释通了,我再B类中引入Y,Y中注入了D这个类,但是D这个类又引入了B这个类。循环依赖了,D一定会在B初始化后才会放入到spring中管理,同理Y也未初始化完成,这个时候初始化的B中的Y一定是空的。
找到问题了就很好改了,把D中对B的依赖去掉,然后重新启动项目,Y不为空了。至此问题解决。