Java 两个类中的Autowired Bean在从第二个类访问后未更新
我有以下情况: 一个bean在两个类中自动连接,我在一个类中填充bean,然后在第二个类中检查bean,它没有填充。然而,当我在填充bean的类中添加getter并调用getter时,它返回填充的bean。为什么我不能在另一个类中直接访问这个bean,因为它在spring上下文中充当一个单例,所以它不应该被填充吗 JUnit4测试类从xml文件加载spring上下文:Java 两个类中的Autowired Bean在从第二个类访问后未更新,java,spring,junit4,autowired,Java,Spring,Junit4,Autowired,我有以下情况: 一个bean在两个类中自动连接,我在一个类中填充bean,然后在第二个类中检查bean,它没有填充。然而,当我在填充bean的类中添加getter并调用getter时,它返回填充的bean。为什么我不能在另一个类中直接访问这个bean,因为它在spring上下文中充当一个单例,所以它不应该被填充吗 JUnit4测试类从xml文件加载spring上下文: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(lo
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/spring/test-main-context.xml" })
public class MyTests {
@Autowired
MyObject myObject;
@Autowired
MyUtils myUtils;
@Test
public void testingContext() {
myUtils.setMyObjectFromDB();
System.out.println(myUtils.getMyObject().getId());
System.out.println(myObject.getId());
}
}
MyUtils:
public class MyUtils {
@Autowired MyObject myObject;
public void setMyObjectFromDB() {
MyObject myDBObject = new MyObject();
//
// getting myObjectFromDB;
//
myObject = myDBObject;
}
public MyObject getMyObject() {
return myObject;
}
}
在测试类中,myUtils.getMyObject().getId()
返回正确的id,但第二行myObject.getId()
返回null
为什么在MyUtils类中设置并在两个类中@Autowired的MyObject在我在测试类中直接访问它时没有被更新。当您重新分配
MyObject=myDBObject
在setMyObjectFromDB
方法中,您正在创建一个新对象,并将其引用保存在myObject
变量中,该变量不同于使用Autowired
创建的对象
当您使用自动连线时,它将在变量中分配所创建bean的引用。但如果重新分配该变量,它将指向新对象
编辑:
如果您确实需要使用initialized withAutowired
更新myObject
的所有变量,最好创建一个存储myObject
变量的容器类
public class MyObjectContainer {
@Autowired
MyObject myObject;
// Getters & Setters
}
在所有要自动关联的类中,myObject
,请改用MyObjectContainer
类的对象。当您想要更新myObject
值时,只需在myObjectContainer
对象中使用其setter进行更新即可。因此,您的MyUtils
如下所示:
public class MyUtils {
@Autowired MyObjectContainer myObjectContainer;
public void setMyObjectFromDB() {
MyObject myDBObject = new MyObject();
//
// getting myObjectFromDB;
//
myObjectContainer.setMyObject(myDBObject);
}
public MyObjectContainer getMyObjectContainer() {
return myObjectContainer;
}
}
查看代码,
MyObject
没有被注入这两个类中。您得到的印象是它被注入了MyUtils
类,因为您实际上是在setter方法中手动创建的
问题是为什么没有注入
MyObject
,原因可能有很多,其中之一是您没有在MyObject
类中定义@Component
,或者通过添加@ComponentScan(basePackages=“放入基本包名”)它不在组件扫描路径中
在Spring应用程序类中 您可以通过引用直接更新this.myObject=myObject代码>。每次您都会通过它的容器对象访问它,该容器对象将具有更新的对象引用。在这种情况下,故障将发生在发生自动布线的线路上。