如何从当前spring容器中获得bean?

问题描述

在用spring做一个web项目,有一个需求是在没有servletContext的情况下,根据beanId获得当前容器中的具体bean对象。请问如何实现?注意,这个beanId可能是外部系统传过来的,所以无法用@autowire提前注入。发现WebApplicationContext wac = ContextLoader.getCurrentWebApplicationCon;但这个方法只能获得web容器,我想做的是获得当前的spring root container即无论当前是通过web还是非web加载的bean都能让我获得到。如果不是web项目可以直接ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();然后我每次都是中这个context去取bean,但如果是web项目,该怎么做呢?

解决方案

写一个类,实现BeanFactoryAware接口,把该接口配置到spring中,然后把getbean方法写成静态的,就可以动态获取了。下面是示例:public class Springfactory implements BeanFactoryAware {private static BeanFactory beanFactory;// private static ApplicationContext context;public void setBeanFactory(BeanFactory factory) throws BeansException {this.beanFactory = factory;}/** * 根据beanName名字取得bean * * @param beanName * @return */public static <T> T getBean(String beanName) {if (null != beanFactory) {return (T) beanFactory.getBean(beanName);}return null;}}使用的时候,通过Springfactory.getBean("beanName"),就可以获取到bean了。注意:这个是静态方法,直接通过类名去调用。
解决方案二:
一楼正解。
解决方案三:
lz这个想法有点冲动了吧,
解决方案四:
楼主难到说的是webservice传过来的beanId ,这样用ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(); 就行了。如果是web应用,注入就可以啊
解决方案五:
实现回调接口或者实现listener都可以取得容器, 将bean缓存到map里,key是bean名称,value是对象。 取的时候从map里取就可以了
解决方案六:
有点不明白,还请教楼主下,既然是web项目,为什么会没有servletContext呢?如果不是web项目部分的,通过ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext();获取没问题的
解决方案七:
引用ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(); web 项目也可以这样啊! 获取的 bean 不是一个单例,但不是特殊情况下 无影响的

时间: 2024-10-24 19:14:30

如何从当前spring容器中获得bean?的相关文章

如何在jar包中使用到spring容器中的bean

问题描述 如何在jar包中使用到spring容器中的bean 这个jar包要使用到这个工程中的某个类,而这个类的配置是由spring管理,怎么在这个jar包中获取到这个bean 解决方案 http://my.oschina.net/zjds/blog/371962

Spring容器中Bean的作用域

    当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleton:单例模式,在整个Spring IoC容器中,使用singleton定义的Bean将只有一个实例 prototype:原型模式,每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例 request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次

《Spring攻略(第2版)》——1.2 配置Spring IoC容器中的Bean

1.2 配置Spring IoC容器中的Bean 1.2.1 问题 Spring提供了一个强大的IoC容器来管理组成应用的bean.为了利用容器服务,你必须配置运行于Spring IoC容器中的Bean. 1.2.2 解决方案 你可以通过XML文件.属性文件.注释甚至API来配置Spring IoC容器中的Bean. Spring允许你在一个或者多个bean配置文件中配置bean.对于简单的应用程序,可以在单个配置文件中集中配置bean.但是对于有许多bean的大型应用,你应该根据其功能(例如控

浅谈spring容器中bean的初始化_java

当我们在spring容器中添加一个bean时,如果没有指明它的scope属性,则默认是singleton,也就是单例的. 例如先声明一个bean: public class People { private String name; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String get

【spring源码学习】spring的IOC容器之自定义xml配置标签扩展namspaceHandler向IOC容器中注册bean

[spring以及第三方jar的案例]在spring中的aop相关配置的标签,线程池相关配置的标签,都是基于该种方式实现的.包括dubbo的配置标签都是基于该方式实现的.[一]原理 ===>spring在解析xml标签,一旦不是以<bean>开头的元素,就会走org.springframework.beans.factory.xml.BeanDefinitionParserDelegate的parseCustomElement(Element ele)方法解析自定义的标签 ===>

ejb容器中实体bean的调用问题

问题描述 实例:一个简单的Student实体bean,一个会话bean通过EntityManager持久化实体.以下为测试代码:Student stu=new Student();ManyToManyDAO sd=(ManyToManyDAO)ctx.lookup("***");System.out.println(stu.getId());sd.saveStu(stu);System.out.println(stu.getId());结果:两次输出结果均为null后来,调用stu.f

Spring中管理Bean依赖注入之后和Bean销毁之前的行为

    对于Singleton作用域的Bean,Spring容器将会跟踪它们的生命周期,容器知道何时实例化结束.何时销毁.Spring可以管理Bean在实例化结束之后和Bean销毁之前的行为. Bean依赖关系注入之后的行为:     Spring提供了两种方式在Bean全部属性设置成功后执行特定的行为: 在Spring配置文件中使用init-method属性:这个属性指定某个方法在Bean全部依赖关系设置结束后自动执行.这个方法写在Bean里面.使用这种方法不需要将代码与Spring耦合在一起

spring bean加载--从缓存中获取bean

标签:spring源码学习 入口方法:getSingleton,在 Object sharedInstance = getSingleton(beanName); @Override public Object getSingleton(String beanName) { return getSingleton(beanName, true); } 真正的实现: protected Object getSingleton(String beanName, boolean allowEarlyR

动态注册bean到spring容器

原先的设计是通过已有的库,将数据通过rmi写入到远程服务器:现在有需求需要将支持多个,而且是自定义的远程服务器ip. 因为整个接口原先都是通过spring配置文件,包括rmi的地址.同时,为了维护方便,不能直接将打好的jar包拿过来改,于是就采用了复制原有的bean definition,动态注册新的bean到那个spring容器中. 首先需要获取jar包中的spring容器,这里需要将applicationContext接口转换成为真正的实现:DefaultListableBeanFactor