要想知道postProcessBeforeInitialization()和postProcessAfterInitialization()这两个方法在spring中是如和被调用的,或者可是说成是什么时候才会去调用的,那首先我们就要清楚的了解Bean的生命周期。
那在spring中bean的生命周期究竟是怎样的呢
1. 容器寻找Bean的定义信息并将其实例化
2. 使用依赖注入,spring按照Bean定义信息配置Bean的所有属性
3. 如果Bean实现了BeanNameAware接口,工厂调用Bean的SetBeanName()方法传递Bean的ID
4. 如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
5. 如果BeanPostProcessor和Bean关联,那么其postProcessBeforeInitialization()方法将被调用
6. 如果Bean指定了init-method方法,将被调用
7. 最后,如果有BeanPostProcessor和Bean关联,那么其postProcessAfterInitialization()方法将被调用
此时,Bean已经可以被应用系统使用,并将被保留在BeanFactory中知道他不再被需要。有两种可以将其从BeanFactory中删除掉的方法
① 如果Bean实现了DisposableBean接口,destroy()方法将被调用
② 如指定了定制的销毁方法,就调用这个方法
在了解完生命周期之后我们就来进行实例操作
//applicationContext.xml
<bean id="teacherService" class="cn.csdn.cyclelife.TeacherService" init-method="init" destroy-method="destroy">
<constructor-arg type="java.lang.Integer" index="0">
<value>20</value>
</constructor-arg>
<property name="name">
<value>Longmanfei</value>
</property>
</bean>
<bean id="postService"class="cn.csdn.cyclelife.PostService"></bean>
//TeacherService bean
public class TeacherService {
private String name;
private Integer age;
public void setName(String name){
System.out.println("----这是teacherservice的set方法----");
this.name=name;
}
public TeacherService(Integer age){
this.age=age;
}
public void init(){
System.out.println("--------这是teacherservice的init的方法-------------");
}
public void destroy(){
System.out.println("---------这是销毁(destroy)方法----------");
}
public void display(){
System.out.println(this.name+"-----------------"+this.age);
}
}
// 实现接口的BeanPostProcessor bean
public class PostService implements BeanPostProcessor{
/**在初始化之后调用这个方法*/
@Override
public Object postProcessAfterInitialization(Object bean, String arg1)
throws BeansException {
System.out.println("----这是init之后执行的方法postProcessAfterInitialization----");
return bean;
}
/**在初始bean之前调用的这个方法 在init方法之前执行,在set方法之后*/
@Override
public Object postProcessBeforeInitialization(Object bean, String arg1)
throws BeansException {
/**instanceof 判断前者是否是后者的一个实例*/
if(bean instanceof TeacherService){
System.out.println("--这是在init之前进行修改bean的属性值--");
/*这里我们不能直接new一个对象 因为bean本身就是一个对象,直接转换就可以了*/
((TeacherService)bean).setName("Longmanfei");
}
System.out.println("---这是init之前执行的方法postProcessBeforeInitialization---");
return bean;
}
}
//Junit 测试方法
public class App {
@Test
public void test1(){
/**加载容器*/
ApplicationContext ac = new ClassPathXmlApplicationContext(new String[]{"applic*.xml"});
/**调用getbean方法*/
TeacherService ts = (TeacherService) ac.getBean("teacherService");
ts.display();
/**调用close方法关闭bean*/
AbstractApplicationContext aac =(AbstractApplicationContext) ac;
aac.close();
}
}
//这是执行结果(当加载容器的时候会判断是否有实现接口的BeanPostProcessor bean,如果有其他Bean就会按照特定的顺序去执行,并且执行实现接口的bean里的方法)
----这是teacherservice的set方法----
--这是在init之前进行修改bean的属性值--
----这是teacherservice的set方法----
---这是init之前执行的方法postProcessBeforeInitialization---
--------这是teacherservice的init的方法-------------
----这是init之后执行的方法postProcessAfterInitialization----
Longmanfei-----------------20
---------这是销毁(destroy)方法----------
<!--EndFragment-->
<!--EndFragment-->
分享到:
相关推荐
ora-01033:oracle initialization or shutdown in progress 解决方法 ora-01033:oracle initialization or shutdown in progress 解决方法 ora-01033:oracle initialization or shutdown in progress 解决方法 ora-...
解决:oracle_plsql连服务端时 Initialization error could initialize错误处理方法
运行QQ提示initialization failure0x0000000c解决方法
使用 QT5.12.5 版本,进行 HTTPS 请求时,出现 TLS initialization failed,缺少的 OpenSSL 的库
初始化Initialization初始化Initialization初始化Initialization
ApplicationInitialization for UI x64 ApplicationInitialization for UI x64
TIJ4 Initialization Cleanup
当我们把网站部署在IIS7或IIS6S的时候,每当IIS或是ApplicationPool重启后,第一次请求网站反应总是很慢,原因大家都知道(不知道可以参考这个动画说明ASP.NET网页第一个Request会比较慢的原因)。所以每次网站更新...
we build on the initialization method proposed by Martinelli [1] and extended by Kaiser et al. [2], modifying it to be more general and efficient. We improve accuracy with several rounds of visual-...
ApplicationInitialization for UI x64
bf533的initialization中需要选择的.dxe工程Init_Sdram,配置在Poject Option - initialization ,烧录LDR需要选择,要和自己所应用的实际SDRAM配置一致才能启动成功
解决方法: 进入dos: 以DBA用户登录,具体命令是 sqlplus /NOLOG SQL>connect sys/change_on_install as sysdba 提示:已成功 SQL>shutdown normal 提示:数据库已经关闭 已经卸载数据库 ORACLE 例程已经关闭 ...
Net: Board Net Initialization Failed No ethernet found.解决方案,如实际开发中有遇到,仅供参考 1. 网卡没有插好或者网卡损坏。 2. 网卡的驱动程序没有正确加载。 3. 网线没有接好或者网线损坏。 4. 网络设备...
Oracle initialization or shutdown in progress 是oracle误删除文件所造成的sqlplus不能登陆的问题 正确,经验。
NULL 博文链接:https://1960370817.iteye.com/blog/2401053
gtk initialization failed可能的解决方法之一-附件资源
SoftICE Initialization Help CHM
Delphi 调用WebService 出错 1.新建一个App, 放上一个button, listbox, HTTPRIO 2.新建webservices -$amp;...而且要加到initialization 最后一行,我加到initialization 之后紧接着第一行,就一直报错。
吴恩达第二课第一周编程作业Initialization全代码
数据库导致连接出现异常的解决办法整理,这是 oracle连接问题的具体解决方案