`
Longmanfei
  • 浏览: 48071 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

谁调用了我的postProcessBefore(或After)Initialization()方法

阅读更多

要想知道postProcessBeforeInitialization()postProcessAfterInitialization()这两个方法在spring中是如和被调用的,或者可是说成是什么时候才会去调用的,那首先我们就要清楚的了解Bean的生命周期。

那在springbean的生命周期究竟是怎样的呢

1. 容器寻找Bean的定义信息并将其实例化

2. 使用依赖注入,spring按照Bean定义信息配置Bean的所有属性

3. 如果Bean实现了BeanNameAware接口,工厂调用BeanSetBeanName()方法传递BeanID

4. 如果Bean实现了BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身

5. 如果BeanPostProcessorBean关联,那么其postProcessBeforeInitialization()方法将被调用

6. 如果Bean指定了init-method方法,将被调用

7. 最后,如果有BeanPostProcessorBean关联,那么其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-->
2
4
分享到:
评论

相关推荐

    Oracle initialization or shutdown in progress 解决方法

    Oracle Initialization or Shutdown in Progress 解决方法 Oracle Initialization or Shutdown in Progress 是 Oracle 中一个常见的问题,即 Oracle 初始化或关闭过程中无法连接数据库的问题。今天,我们将详细介绍...

    delphi中提示“尚未调用coinitialize错误”的解决方法.docx

    Delphi 中解决 "未调用 CoInitialize" 错误的方法 在 Delphi 开发中,遇到 "尚未调用 CoInitialize" 错误是一种常见的问题。这个错误通常发生在使用 COM 组件或 OLE 对象时,例如使用 ADO 数据库组件或 WebBrowser ...

    JAVA RMI远程调用方法代码

    Java Remote Method Invocation (RMI) 是Java平台提供的一种用于创建分布式应用程序的技术,它允许对象在不同的JVM(Java虚拟机)之间通过网络进行方法调用。RMI的主要优点是其透明性,即开发者可以像调用本地方法...

    JUnit报initializationError

    例如,可能会看到某个类或方法的名字,这将帮助我们定位问题所在。 标签 "源码" 和 "工具" 提示我们,解决此问题可能需要对 JUnit 的源码有一定的了解,以及利用一些调试工具。对于 JUnit 源码,我们可以研究其内部...

    oracle_plsql连服务端时 Initialization error could initialize错误处理方法

    解决:oracle_plsql连服务端时 Initialization error could initialize错误处理方法

    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-01033: ...

    QT5.12.5 TLS initialization failed

    在使用这个版本进行HTTPS通信时,可能会遇到“TLS initialization failed”的错误,这通常意味着在执行安全套接层(SSL)或传输层安全(TLS)协议时遇到了问题。TLS是互联网上广泛使用的加密通信协议,用于保护数据...

    delphi中提示“尚未调用coinitialize错误”的解决方法.pdf

    解决这个问题的方法是在DLL的初始化部分调用CoInitialize,并在最终化部分调用CoUninitialize。例如: ```delphi initialization CoInitialize(nil); finalization CoUninitialize; end. ``` 对于封装了...

    运行QQ提示initialization failure0x0000000c解决方法

    如果以上方法均未能解决问题,建议检查计算机是否存在病毒或恶意软件,使用可靠的安全软件进行全面扫描。同时,检查系统更新,确保操作系统为最新状态,以提高软件的兼容性和稳定性。 通过上述详细步骤,大多数情况...

    Application Initialization UI for IIS 7.5

    ApplicationInitialization for UI x64 ApplicationInitialization for UI x64

    TIJ4 Initialization Cleanup

    TIJ4 Initialization Cleanup

    Application Initialization Module for IIS 7.5

    当我们把网站部署在IIS7或IIS6S的时候,每当IIS或是ApplicationPool重启后,第一次请求网站反应总是很慢,原因大家都知道(不知道可以参考这个动画说明ASP.NET网页第一个Request会比较慢的原因)。所以每次网站更新...

    Net: Board Net Initialization Failed No ethernet found.解决方案

    Net: Board Net Initialization Failed No ethernet found.解决方案,如实际开发中有遇到,仅供参考 1. 网卡没有插好或者网卡损坏。 2. 网卡的驱动程序没有正确加载。 3. 网线没有接好或者网线损坏。 4. 网络设备...

    initialization.dxe.rar

    bf533的initialization中需要选择的.dxe工程Init_Sdram,配置在Poject Option - initialization ,烧录LDR需要选择,要和自己所应用的实际SDRAM配置一致才能启动成功

    ApplicationInitialization for UI x64

    "ApplicationInitialization for UI x64" 是一个专为64位操作系统设计的用户界面应用程序初始化模块。这个模块主要关注的是提升用户体验,确保UI(用户界面)在启动时能快速、稳定地加载,同时减少应用程序在启动...

    Delphi DLLExportInterface 动态调用Dll

    6. **调用接口方法**:一旦创建了接口实例,就可以像使用普通的 Delphi 对象一样调用其方法: ```delphi if Assigned(Instance) then Result := Instance.MyFunction(42, 'Hello'); ``` 总结来说,Delphi 中的 ...

    DELPHI调用VB ACTIVEXDLL

    - **调用方法**:一旦对象实例化成功,你可以像调用任何其他Delphi方法一样,调用ActiveX DLL中的函数和方法。 5. **注意事项** - 确保Delphi和VB的版本兼容,因为不同的版本可能有不同的接口定义和行为。 - ...

    BPL_调用举例(Delphi)

    ### BPL调用举例(Delphi) #### 一、引言 在Delphi开发环境中,BPL(Borland Package Library)是一种常见的组件打包格式,主要用于封装编译后的组件类库,便于重用与分发。本文将通过一系列示例详细介绍如何在...

    [ScriptService] 特性的 Web 服务才能从脚本中调用

    ### [ScriptService] 特性的 Web 服务才能从脚本中调用 #### 背景与概述 在开发Web应用程序时,我们经常会遇到需要从前端JavaScript调用后端Web服务的情况。为了实现这一功能,ASP.NET AJAX框架提供了一种机制,即...

Global site tag (gtag.js) - Google Analytics