完整Bean的生命周期
1. instantiate bean对象实例化 2. populate properties 封装属性 3. 如果Bean实现BeanNameAware 执行 setBeanName 4. 如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext 5. 如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization 6. 如果Bean实现InitializingBean 执行 afterPropertiesSet 7. 调用<bean init-method="init"> 指定初始化方法 init 8. 如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization 9. 执行业务处理 10.如果Bean实现 DisposableBean 执行 destroy 11.调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy
以下代码示例进行讲解
UserDao
public interface UserDao { public void addUser(); }
UserDaoImpl
public class UserDaoImpl implements UserDao, BeanNameAware, ApplicationContextAware, InitializingBean, DisposableBean { private String name; public UserDaoImpl() { System.out.println("第一步 Bean的构造器执行...."); } public void setName(String name) { System.out.println("第二步 属性依赖注入...."); this.name = name; } @Override public void setBeanName(String beanName) { System.out.println("第三步 获得当前Bean在Spring 注册 Bean 名字 :" + beanName); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("第四步 获得当前 Spring上下文 :" + applicationContext); } @Override public void afterPropertiesSet() throws Exception { System.out.println("第六步 属性封装完成 ...."); } public void myinit() { System.out.println("第七步 自定义初始化方法..."); } @Override public void addUser() { System.out.println("第九步 ,使用业务Bean 执行业务操作...."); System.out.println("用户添加"); } @Override public void destroy() throws Exception { System.out.println("第十步, 不需要配置 调用释放资源方法"); } public void mydestroy() { System.out.println("第十一步 自定义 释放资源方法"); } }
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userDao" class="com.demo.UserDaoImpl" init-method="myinit" destroy-method="mydestroy"> <property name="name" value="helloWorld"></property> </bean> <bean class="com.demo.MyBeanPostProcessor"></bean> </beans>
MyBeanPostProcessor
@Override public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException { System.out.println("第八步 BeanPostProcessor 后处理Bean 初始化完成后增强...."); if (beanName.equals("userDao")) { return Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method,Object[] args) throws Throwable { if (method.getName().equals("addUser")) { System.out.println("增强addUser================"); } // 不增强 return method.invoke(bean, args); } }); } return bean; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("第五步BeanPostProcessor 后处理Bean 初始化完成前增强... "+beanName); return bean; }
UserTest
@Test public void demo() { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao) applicationContext.getBean("userDao"); userDao.addUser(); applicationContext.close(); }
打印结果
第一步 Bean的构造器执行.... 第二步 属性依赖注入.... 第三步 获得当前Bean在Spring 注册 Bean 名字 :userDao 第四步 获得当前 Spring上下文 第五步BeanPostProcessor 后处理Bean 初始化完成前增强... userDao 第六步 属性封装完成 .... 第七步 自定义初始化方法... 第八步 BeanPostProcessor 后处理Bean 初始化完成后增强.... 增强addUser================ 第九步 ,使用业务Bean 执行业务操作.... 用户添加 第十步, 不需要配置 调用释放资源方法 第十一步 自定义 释放资源方法