为什么我不能从ApplicationContextAware实现的bean访问ApplicationContext

时间:2015-08-21 20:33:33

标签: spring springjunit4classrunner

我有一个Spring JUnit测试器类MySimpleTester

@

RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/spring/mySimpleConfig.xml"})
public class MySimpleTester {

@Before
    public void setUp() throws Exception {
        myAdapter = (MyAdapter) applicationContext.getBean("myAdapter");
    }

@test 
public void testGetSimpleList() {
        List<SimpleLink> simpleList = **myAdapter.getSimpleLinksList**();
}

... ...

在适配器类中我有:

public MyAdapter {
    public List<SimpleLink> getSimpleLinksList() {
        List<SimpleLink> simLinks = null;
        String environment = AppFactory.getPropertiesObj();

... ...

class AppFactory implements ApplicationContextAware {

    private static ApplicationContext context;

    public void setApplicationContext(ApplicationContext acontext) {
        context = acontext;
    }
    public getPropertiesObj() {
        return getAppContext().getBean("propertiesBean");
    }

我得到NullPointerException并在此处看到ApplicationContextNull

但是在SpringJUnitTestRunnerMySimpleTester我可以找到正确初始化的applicationContext。我不包括mySimpleConfig.xml和包含的文件。 MyAdaptergetSimpleLinksList()中的方法在应用程序服务器中运行时可以从Web应用程序中完美地运行,并在那里获得appcontext。

只有Spring测试人员无法访问静态应用程序上下文AppFactory类,因为它通过AppFactory.getPropertiesObj()静态调用。我正确地设置了类路径,因为其他测试类正在执行。

2 个答案:

答案 0 :(得分:0)

如果要在MySimpleTester中访问当前的ApplicationContext: -

public class MySimpleTester {

@Autowired
ApplicationContext applicationContext;

@Before
    public void setUp() throws Exception {
        myAdapter = (MyAdapter) applicationContext.getBean("myAdapter");
    }

@test 
public void testGetSimpleList() {
        List<SimpleLink> simpleList = **myAdapter.getSimpleLinksList**();
}

答案 1 :(得分:0)

我认为这是在创建多个应用程序上下文时发生的。 AplliCationContext对象应该是单例。但是当我们从静态方法再次调用applicationContext时,它会引用完全不同的确认。 ApplicationContext甚至没有在那里初始化。

当从Spring MVC webcontanier调用相同的模块时,不会发生这种情况。只有当您尝试使用Spring测试程序类RunWith(SpringJUnit4ClassRunner.class)时才会发生这种情况。我可以在业务方法中传递AppContext,但我不想更改bsiness方法签名。我在Spring社区发现了类似问题的一些帖子。