我想加载一个基于标志的特定类,而不是加载两个类并使用 Springs 中所需的一个
Posted
技术标签:
【中文标题】我想加载一个基于标志的特定类,而不是加载两个类并使用 Springs 中所需的一个【英文标题】:I want to load a specific class based on a flag instead of loading two class and using one the required in Springs 【发布时间】:2018-07-18 18:58:58 【问题描述】:在配置中我有一个标志 isFlagEnabled。
所以我必须从 spring 配置中读取标志,并基于此我想执行特定的类 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>
所以现在我不知道如何根据配置标志注入特定对象。我想通过 Lazy-init 来实现,以便在不需要时不会加载其他对象。 我非常感谢这些建议。
【问题讨论】:
你用的是哪个版本的spring 我正在使用 Spring 4.1.6.RELEASE 【参考方案1】:如果您对 spring 扫描这两种实现都没有问题,那么您可以使用 @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
在上述配置中,仅当SomeCondition
类中的matches()
返回true 时才扫描A 类,您可以在其中定义条件。
【讨论】:
感谢您的回复。抱歉,我不清楚 Condition 接口以及如何在我的方法中获取 ConditionContext 上下文 你什么都不用做,Spring会为你注入。您可以按原样使用上面的代码,唯一的事情是您的属性文件中应该有 isFlagEnabled 是的,我的属性中有标志。我按原样复制了代码,它给出了 Condition 、ConditionText 和 AnnotatedTypeMetadata 的错误,它建议我导入 org.springframework.core.type.AnnotatedTypeMetadata;那么你能告诉我应该导入哪个类条件文本import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata;
我的领导建议我使用 SPEL 来实现这一点,所以我尝试使用 SPEL 加载 bean,如 context.xml 中所示,但我的配置本身没有被加载,出现“java.lang”异常.NoSuchMethodError: org.springframework.expression.spel.SpelParserConfiguration.你可以使用
@Autowired
@Qualifier( "systemState" )
MediatorInt systemSateMeidator;
@Autowired
@Qualifier( "masterSlave" )
MediatorInt masterSateMeidator;
使用@Qualifier
,您正在指导 spring 如何满足您的组件请求。
【讨论】:
以上是关于我想加载一个基于标志的特定类,而不是加载两个类并使用 Springs 中所需的一个的主要内容,如果未能解决你的问题,请参考以下文章