1.生命周期介绍
所有放在spring容器中执行的bean都会遵守bean的生命周期,生命周期如图:
2. init-method 和destory-method
在生命周期中,其中提到两个调用,这两个调用都是通过在spring的bean中添加属性即可
- init-method 初次化执行方法
- destory-method 销毁方法
springConfig.xml配置
<?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-4.3.xsd"> <!-- init-method = 初次化方法,对应实现类的方法名 (用于初次化数据的) destory-method = 销毁方法,对一个实现类的方法名 (用于销毁数据,只有在单列的情况下才会执行) --> <bean id="userServiceBean" class="com.test.spring.life.UserServiceImpl" init-method="myBegin" destroy-method="myDestory"></bean> </beans>
实现类UserServiceImpl.java
public class UserServiceImpl implements UserService{ /** * 可以不加这个构造函数,添加上这个构造函数的目的是测试实例化的生命周期 */ public UserServiceImpl() { System.out.println("实例化"); } /** * 实现接口方法 */ public void addUser() { System.out.println("添加用户成功"); } /** * 初次化方法 */ public void myBegin() { System.out.println("生命周期 - 开始"); } /** * 销毁方法 */ public void myDestory() { System.out.println("生命周期 - 销毁"); } }
测试类UserServiceTest.java
public class UserServiceTest { @Test public void test() { //以前 // UserService userService = new UserServiceImpl(); // userService.addUser(); /** * spring的写法,这是一个工厂类,这里有一个参数,参数对应配置文件的classpath位置,src为根目录 */ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("/com/test/spring/life/springConfig.xml"); //这里的参数为 配置文件中 bean id,意思就是获取 对应id实例对象 UserService us_1 = (UserService)context.getBean("userServiceBean"); us_1.addUser(); //容器关闭,容器类里的bean才会执行销毁方法,对应就是destory-method方法,注意:这个bean一定要是单列 context.close(); } }
3.执行初次化方法前,和初次化方法后
这两个执行点,都是通过钩子的方式执行,必须注意的是,假如配了这个BeanPostProcessor 钩子类,在spring容器中,所bean都会调用这两个方法,例如有10个bean,机会执行10次
这里需要写一个类,实现BeanPostProcessor接口即可,然后在配置里面,添加这个类,如下
自定义钩子类MyBeanPostProcessor
public class MyBeanPostProcessor implements BeanPostProcessor { public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("执行init之前"); return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("执行init之后"); return bean; } }
配置,添加类钩子类配置
<?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-4.3.xsd"> <!-- init-method = 初次化方法 (用于初次化数据的) destory-method = 销毁方法 (用于销毁数据,只有在单列的情况下才会执行) --> <bean id="userServiceBean" class="com.test.spring.life.UserServiceImpl" init-method="myBegin" destroy-method="myDestory"></bean> <!-- 钩子类 --> <bean class="com.test.spring.life.MyBeanPostProcessor"></bean> </beans>