インタフェースBeanPostProcessor
-
org.springframework.beans.factory.config.BeanPostProcessor
- postProcessAfterInitialization(オブジェクト・ビーン、文字列のbeanName)
- postProcessBeforeInitialization(オブジェクト・ビーン、文字列のbeanName)
-
例えば、チェックマーク、またはインタフェースのプロキシラッパーBean - 新しいマメ植物フックのカスタム変形例が可能。
-
典型的には、Beanはマーキングによって充填またはインターフェイスプロセッサ後などpostprocessbeforeinitialize(java.langで)を実装します。プロキシラッパービーンポストプロセッサの使用は、通常postprocessafterinitialize方法を達成されます。
登録
- 自動的BeanPostProcessor豆のBean定義を検出し、任意のその後に作成されたものをポストプロセッサBeanを適用することができますのApplicationContext。プログラム登録に後処理プログラムを許可たBeanFactoryは、Beanの工場ですべてのBeanを作成するためにそれらを適用します
優先度の高い順
- 自動的にApplicationContextのBeanPostProcessor豆から検出されたソートやPriorityOrderedセマンティクスを注文することになります。順序インタフェースはPriorityOrdered発現を実現任意の登録や順序セマンティクスによって方法をプログラムされたプロセッサでは無視され、代わりに、プログラムたBeanFactoryを適用するためにBeanPostProcessor Beanが登録する登録。また、@OrderコメントのアカウントBeanPostProcessor豆を考慮せずに。
postProcessAfterInitialization(オブジェクト・ビーン、文字列のbeanName)
- 任意ビーン初期化コールバック(afterPropertiesSetの例えばInitializingBeanまたはカスタムINIT-方法)以下、本BeanPostProcessorは、与えられた新しいBeanインスタンスに適用されます。
- 豆の属性値が満たされました。Beanインスタンスは、元のBeanラッパーを返すことができます。
- デフォルトの実装では、特定のBeanとして返します。
postProcessBeforeInitialization(オブジェクト・ビーン、文字列のbeanName)
- 任意ビーン初期化コールバック(例えばafterPropertiesSetのInitializingBeanまたはカスタムINIT-方法)の前に、このBeanPostProcessorは、与えられた新しいBeanインスタンスに適用されます。
- 豆の属性値が満たされました。Beanインスタンスは、元のBeanラッパーを返すことができます。
- FactoryBeanのために、このコールバックが呼び出されると、オブジェクトのインスタンスFactoryBeanのFactoryBeanのは、(春2.0の最初から)作成しました。
- オブジェクトがFactoryBeanのが適用、またはinstanceofのFactoryBeanの各ビーンによって確認されたの両方に適用作成された後、プロセッサは、決定されてもよいです。
- このコールバックもInstantiationAwareBeanPostProcessor.postProcessBeforeInstantiationの方法ではなく、他のすべてのBeanPostProcessorコールバックとなります。
- デフォルトの実装では、特定のBeanとしてそれを返します
利用シナリオ
- 代理店サービス、インターフェイス上コレクトのカスタム注釈;
シーンワン:收集接口上的自定义注解
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Repository;
import java.util.HashSet;
import java.util.Set;
/**
* 收集自定义注解
*
* @Author JQ.Wang
* @Date 2020/4/7
*/
@Repository
@Configuration
@Slf4j
public class CollectCustomAnnotations implements BeanPostProcessor {
@Getter
@Setter
private Set<Object> serviceInstances;
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
/** 接口 */
if (bean.getClass().isAnnotationPresent(CustomAnnotations.class)) {
if (serviceInstances == null) {
serviceInstances = new HashSet<>();
}
serviceInstances.add(bean);
}
return bean;
}
}