Я хочу загрузить определенный класс на основе флага вместо загрузки двух классов и использования одного необходимого в 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
вы инструктируете весну о том, как выполнить ваш запрос компонента.