图片出自spring生命周期图片
https://www.cnblogs.com/zrtqsk/p/3735273.html
spring生命周期例子:
实现BeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean接口
package org.example.ssm.springbeantest;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
public class Person implements BeanNameAware, BeanFactoryAware,
InitializingBean, DisposableBean {
private String name;
private String address;
private int phone;
private BeanFactory beanFactory;
private String beanName;
//BeanFactoryAware
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("【BeanFactoryAware接口】调用BeanFactoryAware.setBeanFactory()");
this.beanFactory = beanFactory;
}
//BeanNameAware
@Override
public void setBeanName(String name) {
System.out.println("【BeanNameAware接口】调用BeanNameAware.setBeanName()");
this.beanName = name;
}
//DisposableBean
@Override
public void destroy() throws Exception {
System.out.println("【DisposableBean接口】调用DisposableBean的destroy()");
}
//InitializingBean
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("【InitializingBean接口】调用InitializingBean的afterPropertiesSet()");
}
//通过<bean>的init-method属性指定的初始化方法
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犯法");
}
public Person(){
System.out.println("【构造器】调用Person的无参构造器实例化");
}
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{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
", phone=" + phone +
", beanFactory=" + beanFactory +
", beanName='" + beanName + '\'' +
'}';
}
}
实现InstantiationAwareBeanPostProcessorAdapter接口
package org.example.ssm.springbeantest;
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
import java.beans.PropertyDescriptor;
public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {
public MyInstantiationAwareBeanPostProcessor(){
super();
System.out.println("这是InstantiationAwareBeanProcessorAdapter实现类构造器");
}
//接口方法,实例化Bean之前调用
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
System.out.println("InstantiationAwareBeanPostProcessor调用postProcessBeforeInstantiation方法");
return null;
}
//接口方法,实例化Bean之后调用
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("InstantiationAwareBeanPostProcessor调用postProcessAfterInitialization方法");
return bean;
}
//接口方法,设置某个属性时调用
@Override
public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
System.out.println("InstantiationAwareBeanPostProcessor调用postProcessPropertyValues方法");
return pvs;
}
}
实现BeanPostProcessor 接口
package org.example.ssm.springbeantest;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
public MyBeanPostProcessor() {
System.out.println("这是BeanPostProcessor实现类构造器!!");
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeanPostProcessor接口方法postProcessBeforeInitialization对属性更改");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeanPostProcessor接口方法postProcessAfterInitialization对属性更改");
return bean;
}
}
实现BeanFactoryPostProcessor
package org.example.ssm.springbeantest;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public MyBeanFactoryPostProcessor(){
super();
System.out.println("这是BeanFactoryPostProcessor实现类构造器");
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("MyBeanFactoryPostProcessor调用postProcessBeanFactory方法");
BeanDefinition beanDefinition = beanFactory.getBeanDefinition("person");
//设置值
beanDefinition.getPropertyValues().addPropertyValue("phone", "110");
}
}
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-3.2.xsd">
<bean id="beanPostProcessor" class="org.example.ssm.springbeantest.MyBeanPostProcessor"></bean>
<bean id="instantiationAwareBeanPostProcessor" class="org.example.ssm.springbeantest.MyInstantiationAwareBeanPostProcessor"></bean>
<bean id="beanFactoryPostProcessor" class="org.example.ssm.springbeantest.MyBeanFactoryPostProcessor"></bean>
<bean id="person" class="org.example.ssm.springbeantest.Person" init-method="myInit"
destroy-method="myDestroy" scope="singleton" >
<property name="name" value="张三"/>
<property name="address" value="广州"/>
<property name="phone" value="1397325069" />
</bean>
</beans>
测试
import org.example.ssm.springbeantest.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
System.out.println("初始化容器");
ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println("容器初始化成功");
//得到Person,并使用
Person person = factory.getBean("person", Person.class);
System.out.println(person);
System.out.println("现在开始关闭容器");
((ClassPathXmlApplicationContext)factory).registerShutdownHook();
}
}
结果:
初始化容器
九月 09, 2020 10:34:45 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@46fbb2c1: startup date [Wed Sep 09 10:34:45 CST 2020]; root of context hierarchy
九月 09, 2020 10:34:46 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
这是BeanFactoryPostProcessor实现类构造器
MyBeanFactoryPostProcessor调用postProcessBeanFactory方法
这是BeanPostProcessor实现类构造器!!
这是InstantiationAwareBeanProcessorAdapter实现类构造器
InstantiationAwareBeanPostProcessor调用postProcessBeforeInstantiation方法
【构造器】调用Person的无参构造器实例化
InstantiationAwareBeanPostProcessor调用postProcessPropertyValues方法
【注入属性】注入属性name
【注入属性】注入属性address
【注入属性】注入属性phone
【BeanNameAware接口】调用BeanNameAware.setBeanName()
【BeanFactoryAware接口】调用BeanFactoryAware.setBeanFactory()
BeanPostProcessor接口方法postProcessBeforeInitialization对属性更改
【InitializingBean接口】调用InitializingBean的afterPropertiesSet()
【init-method】调用<bean>的init-method属性指定的初始化方法
BeanPostProcessor接口方法postProcessAfterInitialization对属性更改
InstantiationAwareBeanPostProcessor调用postProcessAfterInitialization方法
容器初始化成功
Person{name='张三', address='广州', phone=110, beanFactory=org.springframework.beans.factory.support.DefaultListableBeanFactory@174d20a: defining beans [beanPostProcessor,instantiationAwareBeanPostProcessor,beanFactoryPostProcessor,person]; root of factory hierarchy, beanName='person'}
现在开始关闭容器
【DisposableBean接口】调用DisposableBean的destroy()
【destroy-method】调用<bean>的destroy-method犯法