-InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
这个阶段允许在Bena进行实例化之前,允许开发者自定义逻辑,如返回一个代理对象。不过需要注意的是假如在这个阶段返回了一个不为null的实例,spring就会中断后续的过程。
-BeanPostProcessor.postProcessAfterInstantiation()
这个阶段是Bean实例化完毕后执行的后处理 *** 作,所有在初始化逻辑、装配逻辑之前执行
该方法在bean初始化方法前被调用,Spring AOP的底层处理也是通过实现BeanPostProcessor来执行代理逻辑的
自定义属性值 该方法允许我们进行对对象中的属性进行设置,假如在某些业务中,一个对象的某些属性为null,但是不能显示为null,比如显示0或者其他的固定数值,我们就可以在这个方法实现中将null值转换为特定的值
可以在这个方法中进行bean的实例化之后的处理,比如我们的自定义注解,对依赖对象的版本控制自动路由切换。比如有一个服务依赖了两种版本的实现,我们如何实现自动切换呢?这时候可以自定义一个路由注解,假如叫@RouteAnnotaion,然后实现BeanPostProcessor接口,在其中通过反射拿到自定义的注解@RouteAnnotaion再进行路由规则的设定。
容器正式渲染完毕,开始启动阶段,bean已经在spring容器的管理下,程序可以随时调用
spring会将所有的bean销毁,实现的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}}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)