《精通Spring4.X企业应用开发实战》读后感第四章(BeanFactory生命周期)










package com.smart; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*; public class Car implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean{
private String brand;
private String color;
private int maxSpeed; private BeanFactory beanFactory;
private String beanName; //默认构造函数
public Car(){System.out.println("调用Car()构造函数");} //带参构造函数
public Car(String brand, String color, int maxSpeed) {
this.brand = brand;
this.color = color;
this.maxSpeed = maxSpeed;
} //未带参方法
public void introduce() {
System.out.println("brand:" + brand + ";color:" + color + ";maxSpeed:" + maxSpeed);
} public String getBrand() {
return brand;
} public void setBrand(String brand) {
System.out.println("调用setBrand()设置属性");
this.brand = brand;
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
} public int getMaxSpeed() {
return maxSpeed;
} public void setMaxSpeed(int maxSpeed) {
this.maxSpeed = maxSpeed;
} // BeanFactoryAware接口方法
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("调用BeanFactoryAware.setBeanFactory().");
this.beanFactory = beanFactory;
} // BeanNameAware接口方法
public void setBeanName(String s) {
System.out.println("调用BeanNameAware.setBeanName().");
this.beanName = s;
} // DisposableBean接口方法
public void destroy() throws Exception {
System.out.println("调用DisposableBean.destroy().");
} // InitializingBean接口方法
public void afterPropertiesSet() throws Exception {
System.out.println("调用InitialingBean.afterPropertiesSet().");
} // 通过<bean>的init-method属性指定的初始方法
public void myInit() {
System.out.println("调用init-method属性指定的myInit(), 将maxSpeed设置为240");
this.maxSpeed = 240;
} //同过<bean>的destroy-method属性指定的销毁方法
public void myDestroy() {
System.out.println("调用destroy-method属性指定的myDestroy().");
} }

package com.smart.beanfactory; 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 { @Override
// 1.接口方法,在实例化Bean前调用
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
// 1-1. 仅对容器中的car Bean进行处理
if ("car".equals(beanName)) {
System.out.println("调用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation().");
}
return null;
} @Override
// 2.接口方法,在实例化Bean后调用
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if ("car".equals(beanName)) {
System.out.println("调用InstantiationAwarePostProcessor.postProcessorAfterInstantiation().");
}
return true;
} @Override
// 3.接口方法,在设置某个属性时调用
public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
// 3-1. 仅对容器中的car Bean进行处理, 还可以同过pds入参进行过滤
if ("car".equals(beanName)) {
System.out.println("调用InstantiationAwarePostProcessor.postProcessPropertyValues().");
}
return pvs;
}
}

package com.smart.beanfactory; import com.smart.Car;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; public class MyBeanPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if ("car".equals(beanName)) {
Car car = (Car) bean;
if (car.getColor() == null) {
System.out.println("调用BeanPostProcessor.postProcessBeforeInitialization()," +
"若color为空,设置为默认黑色");
car.setColor("黑色");
}
}
return bean;
} public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if ("car".equals(beanName)) {
Car car = (Car) bean;
if (car.getMaxSpeed() >= 200) {
System.out.println("调用BeanPostProcessor.postProcessAfterInitialization()," +
"将maxSpeed设置为200");
car.setMaxSpeed(200);
}
}
return bean;
}
}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="car" class="com.smart.Car"
init-method="myInit"
destroy-method="myDestroy"
p:brand="红旗CA72"
p:maxSpeed="200"/> </beans>


package com.smart.beanfactory; import com.smart.Car;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource; public class BeanLifeCycle {
public static void lifeCycleInBeanFactory() {
// 1. 装载配置文件并启动容器
Resource res = new ClassPathResource("beans.xml");
BeanFactory bf = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader((DefaultListableBeanFactory) bf);
reader.loadBeanDefinitions(res); //后处理器的实际调用顺序与注册顺序无关,在具有多个后处理器的情况下,必须通过实现
//org.springframework.core.Ordered接口来确定调用顺序
// 2. 向容器中注册MyBeanPostProcessor后处理器
((ConfigurableBeanFactory) bf).addBeanPostProcessor(new MyBeanPostProcessor());
// 3. 向容器中注册MyInstantiationAwareBeanPostProcessor后处理器
((ConfigurableBeanFactory) bf).addBeanPostProcessor(new MyInstantiationAwareBeanPostProcessor()); // 4. 第一次从容器中获得car, 将触发容器实例化该Bean,这将引发Bean生命周期方法的调用
Car car1 = (Car) bf.getBean("car");
car1.introduce();
car1.setColor("红色"); // 5. 第二次从容器中获取car, 直接从缓存池中获取
Car car2 = (Car) bf.getBean("car"); // 6. 查看car1和car2是否指向同一引用
System.out.println("car1==car2: " + (car1 == car2)); // 7. 关闭容器
((DefaultListableBeanFactory) bf).destroySingleton("car"); } public static void main(String[] args) {
lifeCycleInBeanFactory();
}
}








《精通Spring4.X企业应用开发实战》读后感第四章(BeanFactory生命周期)的更多相关文章
- 《精通Spring4.x企业应用开发实战》第三章
这一章节主要介绍SpringBoot的使用,也是学习的重点内容,之后就打算用SpringBoot来写后台,所以提前看一下还是很有必要的. 3.SpringBoot概况 3.1.1SpringBoot发 ...
- 《精通Spring4.X企业应用开发实战》读后感第四章(资源访问)
package com.smart.resource; import org.springframework.core.io.ClassPathResource; import org.springf ...
- 《精通Spring4.X企业应用开发实战》读后感第七章(创建增强类)
- 《精通Spring4.X企业应用开发实战》读后感第七章(AOP基础知识、jdk动态代理,CGLib动态代理)
- 《精通Spring4.X企业应用开发实战》读后感第七章(AOP概念)
- 《精通Spring4.X企业应用开发实战》读后感第六章(容器事件)
- 《精通Spring4.X企业应用开发实战》读后感第六章(国际化)
- 《精通Spring4.X企业应用开发实战》读后感第六章(引用Bean的属性值)
- 《精通Spring4.X企业应用开发实战》读后感第六章(使用外部属性文件)
- 《精通Spring4.X企业应用开发实战》读后感第六章(属性编辑器)
随机推荐
- 编译EasyDSS rtmp流媒体服务器遇到stray '_239' inprogram,stray '_187' inprogram,stray '_191' inprogram的解决办法
使用用户提供的交叉编译工具链编译easydss时遇到一个编译错误 stray '\239' inprogram stray '\187' inprogram stray '\191' inprogra ...
- MongoDB C#驱动:
MongoDB C#驱动: http://xiaosheng.me/2016/09/15/article24 http://www.cnblogs.com/wuhuacong/p/5098348.ht ...
- json (js对象标记)
基础 JSON: JavaScript Object Notation (JavaScript对象表示法) 网络媒体类型是 application/json,文件名扩展是 .json JSON 独立于 ...
- pandas,apply并行计算的一个demo
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2018-10-11 17:55:26 # @Author : Sheldon (thi ...
- Bootstrap——全局CSS样式
1.栅格系统 containter:用于固定宽度并支持响应式布局的容器 container-fluid:用于100%宽度,占据全部视口(viewport)的容器 row:行,必须在container或 ...
- STM32 ~ USART接收不定长数据
IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断.什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据. ...
- 【Leetcode-easy】ZigZag Conversion
思路1:String[numRow]行字符串数组.读取原始字符串每一个字符,设置行变量 nrow和行标志位flag(向下一行为1或向上一行为-1).将该字符连接到数组中对应的行字符串,同时nrow+= ...
- 打开Vs2010时,卡在加载工具箱内容 不动了
我是直接打开Visual Studio 2010,而不是以打开解决方案的方式打开.然后就在左下角显示“正在从包‘Microsoft.VisualStudio.IDE.ToolboxControlsIn ...
- sping junit test
@ContextConfiguration(locations="classpath:spring.xml")public class BaseTest extends Abstr ...
- PyQt5豆瓣镜像下快速安装
直接pip安装,慢到你怀疑人生.豆瓣镜像安装,嗯,不能更爽. pip install PyQt5 -i https://pypi.douban.com/simple 谢谢:https://blog.c ...