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生命周期)的更多相关文章

  1. 《精通Spring4.x企业应用开发实战》第三章

    这一章节主要介绍SpringBoot的使用,也是学习的重点内容,之后就打算用SpringBoot来写后台,所以提前看一下还是很有必要的. 3.SpringBoot概况 3.1.1SpringBoot发 ...

  2. 《精通Spring4.X企业应用开发实战》读后感第四章(资源访问)

    package com.smart.resource; import org.springframework.core.io.ClassPathResource; import org.springf ...

  3. 《精通Spring4.X企业应用开发实战》读后感第七章(创建增强类)

  4. 《精通Spring4.X企业应用开发实战》读后感第七章(AOP基础知识、jdk动态代理,CGLib动态代理)

  5. 《精通Spring4.X企业应用开发实战》读后感第七章(AOP概念)

  6. 《精通Spring4.X企业应用开发实战》读后感第六章(容器事件)

  7. 《精通Spring4.X企业应用开发实战》读后感第六章(国际化)

  8. 《精通Spring4.X企业应用开发实战》读后感第六章(引用Bean的属性值)

  9. 《精通Spring4.X企业应用开发实战》读后感第六章(使用外部属性文件)

  10. 《精通Spring4.X企业应用开发实战》读后感第六章(属性编辑器)

随机推荐

  1. 关于TransactionScope 使用

    在去年的项目中使用了TransactionScope,现在总结下TransactionScope的使用说明 一.TransactionScope是.Net Framework 2.0之后,新增了一个名 ...

  2. c++动态绑定的技术实现

    1 什么是动态绑定 有一个基类,两个派生类,基类有一个virtual函数,两个派生类都覆盖了这个虚函数.现在有一个基类的指针或者引用,当该基类指针或者引用指向不同的派生类对象时,调用该虚函数,那么最终 ...

  3. new 和 make 均是用于分配内存

    the-way-to-go_ZH_CN/06.5.md at master · Unknwon/the-way-to-go_ZH_CN https://github.com/Unknwon/the-w ...

  4. gitPermission denied (publickey).

    $ git clone git@github.com:DavidWanderer/test1.git Cloning into 'test1'... Warning: Permanently adde ...

  5. c语言高速推断一个数是偶数还是奇数

    #include <stdio.h> int main() { int a; while(1) { printf("please input the number:\n" ...

  6. mongoDB多级子文档查询

    db.getCollection('product').find({'coverage':{'$elemMatch':{'plan':{'$elemMatch':{'iscoverage':{'$in ...

  7. Gemini.Workflow 双子工作流入门教程五:业务表单开发

    简介: Gemini.Workflow 双子工作流,是一套功能强大,使用简单的工作流,简称双子流,目前配套集成在Aries框架中. 下面介绍本篇教程:业务表单开发. 业务表单开发 业务表单的开发,和在 ...

  8. SSH Tunnel扫盲(ssh port forwarding端口转发)

    SSH的的Port Forward,中文可以称为端口转发,是SSH的一项非常重要的功能.它可以建立一条安全的SSH通道,并把任意的TCP连接放到这条通道中.下面仔细就仔细讨论SSH的这种非常有用的功能 ...

  9. blog首页视图

    声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 django 是如何处理 http 请求 ...

  10. 农业公司flash动画模板

    农业公司flash动画素材下载模板是一款绿色水果蔬菜种植企业的flash动画模板. 下载:http://www.huiyi8.com/sc/10576.html