春天中Bean的生命周期使用解析

  

<强> Bean的生命周期

  

春天中Bean的生命周期使用解析

  

春天中Bean的生命周期使用解析

  

<>强解释
  

  

(1) BeanFactoryPostProcessor的postProcessorBeanFactory()方法:若某个奥委会容器内添加了实现了BeanFactoryPostProcessor接口的实现类豆,那么在该容器中实例化任何其他豆之前可以回调该Bean中的postPrcessorBeanFactory()方法来对Bean的配置元数据进行更改,比如从XML配置文件中获取到的配置信息。

  

(2) Bean的实例化:Bean的实例化是使用反射实现的。

  

(3)豆属性注入:豆实例化完成后,利用反射技术实现属性及依赖Bean的注入。

  

(4) BeanNameAware的setBeanName()方法:如果某个豆实现了BeanNameAware接口,那么春天将会将Bean实例的ID传递给setBeanName()方法,在Bean类中新增一个beanName字段,并实现setBeanName()方法。

  

(5) BeanFactoryAware的setBeanFactory()方法:如果某个豆实现了BeanFactoryAware接口,那么春天将会将创建Bean的BeanFactory传递给setBeanFactory()方法,在Bean类中新增了一个BeanFactory字段用来保存BeanFactory的值,并实现setBeanFactory()方法。

  

(6) ApplicationContextAware的setApplicationContext()方法:如果某个豆实现了ApplicationContextAware接口,那么春天将会将该Bean所在的上下文环境ApplicationContext传递给setApplicationContext()方法,在Bean类中新增一个ApplicationContext字段用来保存ApplicationContext的值,并实现setApplicationContext()方法。

  

(7) BeanPostProcessor预初始化方法:如果某个奥委会容器中增加的实现BeanPostProcessor接口的实现类豆,那么在该容器中实例化Bean之后,执行初始化之前会调用BeanPostProcessor中的postProcessBeforeInitialization()方法执行预初始化处理。

  

(8) InitializingBean的afterPropertiesSet()方法:如果豆实现了InitializingBean接口,那么豆在实例化完成后将会执行接口中的afterPropertiesSet()方法来进行初始化。

  

(9)自定义的inti-method指定的方法:如果配置文件中使用init方法属性指定了初始化方法,那么豆在实例化完成后将会调用该属性指定的初始化方法进行Bean的初始化。

  

(10) BeanPostProcessor初始化后方法:如果某个奥委会容器中增加的实现BeanPostProcessor接口的实现类豆,那么在该容器中实例化Bean之后并且完成初始化调用后执行该接口中的postProcessorAfterInitialization()方法进行初始化后处理。

  

(11)使用豆:此时有关豆的所有准备工作均已完成,Bean可以被程序使用了,它们将会一直驻留在应用上下文中,直到该上下文环境被销毁。

  

(12) DisposableBean的毁坏()方法:如果豆实现了DisposableBean接口,春天将会在Bean实例销毁之前调用该接口的毁坏()方法,来完成一些销毁之前的处理工作。

  

(13)自定义的destory-method指定的方法:如果在配置文件中使用destory-method指定了销毁方法,那么在Bean实例销毁之前会调用该指定的方法完成一些销毁之前的处理工作。

  

<强>注意:

  

1, BeanFactoryPostProcessor接口与BeanPostProcessor接口的作用范围是整个上下文环境中,使用方法是单独新增一个类来实现这些接口,那么在处理其他Bean的某些时刻就会回调响应的接口中的方法。

  

2 BeanNameAware BeanFactoryAware, ApplicationContextAware的作用范围的Bean范围,即仅仅对实现了该接口的指定Bean有效,所有其使用方法是在要使用该功能的Bean自己来实现该接口。

  第

3日8点与第9点所述的两个初始化方法作用是一样的,我们完全可以使用其中的一种即可,一般情况我们使用第9点所述的方式,尽量少的去来Bean中实现某些接口,保持其独立性,低耦合性,尽量不要与春天代码耦合在一起。第12和13也第是如此。

  

4,在BeaFactoryAware setBeanFactory()和Pre-initialization BeanPostProcessor之间还应该有一步:调用ApplicationContextAware的setApplicationContext()方法。
  可以看到豆生命周期要经历很多阶段,但这些阶段大部分都是可选的,例如,某个Bean如果实现了BeanFactoryAware接口的setBeanFactory方法,那么该Bean的生命就会经历这个阶段,如果不实现则没有。

  

<强>使用

        公共类的书实现BeanNameAware BeanFactoryAware,   ApplicationContextAware、InitializingBean DisposableBean {   私人字符串bookName;   公众书(){   system . out。println(“初始化”书);   }   @Override   公共空间setBeanFactory (BeanFactory BeanFactory)抛出BeansException {   System.out.println(“书。setBeanFactory调用”);   }   @Override   公共空间setBeanName(字符串名称){   System.out.println(“书。setBeanName调用”);   }   @Override   公共空间摧毁()抛出异常{   System.out.println (“Book.destory调用”);   }   @Override   公共空间afterPropertiesSet()抛出异常{   System.out.println(“书。afterPropertiesSet调用”);   }   @Override   公共空间setApplicationContext (ApplicationContext ApplicationContext)抛出BeansException {   System.out.println(“书。setApplicationContext调用”);   }   公共字符串getBookName () {   返回bookName;   }   公共空间setBookName(字符串bookName) {   这一点。bookName=bookName;   system . out。println(设置“setBookName:书的名字了。”);   }   公共空间myPostConstruct () {   System.out.println(“书。myPostConstruct调用”);   }//自定义初始化方法   @PostConstruct   公共空间springPostConstruct () {   System.out.println (“@PostConstruct”);   }   公共空间myPreDestory () {   System.out.println(“书。myPreDestory调用”);   System.out.println(“- - - - - - - - - - - - - - - -破坏- - - - - - - - - - - - - - - - - -”);   }//自定义销毁方法   @PreDestroy   公共空间springPreDestory () {   System.out.println (“@PreDestory”);   }   @Override   保护无效finalize()抛出Throwable {   system . out。println(“完成内部- - - - - - - - - - - -”);   }   }   公共类MyBeanFactoryPostProcessor实现BeanFactoryPostProcessor {   公共MyBeanFactoryPostProcessor () {   超级();   System.out.println(“这是BeanFactoryPostProcessor实现类构造器! !”);   }   @Override   公共空间postProcessBeanFactory (ConfigurableListableBeanFactory arg0)   抛出BeansException {   system . out   .println (“BeanFactoryPostProcessor调用postProcessBeanFactory方法”);   BeanDefinition bd=arg0.getBeanDefinition(“书”);   bd.getPropertyValues ()。addPropertyValue (“bookName”、“ddd”);   }   }//通过注入调用   @ component   公共类MyBeanPostProcessor实现BeanPostProcessor {   @Override   公共对象postProcessBeforeInitialization(对象bean,字符串beanName)抛出BeansException {   如果(bean实例的书){   System.out.println (“MyBeanPostProcessor.postProcessBeforeInitialization”);   }   返回bean;   }   @Override   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

春天中Bean的生命周期使用解析