论坛首页 Java企业应用论坛

当web中应用spring框架时,获得spring初始化的bean和ServletContext

浏览 9198 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (1) :: 隐藏帖 (5)
作者 正文
   发表时间:2009-04-21  
这些天,一直在边学习,边做东西,发现,慢慢的补上了不少知识。今天发现了一个很有用的技巧,希望能给不知道的人,一点帮助。

当在web启动后,spring已经初始化的bean,已经按照你的约束注入了。那么如何获取那些sigleton 的bean。 网上说, 可以用servlet来做,其实没有必要。

第一种方法,慢一般是300+ms,可以说是多费一道手,不过,还是记录下来,也许有点意义。

public class SpringBeans{
        private static ApplicationContext factory;
	private static ServletContext sc ;


	private static final String APPLICATION_CONTEXT = "\\WEB-INF\\applicationContext.xml";
	private static final String DAO_CONTEXT = "\\WEB-INF\\daoHibernateContext.xml";

	public static Object getBean(String beanID){
		factory = getFactory();
		return factory.getBean(beanID);
	}
	
	private static ApplicationContext getFactory(){
		sc = MyServletContext.getServletContext();
		String aAC = sc.getRealPath(APPLICATION_CONTEXT);
		String aDC = sc.getRealPath(DAO_CONTEXT);
		ApplicationContext tmpfactory = new FileSystemXmlApplicationContext(
				new String[] { aAC , aDC});
		return tmpfactory;
	}
}
// 当你取得的时候可以这样用

        (Object)bean = (Object)SpringBeans.getBean(beanID);



这种做法,是我第一次的方法,后来,经过猛看javaDoc,又发现了一个好东西,(希望大家以后做东西也能猛看javaDoc,按照名字去看,也许你会找到些什么,虽然多数时候是迷茫)

import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

    WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
    wac.getBean(beanID);


WebApplicationContext 应该就是spring的sevlet(也许是linstener或别的,这方面我的基本功还不够,也许说错哦)启动后加载到servletContext中的东西。你"."一下这个对象你会发现,你想获得的好多东西都出来了。而且,再速度上好过第一种方法,它的获取速度,在用
两次System.currentTimeMills()计时时,得出的结果是0ms。

希望对没有找到答案,或是正在找这个答案的人有帮助。还有,它还能获得web程序的servletContext。
WebApplicationContext wac..;
wac.getServletContext();

   发表时间:2009-06-05  
太好了,我正在满世界寻找!谢谢!
0 请登录后投票
   发表时间:2009-06-09  
你的第一种方法获取bean当然慢了,因为你获取的bean并不是web启动时spring已经初始化的bean,而是你通过ApplicationContext tmpfactory = new FileSystemXmlApplicationContext( new String[] { aAC , aDC})又重新初始化了一次获取的bean,获取bean慢是因为时间主要花在初始化上了,而且这样取出来的bean与web启动时spring已经初始化的bean是两个东东
0 请登录后投票
   发表时间:2009-06-10   最后修改:2009-06-10
public class TestAware implements ApplicationContextAware {
	ApplicationContext ac;
	public TestAware(){
		
	}
	public ApplicationContext getAc() {
		return ac;
	}
	public void setAc(ApplicationContext ac) {
		this.ac = ac;
	}
	public TestAware(ApplicationContext ac){
			this.ac = ac;
	}
	public void setApplicationContext(ApplicationContext ac)
			throws BeansException {
		// TODO Auto-generated method stub
		this.ac  = ac;
	}

}
在配置中加入
    <!-- 测试Aware
    <bean id ="aaaaa" class="com.xxx.tesxt.TestAware"/> 
    --> 
使用
    public void test253(){
    	//Aware 接口取得应用程序上下文
    	TestAware ta = (TestAware)context.getBean("aaaaa");
    	System.out.print(ta.getAc().getBean(beanID));
    }
0 请登录后投票
   发表时间:2010-02-07  
其实还有一个好冬冬
org.springframework.web.context.support.ServletContextAttributeExporter
通过attributes属性,可以将你定义的bean,直接作为web的application scope的属性
0 请登录后投票
   发表时间:2010-02-09  
非常感谢,项目正需要用到第二种方法。。。。
0 请登录后投票
   发表时间:2010-02-23  
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();  
    wac.getBean(beanID);

这个方法太适用了,感谢啊
0 请登录后投票
   发表时间:2010-03-14  
载入的BEAN要依赖外部传入的BEAN参数的话,如何来解决呢?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics