面试经常被问到这个问题,我个人感觉这个话题有点扯淡,最近写了个demo,记录一下
bean对象Book
Book.java
@Component
public class Book implements InitializingBean,DisposableBean {
public Book() {
System.out.println("book 的构造方法");
}
@PostConstruct
public void init() {
System.out.println("book 的javax:PostConstruct标志的方法");
}
@PreDestroy
public void preDestory() {
System.out.println("book 的javax:PreDestory标注的方法");
}
public void myInit() {
System.out.println("book的初始化方法......@initMethod");
}
public void myDestroy() {
System.out.println("book的销毁方法.....@destroyMethod");
}
@Override
public void destroy() throws Exception {
System.out.println("book的销毁方法....DisposableBean:destroy");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("book afterPropertiesSet 方法.....InitializingBean:afterPropertiesSet");
}
@Transactional(rollbackFor = Exception.class)
public void doManage(){
}
}
后置处理器MyBeanPostProcessor
MyBeanPostProcessor.java
@Component
public class MyBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if(beanName.equals("book")){
System.out.println("TulingBeanPostProcessor...BeanPostProcessor:postProcessBeforeInitialization:"+beanName);
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if(beanName.equals("book")){
System.out.println("TulingBeanPostProcessor...BeanPostProcessor:postProcessAfterInitialization:"+beanName);
}
return bean;
}
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
if(beanName.equals("book")){
System.out.println("TulingBeanPostProcessor...InstantiationAwareBeanPostProcessor:postProcessBeforeInstantiation:"+beanName);
}
return null;
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
if(beanName.equals("book")){
System.out.println("TulingBeanPostProcessor...InstantiationAwareBeanPostProcessor:postProcessAfterInstantiation:"+beanName);
}
return true;
}
@Override
public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
if(beanName.equals("book")){
System.out.println("TulingBeanPostProcessor...InstantiationAwareBeanPostProcessor:postProcessPropertyValues:"+beanName);
}
return null;
}
}
启动类
MainClass
public class MainClass {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(MainConfig.class);
Book book = (Book) ctx.getBean("book");
book.doManage();
ctx.close();
}
}
@Configuration
@ComponentScan(basePackages = "com.XXX.testbeanlifecycle")
public class MainConfig {
@Bean(initMethod = "myInit",destroyMethod = "myDestroy")
public Book book() {
return new Book();
}
@Bean
public TulingBeanPostProcessor tulingBeanPostProcessor() {
return new TulingBeanPostProcessor();
}
}
OK,结果来了
TulingBeanPostProcessor...InstantiationAwareBeanPostProcessor:postProcessBeforeInstantiation:book
book 的构造方法
TulingBeanPostProcessor...InstantiationAwareBeanPostProcessor:postProcessAfterInstantiation:book
TulingBeanPostProcessor...InstantiationAwareBeanPostProcessor:postProcessPropertyValues:book
TulingBeanPostProcessor...BeanPostProcessor:postProcessBeforeInitialization:book
book 的javax:PostConstruct标志的方法
book afterPropertiesSet 方法.....InitializingBean:afterPropertiesSet
book的初始化方法......@initMethod
TulingBeanPostProcessor...BeanPostProcessor:postProcessAfterInitialization:book
book 的javax:PreDestory标注的方法
book的销毁方法....DisposableBean:destroy
book的销毁方法.....@destroyMethod