一、生命周期图
1、Instantiate:bean对象实例化
2、Populate properties:封装属性
3、如果Bean实现BeanNameAware接口,执行setBeanName方法
4、如果Bean实现BeanFactoryAware接口,执行setBeanFactory方法,获取Spring容器
5、如果存在类实现BeanPostProcessor接口(后处理Bean),执行postProcessBeforeInitialization方法
6、如果Bean实现InitializingBean接口,执行afterPropertiesSet方法
7、调用<bean init-method=“init”>指定初始化方法init
8、如果存在类实现BeanPostProcessor接口(处理Bean),执行postProcessAfterInitialization方法
执行业务处理
9、如果Bean实现DisposableBean接口,执行destroy方法
10、调用<bean destroy-method=“customerDestroy”>,指定销毁方法customerDestroy
二、示例代码如下
User.java
package com.zzu.model;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
public class User implements BeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean {
private String username;
private String password;
public User() {
System.out.println("1.实例化");
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
System.out.println("2.属性赋值:" + username);
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
@Override
public void setBeanName(String s) {
System.out.println("3.设置bean的名字:" + s);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
//把对象放进工厂,放进容器
System.out.println("4.bean工厂:" + beanFactory);
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("6.属性赋值完成");
}
public void myInit(){
System.out.println("7.自定义的初始化方法");
}
@Override
public void destroy() throws Exception {
//资源释放
System.out.println("9.bean被销毁");
}
public void myDestroy(){
//资源释放
System.out.println("10.自定义的销毁方法");
}
}
MyBeanPostProcessor.java
package com.zzu.model;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
//可以用于多个对象共同的事务处理
System.out.println("5.预处理:" + bean + ":" + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("8.后处理:" + bean + ":" + beanName);
return bean;
}
}
spring-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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="user" class="com.zzu.model.User" init-method="myInit" destroy-method="myDestroy">
<property name="username" value="Tom"></property>
<property name="password" value="123"></property>
</bean>
<!--配置bean的处理器-->
<bean class="com.zzu.model.MyBeanPostProcessor"></bean>
</beans>
Test.java
package com.zzu.test;
import com.zzu.model.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) throws Exception {
ApplicationContext context =
new ClassPathXmlApplicationContext("spring-config.xml");
User user = (User) context.getBean("user");
System.out.println(user);
//关闭容器
context.getClass().getMethod("close").invoke(context);
}
}