可以为Bean定制初始化后的生命行为,也可以为Bean定制销毁前的生命行为。
举例:ba06包。
首先,这些方法需要在Bean类中事先定义好:是方法名随意的public void方法。

其次,在配置文件的<bean/>标签中增加如下属性:
init-method:指定初始化方法的方法名
destroy-method:指定销毁方法的方法名

注意,若要看到Bean的destroy-method的执行结果,需要满足两个条件:
(1)Bean为singleton,即单例
(2)要确保容器关闭。接口ApplicationContext没有close()方法,但其实现类有。所以,可以将ApplicationContext强转为其实现类对象,或直接创建的就是实现类对象。

Bean的生命周期
Bean实例从创建到最后销毁,需要经过很多过程,执行很多生命周期方法。
Step1:调用无参构造器,创建实例对象。
Step2:调用参数的setter,为属性注入值。

Step3:若Bean实现了BeanNameAware接口,则会执行接口方法setBeanName(String beanId),使Bean类可以获取其在容器中的id名称。
Step4:若Bean实现了BeanFactoryAware接口,则执行接口方法setBeanFactory(BeanFactory factory),使Bean类可以获取到BeanFactory对象。
Step5:若定义并注册了Bean后处理器BeanPostProcessor,则执行接口方法postProcessBeforeInitialization()。
Step6:若Bean实现了InitializingBean 接口,则执行接口方法afterPropertiesSet ()。该方法在Bean的所有属性的set方法执行完毕后执行,是Bean初始化结束的标志,即Bean实例化结束。
Step7:若设置了init-method方法,则执行。
Step8:若定义并注册了Bean后处理器BeanPostProcessor,则执行接口方法postProcessAfterInitialization()。
Step9:执行业务方法。
Step10:若Bean实现了DisposableBean接口,则执行接口方法destroy()。
Step11:若设置了destroy-method方法,则执行。

<bean/>标签的id属性与name属性
一般情况下,命名<bean/>使用id属性,而不使用name属性。在没有id属性的情况下,name属性与id属性作用是相同的。但,当<bean/>中含有一些特殊字符时,就需要使用name属性了。
id的命名需要满足XML对ID属性命名规范:必须以字母开头,可以包含字母、数字、下划线、连字符、句话、冒号。且要求名称在容器中必须唯一。
name则可以包含各种字符,且对名称没有唯一性要求。若名称不唯一,则后面的会覆盖前面的。

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*; public class ISomeServiceImpl implements ISomeService,BeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean{ private String adao; public void setAdao(String adao) {
this.adao = adao;
System.out.println("step2:setter方法");
} ISomeServiceImpl(){
System.out.println("step1:构造方法");
} @Override
public String doFirst() {
System.out.println("step9:主方法体doFirst()=============");
return "abcde";
} @Override
public void doSecond() {
// System.out.println("=============doSecond()=============");
} public void initAfter(){
System.out.println("step7:initAfter()初始化之后=============");
} public void preDestroy(){
System.out.println("step11:preDestroy()销毁之前=============");
} @Override
public void setBeanName(String s) {
System.out.println("step3:beanName=" +s );
} @Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("step4:beanFactory"+beanFactory);
} // 方法标识着bean的初始化工作已经完毕
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("step6:bean的初始化工作已经完毕");
} @Override
public void destroy() throws Exception {
System.out.println("step10:准备开始执行销毁流程");
}
}

最新文章

  1. 【开源】OSharp框架解说系列(2.2):EasyUI复杂布局及数据操作
  2. 【Python⑤】python序列---list和tuple
  3. 【Visual Lisp】人机交互与数据处理(表除外)-lisp
  4. Java总结(一):封装——Encapsulation
  5. ActiveX控件dsoFramer的使用(word、excel、PPT)
  6. app开发之deviceone
  7. Linux和UNIX监控
  8. hdu1151 二分图(无回路有向图)的最小路径覆盖 Air Raid
  9. ldd查询命令或软件共享的函数库(动态)
  10. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.4.5
  11. 获取Mac、CPUID、硬盘序列号、本地IP地址、外网IP地址OCX控件
  12. 阐明iOS证书和provision文件
  13. jQuery banner 滑动
  14. django+mysql简单总结
  15. Axure无法签出,团队配合时无法导入项目
  16. python 正则表达式笔记
  17. C语言中生产随机数 rand()函数
  18. sql递归显示层级数据
  19. 如何设置Google Chrome的界面显示语言
  20. 【Python-遇到的Error】AttributeError: &#39;str&#39; object has no attribute &#39;input_text&#39;

热门文章

  1. Node child_process Study.2
  2. ios中 微信点击 某个元素 该元素会闪一下
  3. 机器审核图片学习(2)安装pornDetector所用环境-python、scikit-learn、opencv
  4. yii的简单片段缓存
  5. .NET开发人员的瓶颈和职业发展
  6. Java设计模式透析之 —— 组合(Composite)
  7. Virtualization of iSCSI storage
  8. [C/C++]_[VS2010使用源代码UTF8中国字符串转码ANSI问题]
  9. Delphi内存管理(Integer、Boolean、Record、枚举等都是在作用域内编译器自动申请内存,出了作用域自动释放;另外,字符串、Variant、动态数组、接口也是由Delphi自动管理)
  10. 跟我学ASP.NET MVC之十:SportsStrore安全