spring容器已经启动,我怎么动态的加载里面的某个bean
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring容器已经启动,我怎么动态的加载里面的某个bean相关的知识,希望对你有一定的参考价值。
[引文]通常在struts2+spring的例子上,要想使用spring的Bean,可以在applicationContext.xml加上如下配置<bean id="springBean" scope="prototype" class=""
<property name="name" value="chen"/</bean<bean id="myAction" scope="prototype" class=""
<property name="springBean" ref="springBean"/</bean如果是j2ee应用,启动web应用时将会自动加载ApplicationContext实例(Spring容器负责创建Bean实例)
一旦struts2的myAction实例化,其中的SpringBean也会被自动注入进来,从而达到使用SpringBean的目的。
[问题]但是仍有需要通过代码来调用SpringBean的情况:
1)对于不是由spring创建管理的类,如在java 代码中直接使用new去创建一个对象,并且想在这个对象中使用
SpringBean;因为这个对象并不是由Spring容器创建管理的类,所以即使它有setter方法,容器的springBean也不会被注入。
2)动态更改springBean中的属性值,如在代码运行时,name值需要发生变动;
3)对于一个独立的应用程序[解决]定义一个非Spring容器创建管理的类
public class NonSpringClass implements ServletContextAware
private SpringBean springBean;
//如果 testGetBean不是被Spring容器创建管理,即使它有setter方法,容器的springBean也不会被注入。
public void setSpringBean(SpringBean springBean)this.springBean=springBean;//利用ApplicationContext 从spring容器中获得springBean;
//Spring有两个核心接口BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口,
//它们代表了Spring容器,Spring容器是产生Bean的工厂,用于管理容器中的Bean。
public NonSpringClass ()//ApplicationContext acx = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext acx = new FileSystemXmlApplicationContext("src/WEB-INF/applicationContext.xml");
springBean=(SpringBean)acx.getBean("springBean");调用这个类的代码:
import com.NonSpringClass;
public class TestCode
private NonSpringClass nonSpringClass;
//这样nonSpringClass里将包含Spring容器创建的springBean 参考技术A 51、示儿 陆游
以上是关于spring容器已经启动,我怎么动态的加载里面的某个bean的主要内容,如果未能解决你的问题,请参考以下文章
Spring源码阅读Spring容器启动原理(上)-配置资源加载和注册
spring源码阅读-- 容器启动之加载BeanDefinition