Bean的生命周期
MainConfig.class
package com.lun.annotation.config;import com.lun.annotation.data.Car;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
/**
* Bean的生命周期
* bean创建----初始化----销毁的过程
*
* 容器管理bean的生命周期
* 我们可以自定义初始化方法和销毁方法,容器在bean进行到当前生命周期的时候来调用自定义的初始化和销毁方法
*
* 构造(对象创建)
* 单实例:在容器启动的时候创建对象
* 多实例:在每次获取的时候创建对象
*
* 初始化
* 对象创建完成,并赋值,之后调用initMethod
*
* 销毁
* 单实例:容器关闭的时候
* 多实例:容器不会管理这个bean,容器不会调用destroyMethod
*
* 遍历得到容器中所有的BeanPostProcessor,逐个执行beforeInitialization
* 一旦返回null,跳出for循环,不会执行BeanPostProcessor.postProcessBeforeInitialization
*
* BeanPostProcessor原理
* populateBean(beanName,mbd,instanceWrapper),给bean属性赋值
* initializeBean
* {
* applyBeanPostProcessorBeforeInitialization(wrappedBean,beanName)
* invokeInitMethods(beanName,wrappedBean,mbd)执行自定义初始化方法
* applyBeanPostProcessorAfterInitialization(wrappedBean,beanName)
* }
*
* 1) 指定初始化和销毁方法
* 使用@Bean指定initMethod和destroyMethod
*
* 2) 通过让Bean实现InitializingBean(定义初始化逻辑)
* DisposableBean(定义销毁逻辑)
*
* 3) 可以使用JSR250,
* @PostConstruct bean创建完成属性赋值完成之后来执行初始化方法
* @PreDestroy 在bean被移除之前调用该销毁方法
*
* 4) BeanPostProcessor
* postProcessBeforeInitialization:在初始化工作之前,即initMethod、afterProperties、PostConstruct方法执行之前
* postProcessAfterInitialization:在初始化工作之后,即initMethod、afterProperties、PostConstruct方法执行之后
*
* Spring底层对BeanPostProcessor的使用
*
* Bean赋值、注入其他组件、@Autowired、生命周期注解功能、@Async等
*
*/
@ComponentScan("com.lun.annotation")
@Configuration
public class MainConfig {
@Scope
@Bean(initMethod = "init", destroyMethod = "destroy")
public Car car() {
return new Car();
}
}
MyBeanPostProcessor.class
@Componentpublic class MyBeanPostProcessor implements BeanPostProcessor {
/**
* 在初始化工作之前,即initMethod、afterProperties、PostConstruct方法执行之前
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization...>>>" + bean);
return bean;
}
/**
* 在初始化工作之后,即initMethod、afterProperties、PostConstruct方法执行之后
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization...>>>" + bean);
return bean;
}
}
Car.class
public class Car { public Car() {
System.out.println("car...constructor...");
}
public void init() {
System.out.println("car...init...");
}
public void destroy() {
System.out.println("car...destroy...");
}
}
Cat.class
@Componentpublic class Cat implements InitializingBean, DisposableBean {
public Cat() {
System.out.println("cat...constructor...");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("cat...afterPropertiesSet...");
}
@Override
public void destroy() throws Exception {
System.out.println("cat...destroy...");
}
}
Dog.class
@Componentpublic class Dog {
public Dog() {
System.out.println("dog...construct...");
}
//对象创建并赋值之后
@PostConstruct
public void init() {
System.out.println("dog...PostConstruct...");
}
//容器移除对象之前
@PreDestroy
public void destroy() {
System.out.println("dog...PreDestroy...");
}
}
以上是 Bean的生命周期 的全部内容, 来源链接: utcz.com/z/516796.html