1

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

所以我必须从 spring config 中读取标志,并基于它来执行特定的 class 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 来实现,以便在不需要时不会加载其他对象。我非常感谢这些建议。

4

2 回答 2

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 }
 }

在上面的配置中,只有matches()SomeCondition类中返回 true 时才会扫描类 A,您可以在其中定义条件。

于 2018-02-08T09:25:36.337 回答
0

您可以使用

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

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

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

于 2018-02-08T09:17:47.823 回答