Spring - bean的生命周期

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>

猜你喜欢

转载自www.cnblogs.com/oscar1987121/p/10877186.html