Bean生命周期相关接口介绍:java
Spring配置文件: 配置简单的Bean和1个Bean后置处理器,而且设置自定义的初始化方法:init-method="defineInitMethod"spring
<bean id="concreteBean" class="com.zhiwei.lifecycle.ConcreteBean" init-method="defineInitMethod" > <property name="name" value="squirrel"/> </bean> <bean class="com.zhiwei.lifecycle.BeanPostProcessorCase"/>
Bean对象,实现相关生命周期接口:app
package com.zhiwei.lifecycle; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class ConcreteBean implements BeanNameAware,BeanFactoryAware, ApplicationContextAware,InitializingBean,DisposableBean{ private String name; public ConcreteBean() { System.err.println("ConcreteBean实例对象被建立......."); } public String getName() { return name; } public void setName(String name) { System.err.println("ConcreteBean实例对象默认name属性注入........."); this.name = name; } /** * BeanNameAware:获取Bean在BeanFactory的名称:id */ @Override public void setBeanName(String name) { System.err.println("BeanNameAware:ConcreteBean实例对象在BeanFactory的名称:"+name); } /** * BeanFactoryAware:获取Bean所在的Beanfactory */ @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { boolean flag = beanFactory.containsBean("concreteBean"); //使用BeanFactory的方法判断Bean是否存在 System.err.println("BeanfactoryAware:BeanFactory是否存在concreteBean定义:"+flag); } /** * ApplicationContextAware:获取Bean实例所在的高级BeanFactory容器:ApplicationContext */ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { boolean flag = applicationContext.containsBean("concreteBean"); System.err.println("ApplicationContextAware:ApplicationContext是否存在concreteBean定义:"+flag); } /** * InitializingBean:Bean属性设置完成以后的自定义初始化工做 */ @Override public void afterPropertiesSet() throws Exception { System.err.println("ConcreteBean完成属性设置,正在进行初始化........"); } /** * DisposableBean:销毁Bean相关的资源:destroy-method属性 */ @Override public void destroy() throws Exception { System.err.println("IOC容器正在销毁Bean资源........"); } /** * 自定义初始化方法:init-method属性 */ public void defineInitMethod(){ System.err.println("Bean正在自定义初始化......"); } }
Bean后置处理器:ide
package com.zhiwei.lifecycle; import java.util.Date; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; /** * BeanPostProcessor:后置处理器(针对全部的Bean实例) 做用:Bean彻底实例化以前能够修改Bean的属性 */ public class BeanPostProcessorCase implements BeanPostProcessor { /** * Bean初始化以前被调用 */ public Object postProcessBeforeInitialization(Object object, String id) throws BeansException { System.err.println("正在进行" + object + "实例初始化:,id =" + id + ",时间:" + new Date()); return object; }; /** * Bean初始化以后被调用 */ @Override public Object postProcessAfterInitialization(Object object, String id) throws BeansException { System.err.println("已经完成" + object + "实例初始化:,id =" + id + ",时间:" + new Date()); return object; } }
测试类:post
package com.zhiwei.lifecycle; import org.springframework.context.*; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainTest { public static void main(String[] args) { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("com/zhiwei/lifecycle/applicationContext.xml"); ConcreteBean concreteBean=(ConcreteBean) applicationContext.getBean("concreteBean"); System.out.println(concreteBean.getName()); ConfigurableApplicationContext cac = (ConfigurableApplicationContext) applicationContext; cac.close(); //关闭IOC容器 } }
控制台打印日志:测试
ConcreteBean实例对象被建立....... ConcreteBean实例对象默认name属性注入......... BeanNameAware:ConcreteBean实例对象在BeanFactory的名称:concreteBean BeanfactoryAware:BeanFactory是否存在concreteBean定义:true ApplicationContextAware:ApplicationContext是否存在concreteBean定义:true 正在进行com.zhiwei.lifecycle.ConcreteBean@6ebc05a6实例初始化:,id =concreteBean,时间:Tue Feb 14 14:50:47 CST 2017 ConcreteBean完成属性设置,正在进行初始化........ Bean正在自定义初始化...... 已经完成com.zhiwei.lifecycle.ConcreteBean@6ebc05a6实例初始化:,id =concreteBean,时间:Tue Feb 14 14:50:47 CST 2017 squirrel IOC容器正在销毁Bean资源........