在配置中,我有一个标志isFlagEnabled。
因此,我必须从spring config中读取标志,并根据该标志执行特定的类A或B。意思是我只想在isFlagEnabled为true时加载A类,类似地,仅当isFlagEnabled为false时才加载B类。
我已经编写了以下代码,但是在摄取时卡住了。
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>
所以现在我不知道如何基于config标志注入特定的对象。我想通过Lazy-init进行创建,以便在不需要时不会加载其他对象。我非常感谢这些建议。
如果您可以spring扫描两个实现,那么您可以使用选择一个@Qualifier。如果您希望spring不基于属性扫描某些类,则可以使用@Conditional
@Qualifier
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,在这里你可以定义条件。
matches()
SomeCondition