1、spring中bean的生命周期

(1)概念

在spring框架中,所有的bean对象都有生命周期,就是指bean的创建、初始化、服务、销毁的一个过程。

(2)bean的生命周期

  • bean的定义

在spring中通常是通过配置文档的方式来定义Bean的,在一个配置文件中可以定义多个Bean

  • bean的初始化

默认在IOC容器加载的时候实例化对象(ApplicationContext是,Beanfactory只有在调用getBean的时候才进行实例化):https://www.cnblogs.com/zhai1997/p/12692026.html

  • bean的使用

通过ApplicationContext对象或Beanfactory对象获取bean

  • 销毁

(3)代码的方式演示Bean的生命周期

创建Student类:

public class Student implements BeanNameAware {
private String sname;
@Override
public String toString() {
return "Student{" +
"sname='" + sname + '\'' +
'}';
} public Student() {
System.out.println("bean创建了");
}
public void setSname(String sname) {
System.out.println("设置对象属性setName()..");
this.sname = sname;
} //Bean的初始化方法
public void initStudent() {
System.out.println("初始化Bean");
} //实现BeanNameAware接口的setBeanName(),传递Bean的ID。
@Override
public void setBeanName(String sname) {
System.out.println("调用BeanNameAware的setBeanSname,返回的ID值是:" +sname);
} //Bean的使用
public void use() {
System.out.println("使用Bean");
} //Bean的销毁方法
public void destroyStudent() {
System.out.println("销毁Bean");
}
}

其中调用接口后要实现接口的setBeanName方法,该方法的作用是返回bean的ID值

再创建一个类,书写Bean后置处理器相关的方法:

public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
System.out.println("前方法"+s);
return o;
} @Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("后方法"+s);
return o;
}
}

spring的配置文件:

 <bean name="student" class="com.zhb.bean.Student" init-method="initStudent" destroy-method="destroyStudent">

    </bean>
<bean class="com.zhb.test.MyBeanPostProcessor"></bean>

第二个是配置后处理器的bean,只需要配置类全名,不需要配置ID等,spring可以自动识别并注入。

测试结果:

2、总结

  • Bean 容器找到配置文件中 Spring Bean 的定义(配置文件或注解的方式定义)

  • Bean 容器利用Java Reflection API创建一个Bean的实例(ApplicationContext或Beanfactory)

  • 如果涉及到一些属性值,利用set()方法设置一些属性值。

  • 如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的ID

  • 如果 Bean 实现了`BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入 ClassLoader对象的实例。

  • 类似的,如果实现了其他 *.Aware接口,就调用相应的方法。

  • 如果有和加载这个Bean的Spring容器相关的BeanPostProcessor对象,执行postProcessBeforeInitialization() 方法

  • 如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法。

  • 如果 Bean 在配置文件中的定义包含  init-method 属性,执行指定的方法。

  • 如果有和加载这个 Bean的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessAfterInitialization()方法

  • 当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。

  • 当要销毁 Bean 的时候,如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的方法。

最新文章

  1. C#多线程之线程同步篇3
  2. JavaScript实现字符串的contains函数
  3. 笑谈Android图表-MPAndroidChart
  4. Mysql数据库优化
  5. 为您详细比较三个 CSS 预处理器(框架):Sass、LESS 和 Stylus
  6. linux下的三种解压文件的命令?
  7. diff和patch配合使用(转载备用)
  8. java继承覆盖总结
  9. 关闭不安全的HTTP方法
  10. 机器学习之多变量线性回归(Linear Regression with multiple variables)
  11. 将Android Studio工程导入到Eclipse中
  12. matlab search path
  13. tail -f logfile.log 一直监控某个文件,若该文件有改动,立即在屏幕上输出
  14. [原创]HBase学习笔记(3)- Java程序访问HBase
  15. CF Educational Round 23 F.MEX Queries
  16. MPI二维笛卡尔坐标划分【1】
  17. php连接mysql(linux下)
  18. .NET代码设计简单规范
  19. Redis消息之发布与订阅
  20. LinQ实战学习笔记(一) LINQ to (Objects, XML, SQL) 入门初步

热门文章

  1. ZERO:从搜索用户来看SEO
  2. Orleans 知多少 | Orleans 中文文档上线
  3. Ubuntu 20.04.1 安装软件和系统配置脚本
  4. 揭秘|一探腾讯基于Kubeflow建立的多租户训练平台背后的技术架构
  5. for...in、for...of和forEach
  6. Android反解符号表工具
  7. chrome设置跨域访问
  8. C012:颠倒显示两位数
  9. Java自定义异常的用法
  10. Maven是什么? Maven的概念+作用+仓库的介绍+常用命令