java-如何在Spring的运行时设置bean限定符名称
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-如何在Spring的运行时设置bean限定符名称,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3400字,纯文字阅读大概需要5分钟。
内容图文
![java-如何在Spring的运行时设置bean限定符名称](/upload/InfoBanner/zyjiaocheng/661/d872a1b1bc59452bbb9755c6410f8ecd.jpg)
我们可以为bean设置限定符名称(例如@Qualifier(value =“ myBeanQualifiedName”)).但是我想知道如何在运行时在@Configuration类中设置限定符名称.
假设基于应用程序逻辑,我想在配置文件中给Bean一个名称作为限定符.
编辑:
ConcreteBean是MyAbstractBean的子类.
@Configuration
public class MyBeanFactory {
@Bean
public MyAbstractBean getMySpecifiedBean(String condition){
String QUALIFIER_NAME="QulifierName"+condition;
if(//some condition here ){
//How to set a qualifier name :QUALIFIER_NAME for this ConcreteBean instance?
MyAbstractBean b1= new ConcreteBean();
b1.setService(new AnotherService1); // and set some field values to this concrete bean
return b1;
}
else {
MyAbstractBean b2= new ConcreteBean();
b2.setService(new AnotherService2);
return b2;
}
}
}
假定从不同的位置调用getMySpecifiedBean()方法,并且每个位置需要不同的实例,但是类型为ConcretBean().实例彼此不同是因为setService()方法设置了不同的属性值.因此,b1和b2将与使用它们的服务实例做不同的事情.
在上面的示例中,将根据条件更改QUALIFIER_NAME名称,然后我们可以将准备好的QUALIFIER_NAME分配给新创建的bean的限定符名称吗?以及如何使用限定符名称(已知限定符名称)获取此类bean?例如在另一个位置,
字符串qalifierName =“ QulifierName” prepareConditionedString;
@Autowired
@合格(qalifierName)
字符串qalifierName2 =“ QulifierName” prepareConditionedString2;
@Autowired
@合格(qalifierName2)
另外,如果我们对限定符进行硬编码,您可能会想.但是,如果要创建20个或更多实例,该怎么办?我们必须重复代码.
解决方法:
扩展我的“看看ServiceLocatorFactoryBean”注释:
public class MyBeanFactory
{
private IServiceFactory serviceFactory;
private IDecisionMaker decisionMaker;
public IBean createNewInstance(final String condition)
{
String conditionResult = decisionMaker.decide(condition);
return serviceFactory.getNewInstance(conditionResult);
}
public void setServiceFactory(final IServiceFactory serviceFactory)
{
this.serviceFactory = serviceFactory;
}
public void setDecisionMaker(final IDecisionMaker decisionMaker)
{
this.decisionMaker = decisionMaker;
}
}
IServiceFactory接口
这将允许您将原型bean映射到决策字符串(您问题的核心功能).
public interface IServiceFactory
{
IBean getNewInstance(String identifier);
}
IBean接口
这将使您能够从工厂处理返回的bean(原型).
public interface IBean
{
//TODO
}
IDecisionMaker界面.
这将使您的决策过程独立于您的工厂代码.
一个实现接受您的条件字符串并返回一个属性名称,这将导致IServiceFactory实现/配置中的IBean.
public interface IDecisionMaker
{
String decide(String condition);
}
Spring xml Konfiguration
<! implementations of the IBean interface -->
<bean id="myBeanRed" class="..." scope="prototype" />
<bean id="myBeanBlue" class="..." scope="prototype" />
<bean id="myBeanGreen" class="..." scope="prototype" />
<!-- the decision maker -->
<bean id="decisionMaker" class="...">
<!-- define your decision making here like:
condition(color=red)->red
condition(color=blue)->blue
condition(ELSE)->green
-->
</bean>
<!-- the abstract factory -->
<bean id="myBeanServiceFactory" class="org.springframework.beans.factory.config.ServiceLocatorFactoryBean">
<property name="serviceLocatorInterface" value="...IServiceFactory "/>
<property name="serviceMappings">
<props>
<prop key="red">myBeanRed</prop>
<prop key="blue">myBeanBlue</prop>
<prop key="green">myBeanGreen</prop>
</props>
</property>
</bean>
<!-- the factory -->
<bean id="myBeanFac" class="...MyBeanFactory" scope="singleton">
<property name="serviceFactory" ref="myBeanServiceFactory" />
<property name="decisionMaker" ref="decisionMaker" />
</bean>
内容总结
以上是互联网集市为您收集整理的java-如何在Spring的运行时设置bean限定符名称全部内容,希望文章能够帮你解决java-如何在Spring的运行时设置bean限定符名称所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。