流程图
示例
<?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="myBeanPostProcessor" class="mncode.MyBeanPostProcessor"/>
<bean id="myBeanFactoryPostProcessor" class="mncode.MyBeanFactoryPostProcessor"/>
<bean id="myInstantiationAwareBeanPostProcessor" class="mncode.MyInstantiationAwareBeanPostProcessor"/>
<bean id="product" class="mncode.Product" scope="singleton" init-method="initMethod" destroy-method="destroyMethod">
<property name="name" value="螺丝钉"/>
</bean>
</beans>
MyBeanFactoryPostProcessor
:
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("调用BeanFactoryPostProcessor的postProcessBeanFactory的方法");
}
}
MyInstantiationAwareBeanPostProcessor
:
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
System.out.println("调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法");
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
System.out.println("调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法");
return true;
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
throws BeansException {
System.out.println("调用InstantiationAwareBeanPostProcessor的postProcessProperties方法");
return null;
}
}
MyBeanPostProcessor
:
public class MyBeanPostProcessor implements 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;
}
}
Product
:
public class Product implements BeanNameAware, InitializingBean, DisposableBean {
private String name;
public Product() {
System.out.println("构造函数");
}
public void setName(String name) {
this.name = name;
System.out.println("调用Product的setName方法");
}
public String getName() {
return name;
}
@Override
public void setBeanName(String name) {
System.out.println("调用BeanNameAware的setBeanName方法");
}
@Override
public void afterPropertiesSet() {
System.out.println("调用InitializingBean的afterPropertiesSet方法");
}
public void initMethod() {
System.out.println("调用init-method对应的方法");
}
public void destroyMethod() {
System.out.println("调用destroy-method对应的方法");
}
@Override
public void destroy() {
System.out.println("调用DisposableBean的destroy方法");
}
}
测试
简单容器测试
@Before
public void init() {
// 资源
ClassPathResource resource = new ClassPathResource("bean.xml");
// 创建容器
factory = new DefaultListableBeanFactory();
// 创建读取器
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
// BeanDefinition载入和注册
reader.loadBeanDefinitions(resource);
}
@Test
public void test16() {
// 简单容器不会自动注册处理器,所以这里需要手动注册
MyBeanFactoryPostProcessor processor1 = new MyBeanFactoryPostProcessor();
processor1.postProcessBeanFactory(factory);
MyInstantiationAwareBeanPostProcessor processor2 = new MyInstantiationAwareBeanPostProcessor();
factory.addBeanPostProcessor(processor2);
MyBeanPostProcessor processor3 = new MyBeanPostProcessor();
factory.addBeanPostProcessor(processor3);
Product product = (Product) factory.getBean("product");
System.out.println("商品名称:" + product.getName());
// 销毁容器
factory.destroySingletons();
}
输出结果:
调用BeanFactoryPostProcessor的postProcessBeanFactory的方法
调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法
构造函数
调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法
调用InstantiationAwareBeanPostProcessor的postProcessProperties方法
调用Product的setName方法
调用BeanNameAware的setBeanName方法
调用BeanPostProcessor的postProcessBeforeInitialization方法
调用InitializingBean的afterPropertiesSet方法
调用init-method对应的方法
调用BeanPostProcessor的postProcessAfterInitialization方法
商品名称:螺丝钉
调用DisposableBean的destroy方法
调用destroy-method对应的方法
高级容器测试
@Test
public void test17() {
// 高级容器能自动扫描处理器并注册,所以这里不需要手动注册
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
Product product = (Product) context.getBean("product");
System.out.println("商品名称:" + product.getName());
// 销毁容器
context.registerShutdownHook();
}
输出结果:
调用BeanFactoryPostProcessor的postProcessBeanFactory的方法
调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法
构造函数
调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法
调用InstantiationAwareBeanPostProcessor的postProcessProperties方法
调用Product的setName方法
调用BeanNameAware的setBeanName方法
调用BeanPostProcessor的postProcessBeforeInitialization方法
调用InitializingBean的afterPropertiesSet方法
调用init-method对应的方法
调用BeanPostProcessor的postProcessAfterInitialization方法
商品名称:螺丝钉
调用DisposableBean的destroy方法
调用destroy-method对应的方法
prototype模式测试
修改配置文件,将scope
改为prototype
:
<bean id="product" class="mncode.Product" scope="prototype" init-method="initMethod" destroy-method="destroyMethod">
<property name="name" value="螺丝钉"/>
</bean>
输出结果:
调用BeanFactoryPostProcessor的postProcessBeanFactory的方法
调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法
构造函数
调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法
调用InstantiationAwareBeanPostProcessor的postProcessProperties方法
调用Product的setName方法
调用BeanNameAware的setBeanName方法
调用BeanPostProcessor的postProcessBeforeInitialization方法
调用InitializingBean的afterPropertiesSet方法
调用init-method对应的方法
调用BeanPostProcessor的postProcessAfterInitialization方法
商品名称:螺丝钉