3

カスタムスプリングスコープを使用した場合の製品があります-「テナント」。これは、システムアーキテクチャと密接に関連しています。

製品のライブ中に、このスコープを削除することにしましたが、下位互換性を壊したくありません。言い換えれば、既存の製品の実装を次のようにエラーなしで開始する必要があります。

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つずつ相互にロードすることです。

4

1 に答える 1

1

テナント スコープを登録してシングルトンとして実装できますか?

public class TenantScopeMock implements Scope {
  @Autowired private ApplicationContext appContext;

  public Object get(final String name, final ObjectFactory objectFactory) {
    if (!appContext.containsBean(name))
      ((SingletonBeanRegistry)appContext.getBeanFactory()).registerSingleton(name, objectFactory.getObject());
    return appContext.getBean(name);
  }

  public String getConversationId() {
    return null;
  }

  public void registerDestructionCallback(final String theName, final Runnable callback) {
  }

  public Object resolveContextualObject(String key) {
    return null;
  }

  public Object remove(final String theName) {
    return null;
  }

}

そして登録します:

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
  <property name="scopes">
    <map>
      <entry key="tenant">
        <bean class="mypackage.TenantScopeMock" />
      </entry>
    </map>
  </property>
</bean>
于 2012-10-31T11:09:49.133 に答える