目录:
1.Bean的生命周期
Bean的生命周期可以简单的理解为:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁
在其生命周期里,有两个重要的回调方法,可以在初始化Bean和销毁Bean时调用该方法。
在这两个方法里可以额外做一些操作。
首先准备一个类
public class Category { //属性 private String name; SimpleDateFormat df=new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.sss"); //设置该属性的方法 public void setName(String name){ this.name=name; } //获取该属性的方法 public void getName(){ System.out.println(name); } //初始化回调 public void start(){ System.out.println("Bean开始使用时间:"+df.format(new Date())); } //销毁回调 public void destroy(){ System.out.println("Bean销毁时间:"+df.format(new Date())); } }
再准备一个测试类
public class TestSpring { public static void main(String[] args) throws InterruptedException { AbstractApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Category category = (Category) context.getBean("c"); category.getName(); //睡眠1秒,更加明显看出两个方法的区别 Thread.sleep(1000); context.registerShutdownHook(); } }
测试类中,需要调用AbstractApplicationContext的registerShutdownHook()方法来确保正常关闭,并且调用相关的销毁的回调方法。
配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="c" class="SpringBean.Base.Category" init-method="start" destroy-method="destroy"> <property name="name" value="Hello Word"/> </bean> </beans>
配置文件中,需要指定初始化回调的方法和销毁回调的方法。
最后输出的是:
Bean开始使用时间:2019-11-21 15:10:21.021 Hello Word Bean销毁时间:2019-11-21 15:10:22.022
2.Bean的后置处理器
后置处理器就是在初始化方法的前后进行额外的操作。
上面的Category方法代码不变,再准备一个针对Category初始化的类,就叫initCategory
public class initCategory implements BeanPostProcessor { @Override //会在bean初始化方法前执行 public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { System.out.println("初始化之前执行:"+s); return o; } @Override //会在bean初始化方法后执行 public Object postProcessAfterInitialization(Object o, String s) throws BeansException { System.out.println("初始化之后执行:"+s); return o; } }
这个类需要实现BeanPostProcessor 接口,并重写其两个方法,方法内就可以写你需要的额外操作。
保持上面的配置文件不变,再加上一句:
<bean class="SpringBean.Base.initCategory"/>
class属性里写上自己的initCategory 类所在的位置
最后输出:
初始化之前执行:c Bean开始使用时间:2019-11-21 15:16:12.012 初始化之后执行:c Hello Word Bean销毁时间:2019-11-21 15:16:13.013
3.Bean的定义继承
bean的定义可以包含一大堆配置,比如:属性的值,构造函数的参数等。当其他bean需要用到这些设置时,不需要重新配置,只需要继承即可。
继承的用法就相对简单了,在上面代码基础上。可以再添加一个Category2类。内容与Category一样,再添加额外的属性name2和setName2,getName2方法。
并在配置文件中添加如下代码:
<bean id="c2" class="SpringBean.Base.Category2" parent="c"> <property name="name2" value="Hello Word2"/> </bean>
可以发现,c2中设置了parent属性,继承id为‘c’的bean。
设置属性当中,只设置了name2,并没有设置name的值,但是调用Category2的getName方法,依旧会输出Hello Word