Java 两个类中的Autowired Bean在从第二个类访问后未更新

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

我有以下情况:

一个bean在两个类中自动连接,我在一个类中填充bean,然后在第二个类中检查bean,它没有填充。然而,当我在填充bean的类中添加getter并调用getter时,它返回填充的bean。为什么我不能在另一个类中直接访问这个bean,因为它在spring上下文中充当一个单例,所以它不应该被填充吗

JUnit4测试类从xml文件加载spring上下文:

@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 with
Autowired
更新
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。每次您都会通过它的容器对象访问它,该容器对象将具有更新的对象引用。在这种情况下,故障将发生在发生自动布线的线路上。