、InitializingBeanインタフェース
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
public interface DisposableBean {
void destroy() throws Exception;
}
第二に、概要
インターフェイスの名前を見つけることは困難ではない、InitializingBean役割は、Beanの初期化後にカスタマイズされた操作を実行することです。
Springコンテナ豆は人生の春の豆の初期化は、豆の破壊方法は、一般的にセットで使用されている特定のアクションの前に完了することができ、サイクル、および3を以下の通りです:
- 初期化後の方法の操作の前にカスタマイズInitializingBean / DisposableBeanインタフェース/破壊を実装することによって、
- <豆>によってINIT-方法の後に要素/破壊法プロパティは、メソッド呼び出しの動作の前に初期化/破壊を指定します。
- プラス、この方法を開発するために指定したメソッドの@PostConstructや@PreDestroyのコメントは前に呼ばまたは初期化後に破壊されます。
三、InitializingBean対のinitメソッド
- 豆スプリングBeanがInitializingBeanインタフェースを実現初期化する2つの方法を提供し、またはコンフィギュレーションファイルで指定されたINIT-法によるafterPropertiesSet方法は、二つの方法を同時に使用することができます
- ダイレクトコールインターフェイスはafterPropertiesSet方法で実装InitializingBean、方法によってより反射効率が比較的高くなるように指定されたINIT-メソッドを呼び出します。しかし、INIT-法のアプローチは、春への依存を解消します
- その後、AfterPropertiesSet最初の呼び出しに、initメソッドのアプローチを実行するには、あなたがafterPropertiesSetメソッドを呼び出した場合に、initメソッドで指定したメソッドが呼び出されないエラーでした。
四、@ PostConstruct
コールスタックによって発見され、デバッグクラスInitDestroyAnnotationBeanPostProcessor
、メソッドの前記コア、すなわち、 @PostConstruct
メソッドコールエントリ:
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
LifecycleMetadata metadata = findLifecycleMetadata(bean.getClass());
try {
metadata.invokeInitMethods(bean, beanName);
}
catch (InvocationTargetException ex) {
throw new BeanCreationException(beanName, "Invocation of init method failed", ex.getTargetException());
}
catch (Throwable ex) {
throw new BeanCreationException(beanName, "Failed to invoke init method", ex);
}
return bean;
}
名前から、我々はいくつかの情報を得ることができます-これはBeanPostProcessorです。何を考えて?話春のコンテナのライフサイクル、postProcessBeforeInitialization豆の言及BeanPostProcessorはafterPropertiesSetし、initメソッドの前に呼び出されるライフサイクルです。また追跡することによって、@PostConstruct
発光メカニズムの方法と手段によっても呼び出します。
概要
- 春豆初期化の実行順序:コンストラクタ- >
@PostConstruct
メソッド注釈- >afterPropertiesSet
メソッド- >init-method
指定された方法。具体的には、を参照することができます afterPropertiesSet
インターフェース(少し高い効率)呼び出しを介して、@PostConstruct
そしてinit-method
それが機構を呼び出すことにより、反射され
INIT-方法の例
// 通过<bean>的init-method属性指定的初始化方法
public void myInit() {
System.out.println("【init-method】调用<bean>的init-method属性指定的初始化方法");
}
// 通过<bean>的destroy-method属性指定的初始化方法
public void myDestory() {
System.out.println("【destroy-method】调用<bean>的destroy-method属性指定的初始化方法");
}
<bean id="person" class="com.ooo.life.Person" init-method="myInit"
destroy-method="myDestory" scope="singleton" p:name="张三" p:address="广州"
p:phone="159000" />