ioc 容器負責管理容器中所有 bean 的生命周期, 而在 bean 生命周期的不同階段, spring 提供了不同的擴展點來改變 bean 的命運. 在容器的啟動階段, beanfactorypostprocessor
允許我們在容器實例化相應對象之前, 對注冊到容器的 beandefinition
所保存的信息做一些額外的操作, 比如修改 bean 定義的某些屬性或者增加其他信息等.
beanpostprocessor 接口
如果希望在spring容器完成實例化、配置和初始化bean之后實現某些自定義邏輯, 則可以實現一個或多個 beanpostprocessor
接口.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public interface beanpostprocessor { @nullable default object postprocessbeforeinitialization(object bean, string beanname) throws beansexception { return bean; } @nullable default object postprocessafterinitialization(object bean, string beanname) throws beansexception { return bean; } } |
在 bean 實例化之后會先執行 postprocessbeforeinitialization
方法, 再執行 bean 的初始化方法, 然后在執行 postprocessafterinitialization
方法.
ordered 接口 @order 注解
此接口只有一個方法 int getorder();
用來設置執行順序.
如果實現多個 beanpostprocessor
接口, 我們就可以實現 ordered
接口來設置執行順序.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@component public class test implements beanpostprocessor, ordered { @override public object postprocessbeforeinitialization(object bean, string beanname) throws beansexception { return bean; } @override public object postprocessafterinitialization(object bean, string beanname) throws beansexception { return bean; } @override public int getorder() { return 1 ; } } |
也可以使用 @order
注解進行排序
1
2
3
4
5
6
7
8
9
10
|
@configuration @order ( 2 ) public class demo1config { @bean public demo1service demo1service(){ system.out.println( "demo1config 加載了" ); return new demo1service(); } } |
beanfactorypostprocessor 接口
在容器實例化相應對象之前, 對注冊到容器的 beandefinition
所保存的信息做一些額外的操作可以實現此接口.
區別
- beanfactorypostprocessor 會處理一些元數據.
- beanpostprocessor 會處理實例化后的對象.
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://segmentfault.com/a/1190000017197635