让每一名学员高薪就业
返回列表 发新帖

Spring中JavaBean的生命周期

[复制链接]

38

主题

67

帖子

1164

积分

大佬

Rank: 9Rank: 9Rank: 9

积分
1164
QQ
发表于 2018-2-8 14:40:54  | 显示全部楼层 | 阅读模式
代码示例

bean
  1. public class JavaBeanLifeCycle implements BeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean,DisposableBean {
  2.         public JavaBeanLifeCycle() {
  3.                 System.out.println("第一步:构造函数");
  4.         }

  5.         private String name;
  6.         public String getName() {
  7.                 return name;
  8.         }
  9.         public void setName(String name) {
  10.                 System.out.println("第二步:封装属性");
  11.                 this.name = name;
  12.         }

  13.         @Override
  14.         public void setBeanName(String arg0) {
  15.                 System.out.println("第三步:获取bean的id或name值,实现BeanNameAware"+arg0);
  16.         }

  17.         @Override
  18.         public void setBeanFactory(BeanFactory arg0) throws BeansException {
  19.                 System.out.println("第四步:Bean采用工厂形式获取对象");
  20.         }

  21.         @Override
  22.         public void setApplicationContext(ApplicationContext arg0) throws BeansException {
  23.                 System.out.println("第四步:Bean采用ApplicationContext形式获取对象");
  24.         }

  25.         @Override
  26.         public void afterPropertiesSet() throws Exception {
  27.                 System.out.println("第六步:初始化步骤,但需要实现InitializingBean接口,存在耦合性");
  28.         }

  29.         public void initObject(){
  30.                 System.out.println("第七步:自定义初始化方法,需要在bean中配置init-Method");
  31.         }

  32.         public void otherMethod(){
  33.                 System.out.println("第九步:其他自定义方法");
  34.         }

  35.         @Override
  36.         public void destroy() throws Exception {
  37.                 System.out.println("第十步:销毁bean调用的方法,需要实现DisposableBean");
  38.         }
  39.         
  40.         public void destroyMethod(){
  41.                 System.out.println("第十一步:自定义销毁方法,需要在bean配置destroy-method");
  42.         }
  43. }
复制代码

实现BeanPostProcessor接口

  1. public class MyBeanPostProcessor implements BeanPostProcessor {
  2.         @Override
  3.         public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {
  4.                 System.out.println("第五步:在bean完成初始化之前的步骤,每个bean都会调用");
  5.                 return arg0;
  6.         }

  7.         @Override
  8.         public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {
  9.                 System.out.println("第八步:在bean完成初始化之后的步骤,每个bean都会调用");
  10.                 return arg0;
  11.         }
  12. }
复制代码

配置

  1. <bean id="beanLifeCycle" class="cn.demo.domain.JavaBeanLifeCycle" init-method="initObject" destroy-method="destroyMethod" >
  2.                 <property name="name" value="生命周期演示"></property>
  3. </bean>
  4. <bean class="cn.demo.ioc.MyBeanPostProcessor"></bean>
复制代码

调用
  1. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  2. JavaBeanLifeCycle jblc= (JavaBeanLifeCycle) context.getBean("beanLifeCycle");
  3. jblc.otherMethod();
  4. context.close();
复制代码
图片1.png

实现分析
1.初始化
a)【instantiate bean】实例化Bean对象
b)【populate properties】封装属性
c)如果Bean实现BeanNameAware执行setBeanName
d)如果Bean实现BeanFactoryAwar或ApplicationContextAwar设置工厂setBeanFactory或上下文对象setApplicationContext
e)如果存在类实现BeanPostProcessor(后处理Bean),执行postProcessBeforeInitialization
i.初始化之前执行的方法
f)如果Bean实现InitializingBean接口执行afterPropertiesSet方法
i.属性注入完成之后执行的方法
g)调用自定义的init-method方法
i.bean配置加上init-method
h)如果存在类实现BeanPostProcessor(处理Bean),执行postProcessAfterInitialization
i.初始化之后执行的方法

2.自定义方法
3.销毁
1.如果Bean实现DisposableBean接口执行destroy
2.调用自定义的destroy-method【只对scope=”singleton”有效】
i.bean配置加上destroy-method属性

【小结分析】:
1.【初始化】第3步和第4步是bean和spring框架关联;
2.【初始化】【重点】第5步和第8步是针对bean进行功能增强,一般使用动态代理,会针对所有的bean进行增强,单独定义类实现,并配置bean;
3.【初始化&销毁】初始化第6步和销毁第1步,API定义的初始化和销毁;
4.【初始化&销毁】开发中初始化和销毁一般使用自定义,因为自定初始化和销毁操作无耦合,但必须在配置文件中明确定义。

感谢源码时代Java学科讲师提供此文章!
本文为原创文章,转载请注明出处!




回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐阅读

最新活动

联系我们

Java培训  |   PHP培训  |   UI培训  |   H5培训  |   Python培训  |   大数据培训  |   如何报名  |   视频下载
快速回复 返回顶部 返回列表