春の拡張子:IOCコンテナBeanコンポーネントを交換 - @Replace注釈

1.背景:

    そのようなシーンの仕事はありますか?ソフトウェアシステムは、いくつかの異なるバージョンが、私は、今、IMシステムを行う他の銀行への同社の技術の輸出と同時に、別の銀行は(そのようなログイン認証、ユーザ情報クエリとして)を達成するために、独自のビジネスを持っているなど、あると同時に展開されます。あなたは、クラスBのロジックを変更したい場合や、同社の第二者パッケージAに依存して、プロジェクト、およびBは...これらのjarパッケージコンポーネントに依存しては、Springコンテナで管理されていますしかし、あなたはBの特別バージョンと闘うために、人々のアーキテクチャグループを任せることはできない。それを行う方法?以下の下では、独自の実装を置き換えるコンポーネント(豆)豆のSpringコンテナに直接検討することができますか?

2、原則&実現

私たちの展開を見てみることを2.1春オープン

    言うよりも優れたスケーラビリティ春の枠組み言うまでもなく、我々は単にBeanPostProcessorによってコンテナ豆を置き換えることができます。

@Component
public class MyBeanPostProcessor implements ApplicationContextAware, BeanPostProcessor {
    private ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("defaultConfig")) {
            // 如果遇到需要替换的Bean,我们直接换成自己实现的bean
            // 这里的myConfig要继承自defaultConfig,否则引用的地方会报错
            return applicationContext.getBean("myConfig");
        }
        return bean;
    }
}

利点:

  • 直接ネイティブ拡張春がスムーズにアップグレードすることができます
  • 豆のこの方法をお勧めします交換するシンプルで、簡単に理解し、簡単にはわずか数必要性のために、ケースを操作します

短所:

  • beanNameを使用すると、関係の構成プロパティを置き換えることができますが、コード内にハードコードされたが、複数のバージョンの展開、に負担になります。この関係を維持し、より多くの豆交換するとき
  • 単純にBeanオブジェクトを置き換える、などのような容器やBeanDefinition本来の目的であるため、メタデータのために、いくつかの制限があります

2.2もう少しエレガントな代替

    春は底が実際のConcurrentHashMapで、実際にはコンテナです。あなたがマップエントリに置き換えたい場合は、コールはそれに再び別のキーの値を設定するために、同じ方法を置きます。あなたは春のコンテナBeanコンポーネントを交換したい場合は同様に、我々は同じ名前を持つBeanを再定義し、その中に登録してください。もちろん、直接の豆は、同じ名前を持つ2つの中で春を渡すことができなかったことを述べClassPathBeanDefinitionScanner、チェック我々は少し拡張を行う必要があり、この時間を。

そのClassPathBeanDefinitionScannerを実現

現在のアイデアは上書き向けることであるcheckCandidateBeanクラスによって判断にそこ@Replaceコメントが検査に合格するかどうかを決定する場合、メソッドを。

まで拡張するためにConfigurationClassPostProcessorSpringコンテナポストプロセッサBeanFactoryPostProcessor(上記の、私たちは豆のプロセッサを使用します。BeanPostProcessor)の中で非常に重要である、あなたは、この方法がClassPathBeanDefinitionScanner processConfigBeanDefinitions独自の実装を導入上書きすることができます。
:詳細については、を参照することができますhttps://github.com/hiccup234/spring-ext.git

図3に示すように、使用の例

    プロジェクト内の直接の増加は、次の座標(Mavenの中央リポジトリ)は、現在のバージョンでは、Springの5.2.2.RELEASEがそうである、そして春の相対3.Xの新バージョンでは、4.Xは、いくつかのコードの変更を持っています。

<dependency>
    <groupId>top.hiccup</groupId>
    <artifactId>spring-ext</artifactId>
    <version>5.2.2.0-SNAPSHOT</version>
</dependency>

春ブーツのためにSpringApplication少し延長、上記の延長行うにはConfigurationClassPostProcessor容器に登録します。

:独自のクラスの宣言、及び遺伝豆の種類は次のように、(いくつかの方法は、自分の処理ロジックを追加するためにオーバーライドすることができるオリジナルこのBean)、次いで@Replace(「defaultConfig」)で修飾された交換を必要と

することによってExtSpringApplication開始は、あなたが実際の春のコンテナビーンBeanコンポーネントは、私たち自身の実現に置き換えられている見ることができます。

おすすめ

転載: www.cnblogs.com/ocean234/p/12320633.html