浏览 9208 次
精华帖 (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(); 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-06-05
太好了,我正在满世界寻找!谢谢!
|
|
返回顶楼 | |
发表时间:2009-06-09
你的第一种方法获取bean当然慢了,因为你获取的bean并不是web启动时spring已经初始化的bean,而是你通过ApplicationContext tmpfactory = new FileSystemXmlApplicationContext( new String[] { aAC , aDC})又重新初始化了一次获取的bean,获取bean慢是因为时间主要花在初始化上了,而且这样取出来的bean与web启动时spring已经初始化的bean是两个东东
|
|
返回顶楼 | |
发表时间: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)); } |
|
返回顶楼 | |
发表时间:2010-02-07
其实还有一个好冬冬
org.springframework.web.context.support.ServletContextAttributeExporter 通过attributes属性,可以将你定义的bean,直接作为web的application scope的属性 |
|
返回顶楼 | |
发表时间:2010-02-09
非常感谢,项目正需要用到第二种方法。。。。
|
|
返回顶楼 | |
发表时间:2010-02-23
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
wac.getBean(beanID); 这个方法太适用了,感谢啊 |
|
返回顶楼 | |
发表时间:2010-03-14
载入的BEAN要依赖外部传入的BEAN参数的话,如何来解决呢?
|
|
返回顶楼 | |