spring实例化业务类问题

我想在一个非action中调用一个业务类,但是无论怎么获得都是空值。
特别是我做测试时,如果通过跳转的方式可以在action中的方法调用到业务类,我在action中加个main函数去调用业务类缺无法调用
系统架构是struts1+spring+hiebernate。。spring已经在web。xml加载好了

9个回答

在Action的main函数里面手工启动Spring如下:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

然后getBean到你需要的业务类就可以做测试了:
IXXXService xxxservice = (IXXXService ) context.getBean("xxxservice ");

你不能用web.xml中加载的办法启动Spring,那个IoC容器你的main函数拿不到的,所以会调不到容器中的业务类。

你确定写的spring配置文件在你写main方法的时候会加载吗?

原因很简单,在单元测试时,依赖的属性都没有注入进去。
你可以就当前的action从Spring容器中取出,那么就是一个完整的依赖。

[quote]原因很简单,在单元测试时,依赖的属性都没有注入进去。
你可以就当前的action从Spring容器中取出,那么就是一个完整的依赖。[/quote] :idea:

如果你不是[b]必须new一个对象[/b],得不到也没关系,因为实际跑的时候会有的,但是如果必须new一个对象的话,就注入不能,需要手动获得

public class BeanTool {
private static final ApplicationContext ac = new ClassPathXmlApplicationContext("../applicationContext.xml");
public static Object getBeanByName(String name){
return ac.getBean(name);
}
}

如果用的是Spring3,可以直接在JUnit里写测试方法,使用注解的方式去注入你的对象。

[quote]其他小问下:不是就写个配置文件。然后写个SET方法就自动注入了吗。。那非Action难道没在spring容器里,还是Action在Spring容器里!那么servic和Dao呢。。 [/quote]

不论Action还是Dao或者Service,spring注入的前提是那个对象是由spring替你创建的。如果new一个对象,那么就是你自己创建了对象,不在spring管理范围,spring不会自动处理

你的测试类extends AbstractDependencyInjectionSpringContextTests,给你的业务类指定setter method,当然,还指定spring配置文件的location。

这个你可以在启动的时候 写一个ServletContextListener监听

再监听里面你可以把spring的application放在一个单例对象(或者static对象)的属性中 到时候只要在一个容器中随便在哪都可以获取到

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐