カスタムスプリングスコープを使用した場合の製品があります-「テナント」。これは、システムアーキテクチャと密接に関連しています。
製品のライブ中に、このスコープを削除することにしましたが、下位互換性を壊したくありません。言い換えれば、既存の製品の実装を次のようにエラーなしで開始する必要があります。
Beanの初期化に失敗しました。ネストされた例外はjava.lang.IllegalStateExceptionです:スコープ'tenant'にスコープが登録されていません
また、Spring構成またはJavaクラス( @Scope("tenant")
発生する場所)でのテナント定義の発生を修正したくありません。
カスタムを使用してBean定義をロードしている間、スコープを無視することができました
XmlBeanDefinitionReader
Beanの作成(BeanDefinition)をフィルタリングし、スコープを無視するという一般的な概念が欠落しているようです。これをシングルトンに置き換えてください。
これがコードです
スコープをオーバーライドするコードは次のとおりです。
new ReaderEventListener()
{
@Override
public void importProcessed(final ImportDefinition importDefinition)
{
//
}
@Override
public void defaultsRegistered(final DefaultsDefinition defaultsDefinition)
{
//
}
@Override
public void componentRegistered(final ComponentDefinition componentDefinition)
{
for (final BeanDefinition beanDefinition : componentDefinition.getBeanDefinitions())
{
if ("tenant".equalsIgnoreCase(beanDefinition.getScope()))
{
beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
if (LOG.isDebugEnabled())
{
LOG.debug("Adjusting bean defintion for " + beanDefinition
+ " - ignoring tenant scope - please modify it manually to avoid confussion.");
}
}
}
for (final BeanDefinition beanDefinition : componentDefinition.getInnerBeanDefinitions())
{
if ("tenant".equalsIgnoreCase(beanDefinition.getScope()))
{
beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
if (LOG.isDebugEnabled())
{
LOG.debug("Adjusting bean defintion for " + beanDefinition
+ " - ignoring tenant scope - please modify it manually to avoid confussion.");
}
}
}
}
@Override
public void aliasRegistered(final AliasDefinition aliasDefinition)
{
//
}
}); <code>
そのような場合を除いて、ほとんどの場合に機能しているようです。EXACT REGEX STARTS_WITHENDS_WITHCONTAINSラッピングのスコープテナントを変更できるようです。
org.springframework.beans.factory.config.ListFactoryBean
しかし、基礎となるBeanについてはそうではありません...。
言及する価値のあることは、私たち自身がBean定義を含むファイルを1つずつ相互にロードすることです。