spring注解驱动开发(四):Bean生命周期

Bean的生命周期,初始化和销毁方法。

定义初始化想和销毁方法的四种方式:

一:在bean定义方法,并在注解指定初始化和销毁方法,

    @Bean(name="car",initMethod="init",destroyMethod = "destroy")  

二:实现InitializingBean和DispoaableBean  implements InitializingBean, DisposableBean

三:通过注解在方法上加上@PostConstruct @PreDestroy

四:实现BeanPostProcessor,重写postProcessBeforeInitialization,postProcessAfterInitialization

1 指定@Bean的initMethod和destoryMethod

    1.创建bean,指定init和sestory方法

public class Car {
    public Car(){
        System.out.println("car 构造器");
    }

    public void init(){
        System.out.println("bean的生命周期,使用@Bean中的init参数指定");
    }
    public void destroy(){
        System.out.println("bean的生命周期,使用@Bean中的destory参数指定");
    }
}

    2.在配置类中指定初始化和销毁方法

@Configuration
public class MainConfigCycle03 {
    @Bean(initMethod = "init",destroyMethod = "destroy")
    public Car car(){
        return new Car();
    }
}

    3.新建测试类和测试方法

    @Test
    public void testBean(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigCycle03.class);
        Car car = (Car)applicationContext.getBean("car");
        System.out.println(car);
        applicationContext.close();
    }

    执行以上代码,在控制台打印

car 构造器
bean的生命周期,使用@Bean中的init参数指定
三月 25, 2019 3:00:29 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@2d6a9952: startup date [Mon Mar 25 15:00:29 CST 2019]; root of context hierarchy
org.gwsix.ch04.bean.Car@4fe767f3
bean的生命周期,使用@destory参数指定

    小结:先执行初始化的构造器,再执行@Bean中initMethod,当容器销时,执行@Bean中的destoryMethod

              初始化:bean创建完成,并赋值好,调用初始化方法

              销毁:在容器销毁时候调用

     如果是多实例bean,在获取bean的时候创建对象,容器不会管理多实例bean销毁,现在多实例情况下需要手动调用销毁方法。

2 实现InitializingBean和DispoaableBean

    1.自定义类实现InitializingBean和DispoaableBean接口,重写接口中方法

public class Cat implements InitializingBean, DisposableBean {
    public Cat() {
        System.out.println("cat 构造器");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("初始化方法,想到与@Bean中的initMethod方法,在bean初始化好,并赋值好调用");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("初始化方法,想到与@Bean中的DestoryMethod方法,在容器关闭时调用");
    }
}

    2.修改配置类,将自定义的类注册到容器

@Configuration
@Import(Cat.class)
public class MainConfigCycle03 {
    @Bean(initMethod = "init",destroyMethod = "destroy")
    public Car car(){
        return new Car();
    }
}

    3.执行测试方法,结果如下,

cat 构造器
初始化方法,想到与@Bean中的initMethod方法,在bean初始化好,并赋值好调用
car 构造器
bean的生命周期,使用@Bean中的init参数指定
三月 25, 2019 3:21:45 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@2d6a9952: startup date [Mon Mar 25 15:21:44 CST 2019]; root of context hierarchy
bean的生命周期,使用@destory参数指定
初始化方法,想到与@Bean中的DestoryMethod方法,在容器关闭时调用

    小结:实现InitializingBean, DisposableBean接口重写接口中afterPropertiesSet和destroy方法,可以完成和@Bean中initMethod和destoryMethod方法。

3 JSR250注解@PostConstruct @PreDestroy,标注在方法上

    @PostConstruct 在bean创建完成和赋值完成好之后调用

    @PreDestory在bean将要被移除前置,回调通知

    定义类,在方法中使用@PostConstruct和@PreDestory注解

@Component
public class Dog {
    public  Dog(){
        System.out.println("Dog 构造器执行中。。。。。。");
    }

    @PostConstruct
    public void init(){
        System.out.println("对象创建并赋值之后调用");
    }

    @PreDestroy
    public void destroy(){
        System.out.println("移除对象之前,将会被通知");
    }
}

    将类注册到bean,使用包扫描,可以完成在bean创建完成并完成初始化方法和bean在移除前调用的关闭方法。

4. 实现BeanPostProcessor

    自定义类实现BeanPostProcessor接口重写postProcessBeforeInitialization、postProcessAfterInitialization方法。

    postProcessBeforeInitialization:在任何初始化之前操作

    postProcessAfterInitialization:在任何初始化之后调用,无论是destoryMethod、@PreDestory和DisposableBean 

@Component //将后置处理器加入到容器
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization   -->" + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization   -->" + beanName);
        return bean;
    }
}

    小结:使用四种方式,可以执行bean穿件前后执行的方法,前三种初始化是bean创建完并完成属性赋值后调用,而最后一种是在bean创建前使用

    spring赋值、生命周期底层是XxxAnnotationBeanPostProcessor

posted @ 2019-03-25 14:49  i孤独行者  阅读(362)  评论(0)    收藏  举报