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

浙公网安备 33010602011771号