Spring註解驅動開發第16講——面試官再問你BeanPostProcessor的執行流程,就把這篇文章甩給他!
寫在前面
在前面的文章中,我們講述了BeanPostProcessor的postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法在bean初始化的前後呼叫。而且我們可以自定義類來實現BeanPostProcessor介面,並在postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法中編寫我們自定義的邏輯。
今天,我們來一起探討下BeanPostProcessor的底層原理。
bean的初始化和銷燬
我們知道BeanPostProcessor的postProcessBeforeInitialization()方法是在bean的初始化之前被呼叫;而postProcessAfterInitialization()方法是在bean初始化的之後被呼叫。並且bean的初始化和銷燬方法我們可以通過如下方式進行指定。
(一)通過@Bean指定init-method和destroy-method
@Bean(initMethod="init", destroyMethod="destroy")
public Car car() {
return new Car();
}
(二)通過讓bean實現InitializingBean和DisposableBean這倆介面
package com.meimeixia.bean;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
public class Cat implements InitializingBean, DisposableBean {
public Cat() {
System.out.println("cat constructor...");
}
/**
* 會在容器關閉的時候進行呼叫
*/
@Override
public void destroy() throws Exception {
// TODO Auto-generated method stub
System.out.println("cat destroy...");
}
/**
* 會在bean建立完成,並且屬性都賦好值以後進行呼叫
*/
@Override
public void afterPropertiesSet() throws Exception {
// TODO Auto-generated method stub
System.out.println("cat afterPropertiesSet...");
}
}
(三)使用JSR-250規範裡面定義的@PostConstruct和@PreDestroy這倆註解
- @PostConstruct:在bean建立完成並且屬性賦值完成之後,來執行初始化方法
- @PreDestroy:在容器銷燬bean之前通知我們進行清理工作
package com.meimeixia.bean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.stereotype.Component;
/**
*
* @author liayun
*
*/
@Component
public class Dog {
public Dog() {
System.out.println("dog constructor...");
}
// 在物件建立完成並且屬性賦值完成之後呼叫
@PostConstruct
public void init() {
System.out.println("dog...@PostConstruct...");
}
// 在容器銷燬(移除)物件之前呼叫
@PreDestroy
public void destory() {
System.out.println("dog...@PreDestroy...");
}
}
(四)通過讓bean實現BeanPostProcessor介面
package com.meimeixia.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
/**
* 後置處理器,在初始化前後進行處理工作
* @author liayun
*
*/
@Component // 將後置處理器加入到容器中,這樣的話,Spring就能讓它工作了
public class MyBeanPostProcessor implements BeanPostProcessor, Ordered {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// TODO Auto-generated method stub
System.out.println("postProcessBeforeInitialization..." + beanName + "=>" + bean);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
// TODO Auto-generated method stub
System.out.println("postProcessAfterInitialization..." + beanName + "=>" + bean);
return bean;
}
@Override
public int getOrder() {
// TODO Auto-generated method stub
return 3;
}
}
通過以上這四種方式,我們就可以對bean的整個生命週期進行控制:
- bean的例項化:呼叫bean的構造方法,我們可以在bean的無參構造方法中執行相應的邏輯。
- bean的初始化:在初始化時,可以通過BeanPostProcessor的postProcessBeforeInitialization()方法和postProcessAfterInitialization()方法進行攔截,執行自定義的邏輯;通過@PostConstruct註解、InitializingBean和init-method來指定bean初始化前後執行的方法,在該方法中我們們可以執行自定義的邏輯。
- bean的銷燬:可以通過@PreDestroy註解、DisposableBean和destroy-method來指定bean在銷燬前執行的方法,在該方法中我們們可以執行自定義的邏輯。
所以,通過上述四種方式,我們可以控制Spring中bean的整個生命週期。
相關文章
- 面試官問你MyBatis SQL是如何執行的?把這篇文章甩給他面試MyBatisSQL
- 以後有面試官問你跳躍表,你就把這篇文章扔給他面試
- 以後有面試官問你「跳躍表」,你就把這篇文章扔給他面試
- 面試官問你B樹和B+樹,就把這篇文章丟給他面試
- 【漫畫】以後在有面試官問你AVL樹,你就把這篇文章扔給他。面試
- 面試官問:“在專案中用過多執行緒嗎?”你就把這個案例講給他聽!面試執行緒
- 【漫畫】以後在有面試官問你平衡(AVL)樹,你就把這篇文章扔給他。面試
- 【Spring註解驅動開發】二狗子讓我給他講講@EnableAspectJAutoProxy註解Spring
- 再有人問你synchronized是什麼,就把這篇文章發給他。synchronized
- 再有人問你volatile是什麼,就把這篇文章發給他
- 再有人問你synchronized是什麼,就把這篇文章發給他synchronized
- 再有人問你volatile是什麼,就把這篇文章發給他,讓他啞口無言
- 面試官出的MySQL索引問題,這篇文章全給你解決!面試MySql索引
- 如果有人給你撕逼Java記憶體模型,就把這些問題甩給他Java記憶體模型
- 再有人問你Java記憶體模型是什麼,就把這篇文章發給他。Java記憶體模型
- 再有人問你Java記憶體模型是什麼,就把這篇文章發給他Java記憶體模型
- 【Spring註解驅動開發】BeanPostProcessor在Spring底層是如何使用的?看完這篇我懂了!!SpringBean
- 【Spring註解驅動開發】關於BeanPostProcessor後置處理器,你瞭解多少?SpringBean
- 你真的知道Spring註解驅動的前世今生嗎?這篇文章讓你豁然開朗!Spring
- 如果有人再問你 Java 的反射,把這篇文章扔給他Java反射
- 【Spring註解驅動開發】聊聊Spring註解驅動開發那些事兒!Spring
- 【Spring註解驅動開發】面試官:如何將Service注入到Servlet中?朋友又栽了!!Spring面試Servlet
- 面試官:註解五問你怕了嗎?面試
- 【String註解驅動開發】面試官讓我說說:如何使用FactoryBean向Spring容器中註冊bean?面試BeanSpring
- 還有人不懂分散式鎖的實現就把這篇文章丟給他分散式
- 【Spring註解驅動開發】如何使用@Value註解為bean的屬性賦值,我們一起吊打面試官!SpringBean賦值面試
- 再有人問你分散式鎖,這篇文章扔給他分散式
- 面試官,你再問我 Bit Operation 試試?面試
- 【Spring註解驅動開發】如何實現方法、構造器位置的自動裝配?我這樣回答讓面試官很滿意!Spring面試
- 當面試官問你Vue響應式原理,你可以這麼回答他面試Vue
- 如果再有人問你分散式 ID,這篇文章丟給他分散式
- 【Spring註解驅動開發】使用@Import註解給容器中快速匯入一個元件SpringImport元件
- 當面試官問你這個問題的時候,他想聽到什麼?面試
- Spring註解驅動開發第28講——為你嘔心瀝血分析建立和註冊AnnotationAwareAspectJAutoProxyCreator的過程,這應該是全網分析的最詳細的了!Spring
- 面試官:這就是你理解的Java多執行緒基礎?面試Java執行緒
- 【Spring註解驅動開發】使用@Scope註解設定元件的作用域Spring元件
- 如果有人再問你怎麼實現分散式延時訊息,這篇文章丟給他分散式
- 誰再說學不會 MySQL 資料庫,就把這個給他扔過去!MySql資料庫