bean的声明周期
为什么把生命周期当做一个重点?
Servlet->servlet生命周期
Servlet生命周期分为三个阶段:
1:初始化阶段,调用init()方法
2:响应客户请求阶段,调用service()方法
3:终止阶段,调用destory()方法
bean的生命周期
①实例化(当我们的程序加载beans.xml文件),把我们的bean(前提是scope=singleton)实例化到内存中
②调用set方法设置属性。
③如果你实现了bean名字关注接口(BeanNameAware)则,可以通过setBeanName获取id号
④如果i实现了bean工厂关注接口,则(BeanFactoryAware)可以获取beanFactory。
⑤如果你实现了ApplicationContextAware接口,则调用方法:
public void setApplicationContext(ApplicationContext arg0) throws BeansException { System.out.println("ApplicationContextAware" + arg0); }
⑥如果bean和一个后置处理器关联了,则会自动去调用before方法
public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException { System.out.println("postProcessAfterInitialization方法被调用"); return arg0; }
⑦如果实现了InitializingBean接口,则会调用postProcessBeforeInitialization()方法
⑧如果自己在<bean init-method="init"/> 则可以在bean中定义自己的初始化方法
⑨如果bean和一个后置处理器关联了,则会自动去调用方法postProcessAfterInitialization()方法
⑩使用我们的bean
11.容器关闭
12可以通过实现DisposableBean接口来调用destroy
13.可以在<bean destroy-method=""/>调用定制的销毁方法。
小结:在实际开发中,往往没有用到这么多的过程,常见的是:
1->2->6->9->10->11
如果需要关闭特定的资源,可以使用13.
需求:
1.记录每个对象,被实例化的实际
2.过滤每个调用对象Ip
3.给所有对象添加属性,或者函数,=>aop(面向切面编程,针对所有对象编程)
aop初探:
beans.xml中有两个bean。所以输出如下所示:
问题:通过BeanFactory来获取bean对象,bean的生命周期是否和ApplicationContext获取的bean的一样?
不一样,没有ApplicationContextAware...,bean在工厂中创建的生命周期会简单一些。