我想根据标志加载特定的 class,而不是加载两个 class 并使用 Springs 中所需的一个

I want to load a specific class based on a flag instead of loading two class and using one the required in Springs

在配置中我有一个标志 isFlagEnabled。

所以我必须从 spring 配置中读取标志,并基于它我想执行特定的 class A 或 B 。这意味着我只想在 isFlagEnabled 为真时加载 A class 并且类似地仅在 isFlagEnabled 为假时加载 class 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 完成它,以便在不需要时不会加载其他对象。 我非常感谢这些建议。

您可以使用

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

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

@Qualifier 您是在指导 spring 如何满足您的组件请求。

如果您可以 spring 扫描这两种实现,那么您可以 select 使用 @Qualifier 需要的实现。如果你希望spring不扫描一些class基于属性,你可以使用@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 }
 }

在上面的配置中,只有matches() in SomeCondition class returns 为真时才会扫描classA,这里可以定义条件。