2014-08-31 3 views
3

Мы можем установить имена классификаторов для компонента (например, @Qualifier(value="myBeanQualifiedName")). но я хочу знать, как установить имя классификатора во время выполнения в классе @Configuration.Как установить имя квалификатора компонента во время выполнения весной

Предположим, что на основе логики приложения я хочу указать имя в качестве классификатора в файле конфигурации.
Редакция:

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 имя квалификатора для вновь созданного компонента? и как получить такие бобы с именем квалификатора (имя классификатора известно)? Например, в другом месте,
Строка qalifierName = "QulifierName" + подготовленаConditionedString; @Autowired @Qualified (qalifierName)

Строка qalifierName2 = "QulifierName" + preparedConditionedString2;
@Autowired @Qualified (qalifierName2)

Кроме того, вы можете думать, что, если мы упорно код отборочные .. но думаю, что если там 20 или более экземпляров, которые будут созданы? Мы должны повторять коды.

+0

Какие условия мы говорим?Кроме того, почему вы заботитесь о квалификаторе, если вы правильно создали компонент? – geoand

+1

Посмотрите на ServiceLocatorFactoryBean – Hannes

+0

@geoand. Предположим, что на основе условия параметр, заданный для bean-компонента, может быть изменен. Это может быть похоже на заводскую модель. Кроме того, исходя из значений параметров, то, что компонент bean также может быть изменен, чем другие, когда компонент используется. Поэтому получение правильного компонента важно. –

ответ

3

Расширение на моем «Посмотрите 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 Интерфейс Это позволит отобразить прототип бобы струнной решение (основной функции от вас вопрос).

public interface IServiceFactory 
{ 
    IBean getNewInstance(String identifier); 
} 

IBean Интерфейс Это позволит обрабатывать возвращаемый боб (прототип) с завода.

public interface IBean 
{ 
    //TODO 
} 

IDecisionMaker интерфейс. Это сделает ваши процессы принятия решений вне зависимости от вашего заводского кода. Реализация принимает вашу строку condition и возвращает имя свойства, которое приведет к IBean из реализации/конфигурации IServiceFactory.

public interface IDecisionMaker 
{ 
    String decide(String condition); 
} 

The 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> 
+0

Я ценю вашу поддержку Ханнес и большое спасибо за ваш подробный образец. –

Смежные вопросы