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を実現
現在のアイデアは上書き向けることであるcheckCandidate
Beanクラスによって判断にそこ@Replaceコメントが検査に合格するかどうかを決定する場合、メソッドを。
まで拡張するためにConfigurationClassPostProcessor
Springコンテナポストプロセッサ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コンポーネントは、私たち自身の実現に置き換えられている見ることができます。