当我们使用自定义弹簧作用域时,我们有一个产品--“租户”。它与我们的系统架构紧密相关。
在产品使用期间,我们决定放弃这个范围,但我们真的不想破坏向后兼容性。换句话说,我们希望现有的产品实现能够在没有错误的情况下启动,比如:
初始化bean失败;嵌套异常为java.lang.IllegalStateException:没有为作用域“租户”注册的范围
我们也不希望在spring配置或任何java类(发生@Scope("tenant")的地方)纠正租户定义的任何出现。
使用自定义加载bean定义时,我们设法忽略了该作用域。
XmlBeanDefinitionReader似乎我们缺少了过滤任何bean创建(任何BeanDefinition )并忽略范围的一般概念--用Singleton替换它。
这是代码
下面是重写作用域的代码:
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定义的文件。
发布于 2012-10-31 11:09:49
您能注册一个租户范围并将其实现为单例吗?
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>https://stackoverflow.com/questions/13155472
复制相似问题