Я хочу загрузить определенный класс на основе флага вместо загрузки двух классов и использования одного необходимого в Springs

В конфигурациях у меня есть флаг isFlagEnabled.

Поэтому я должен прочитать флаг из весеннего конфига и на основании этого я хочу выполнить определенный класс A или B . Это означает, что я хочу загружать класс A только тогда, когда isFlagEnabled имеет значение true, и аналогичным образом загружать класс B только тогда, когда isFlagEnabled имеет значение false.

Я написал код ниже, но я застрял при приеме внутрь.

public interface MediatorInt {

public void init();

}

class A implements MediatorInt {
        init() { It does some task }
    }

class B implements MediatorInt {
    init(){ It does some task }
}

public class MasterNewGenImpl {
    @Autowired
    @Qualifier("config")
    private Configuration config;

    @Autowired
    MediatorInt mediatorInt;

    private final Logger logger = Logger.getLogger(getClass());

    public void startService() {
        mediatorInt.init();
    }
}

файл context.xml

  <context:component-scan base-package="com.ca"/>
    <bean id="config" class="com.ca.configuration.ConfigImplementation"/>    
    <bean id="masterSlave" class="com.ca.masterslave.A"/>
    <bean id="systemState" class="com.ca.masterslave.B"/>
    <bean id="masterSlaveNewGen" class="com.ca.masterslave.MasterNewGenImpl">
    <property name = "mediatorOrMasteSlave" value="#{config.getMediatorMode() == 'true' ? 'systemState' : 'masterSlave'}" />
</bean>

Так что теперь я не понимаю, как ввести конкретный объект на основе флага конфигурации. Я хочу сделать это через Lazy-init, чтобы другой объект не загружался, когда это не требуется. Я очень ценю предложения.

2 ответа

Решение

Если у вас все в порядке с пружинным сканированием обеих реализаций, то вы можете выбрать нужную, используя @Qualifier, Если вы хотите, чтобы Spring не сканировал какой-либо класс на основе свойства, вы можете использовать @Conditional

class SomeCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

        String isFlagEnabled = context.getEnvironment().getProperty("isFlagEnabled");
        return isFlagEnabled.equals("true"));
    }
}

@Configuration
@Conditional(value = SomeCondition.class)
class A implements MediatorInt {
        init() { It does some task }
 }

В приведенном выше конфигурации, класс A сканируется только если matches() в SomeCondition класс возвращает true, где вы можете определить условие.

Ты можешь использовать

@Autowired
@Qualifier( "systemState" )
MediatorInt systemSateMeidator;

@Autowired
@Qualifier( "masterSlave" )
MediatorInt masterSateMeidator;

С @Qualifier вы инструктируете весну о том, как выполнить ваш запрос компонента.

Другие вопросы по тегам