本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.IOC 容器中 Bean 的生命周期方法

  Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务.在 Bean 的声明里设置 init-method destroy-method 属性, 为 Bean 指定初始化销毁方法.

  1)通过构造器或工厂方法创建 Bean 实例  

  2)为 Bean 的属性设置值和对其他 Bean 的引用  

  3)调用 Bean 的初始化方法  

  4)Bean 可以使用了  

  5)当容器关闭时, 调用 Bean 的销毁方法

 package com.jason.spring.cycle;

 public class Car {

     public Car() {
System.out.println("Car's Constructor ... ");
} private String brand; public void setBrand(String brand) {
this.brand = brand;
} public void init() {
System.out.println("init ...");
} public void destroy(){
System.out.println("destroy ...");
} @Override
public String toString() {
return "Car [brand=" + brand + "]";
} }

Car

 <?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="car" class="com.jason.spring.cycle.Car" init-method="init" destroy-method="destroy"> </bean> </beans>

bean-cycle.xml

 package com.jason.spring.cycle;

 import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");
Car car = (Car) ctx.getBean("car");
System.out.println(car); //关闭IOC
ctx.close();
} }

Main

2.创建 Bean 后置处理器

  1)Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理.

  2)Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.

  3)对Bean 后置处理器而言, 需要实现  BeanPostProcesser    接口. 在初始化方法被调用前后, Spring 将把每个 Bean 实例分别传递给上述接口的以下两个方法:

  

  5)添加bean 后置处理器后的bean的生命周期

    

  6)实现方式

    ① 实现 BeanPostProcessor 接口:postProcessAfterInitialization  ,   postProcessBeforeInitialization

    ② 配置bean:

 <!-- 配置bean 的后置处理器 :不需要配置id,IOC 容器会自动识别一个 BeanPostProcessor-->
<bean class="com.jason.spring.cycle.MyBeanPostProcesser"></bean>
 package com.jason.spring.cycle;

 public class Car {

     public Car() {
System.out.println("Car's Constructor ... ");
} private String brand; public void setBrand(String brand) {
this.brand = brand;
} public void init() {
System.out.println("init ...");
} public void destroy(){
System.out.println("destroy ...");
} @Override
public String toString() {
return "Car [brand=" + brand + "]";
} }

Car

 <?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="car" class="com.jason.spring.cycle.Car" init-method="init" destroy-method="destroy"> </bean> <!-- 配置bean 的后置处理器 :不需要配置id,IOC 容器会自动识别一个 BeanPostProcessor-->
<bean class="com.jason.spring.cycle.MyBeanPostProcesser"></bean> </beans>

beans-cycle.xml

 package com.jason.spring.cycle;

 import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor; public class MyBeanPostProcesser implements BeanPostProcessor { @Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException { /**
* bean:bean实例
* beanName:IOC 容器配置的bean 名字
* 返回值:实际是返回给用户的bean,即,经过处理的bean
*/
// BeanPostProcessor 处理所有的bean, 所有需要通过判断,确定自己要处理的那个bean
if("car".equals(beanName)){
//...
}
System.out.println("postProcessAfterInitialization" + bean + "," + beanName);
return bean;
} @Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("postProcessBeforeInitialization" + bean + "," + beanName);
return bean;
} }

MyBeanPostProcesser

 package com.jason.spring.cycle;

 import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans-cycle.xml");
Car car = (Car) ctx.getBean("car");
System.out.println(car); //关闭IOC
ctx.close();
} }

Main

最新文章

  1. ELK日志管理之——kibana部署
  2. IOS contentOffset该如何理解
  3. 嵌入式Linux驱动学习之路(八)创建最小的根文件系统
  4. react.js table组件【可以直接使用】
  5. Android中常用的五种数据存储方式
  6. 腾讯sdk学到了
  7. shell之条件表达式
  8. UI1_UITableViewHomeWork
  9. oracle 用户 多个表空间
  10. Qt5.4生成安装包过程
  11. 移动Web开发技巧
  12. Neutron中的Service类
  13. [转]Mysql自动备份并保存近15天记录脚本
  14. MapReduce 规划 六系列 MultipleOutputs采用
  15. 觉得OpenStack的网络复杂?其实你家里就有同样一个网络
  16. 在代码中写view 的长宽高等
  17. python之路(4)高阶函数和python内置函数
  18. iPhone多次输入错误密码锁机后刷机恢复(原有内容会丢失)
  19. 反射中Class.forName()和classLoader的区别
  20. 【LeetCode每天一题】String to Integer (atoi)(字符串转换成数字)

热门文章

  1. 不错的 iOS 开发辅助工具
  2. uboot中添加FIQ中断及相关问题
  3. org.openqa.selenium.StaleElementReferenceException
  4. [LintCode] Copy Books 复印书籍
  5. [CareerCup] 18.2 Shuffle Cards 洗牌
  6. 【LeetCode】16. 4Sum
  7. cat 显示指定行
  8. Daily Scrum 11.4
  9. mysql sql注入
  10. UIDynamic(物理仿真)