目录
本文参考了 https://www.cnblogs.com/zrtqsk/p/3735273.html
Spring – Bean Life Cycle
1、Spring容器Bean完整生命周期
2、核心代码
UserService.java
package com.gazgeek.helloworld.service;
import javax.annotation.PostConstruct;
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.stereotype.Service;
@Service
public class UserService
implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean {
private String name;
private String address;
private int phone;
private BeanFactory beanFactory;
private String beanName;
public UserService() {
System.out.println("【构造器】调用UserService的构造器实例化");
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("【注入属性】注入属性name");
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
System.out.println("【注入属性】注入属性address");
this.address = address;
}
public int getPhone() {
return phone;
}
public void setPhone(int phone) {
System.out.println("【注入属性】注入属性phone");
this.phone = phone;
}
@Override
public String toString() {
return "Person [address=" + address + ", name=" + name + ", phone=" + phone + "]";
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("【BeanFactoryAware接口】调用BeanFactoryAware.setBeanFactory()");
this.beanFactory = beanFactory;
}
@Override
public void setBeanName(String beanName) {
System.out.println("【BeanNameAware接口】调用BeanNameAware.setBeanName()");
this.beanName = beanName;
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("【InitializingBean接口】调用InitializingBean.afterPropertiesSet()");
}
@Override
public void destroy() throws Exception {
System.out.println("【DiposibleBean接口】调用DiposibleBean.destory()");
}
// 通过<bean>的init-method属性指定的初始化方法
@PostConstruct
public void myInit() {
System.out.println("【init-method】调用<bean>的init-method属性指定的初始化方法");
}
// 通过<bean>的destroy-method属性指定的初始化方法
public void myDestroy() {
System.out.println("【destroy-method】调用<bean>的destroy-method属性指定的初始化方法");
}
}
MyBeanPostProcessor.java
package com.gazgeek.helloworld.service;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
public MyBeanPostProcessor() {
super();
System.out.println("调用MyBeanPostProcessor构造器!!");
}
@Override
public Object postProcessAfterInitialization(Object beanObject, String beanName)
throws BeansException {
if ("userService".equals(beanName)) {
System.out.println(
"BeanPostProcessor接口方法postProcessAfterInitialization()对beanObject进行设置,beanName:"
+ beanName);
}
return beanObject;
}
@Override
public Object postProcessBeforeInitialization(Object beanObject, String beanName)
throws BeansException {
if ("userService".equals(beanName)) {
System.out.println(
"BeanPostProcessor接口方法postProcessBeforeInitialization()对beanObject进行设置,beanName:"
+ beanName);
}
return beanObject;
}
}
MyInstantiationAwareBeanPostProcessor.java
package com.gazgeek.helloworld.service;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
import org.springframework.stereotype.Component;
@Component
public class MyInstantiationAwareBeanPostProcessor
extends InstantiationAwareBeanPostProcessorAdapter {
public MyInstantiationAwareBeanPostProcessor() {
super();
System.out.println("调用MyInstantiationAwareBeanPostProcessor类构造器!");
}
// 接口方法、实例化Bean之前调用
@Override
public Object postProcessBeforeInstantiation(Class beanClass, String beanName)
throws BeansException {
if ("userService".equals(beanName)) {
System.out.println(
"MyInstantiationAwareBeanPostProcessor调用postProcessBeforeInstantiation()方法,beanName:"
+ beanName);
}
return null;
}
// 接口方法、实例化Bean之后调用
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
if ("userService".equals(beanName)) {
System.out.println(
"MyInstantiationAwareBeanPostProcessor调用postProcessAfterInitialization()方法,beanName:"
+ beanName);
}
return bean;
}
// 接口方法、设置某个属性时调用
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
throws BeansException {
if ("userService".equals(beanName)) {
System.out.println(
"MyInstantiationAwareBeanPostProcessor调用postProcessPropertyValues()方法,beanName:"
+ beanName);
}
return super.postProcessProperties(pvs, bean, beanName);
}
}