首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何忽略自定义弹簧租户

如何忽略自定义弹簧租户
EN

Stack Overflow用户
提问于 2012-10-31 10:05:51
回答 1查看 1.7K关注 0票数 3

当我们使用自定义弹簧作用域时,我们有一个产品--“租户”。它与我们的系统架构紧密相关。

在产品使用期间,我们决定放弃这个范围,但我们真的不想破坏向后兼容性。换句话说,我们希望现有的产品实现能够在没有错误的情况下启动,比如:

初始化bean失败;嵌套异常为java.lang.IllegalStateException:没有为作用域“租户”注册的范围

我们也不希望在spring配置或任何java类(发生@Scope("tenant")的地方)纠正租户定义的任何出现。

使用自定义加载bean定义时,我们设法忽略了该作用域。

代码语言:javascript
运行
复制
XmlBeanDefinitionReader

似乎我们缺少了过滤任何bean创建(任何BeanDefinition )并忽略范围的一般概念--用Singleton替换它。

这是代码

下面是重写作用域的代码:

代码语言:javascript
运行
复制
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>

看起来它在大多数情况下都是有效的,除了这样的情况:精确的REGEX STARTS_WITH ENDS_WITH包含看起来它可以更改包装的作用域租户。

org.springframework.beans.factory.config.ListFactoryBean

但不是为了底层的豆子..。

值得一提的是,我们会逐个加载一个包含bean定义的文件。

EN

回答 1

Stack Overflow用户

发布于 2012-10-31 11:09:49

您能注册一个租户范围并将其实现为单例吗?

代码语言:javascript
运行
复制
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;
  }

}

并向下列机构登记:

代码语言:javascript
运行
复制
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
  <property name="scopes">
    <map>
      <entry key="tenant">
        <bean class="mypackage.TenantScopeMock" />
      </entry>
    </map>
  </property>
</bean>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13155472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档