我想在一个非action中调用一个业务类,但是无论怎么获得都是空值。
特别是我做测试时,如果通过跳转的方式可以在action中的方法调用到业务类,我在action中加个main函数去调用业务类缺无法调用
系统架构是struts1+spring+hiebernate。。spring已经在web。xml加载好了
在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对象)的属性中 到时候只要在一个容器中随便在哪都可以获取到