我想加载一个基于标志的特定类,而不是加载两个类并使用 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.(Lorg/springframework/expression/spel/SpelCompilerMode;Ljava/lang/ClassLoader;)V"【参考方案2】:

你可以使用

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

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

使用@Qualifier,您正在指导 spring 如何满足您的组件请求。

【讨论】:

以上是关于我想加载一个基于标志的特定类,而不是加载两个类并使用 Springs 中所需的一个的主要内容,如果未能解决你的问题,请参考以下文章

TDD测试数据加载方法

如何从 .cs 文件加载类

如何在 HTML 页面加载时使用 JFrames 打开 Applet

动态加载类并实例化对象 —— newInstance

在类中选择一个类并使其具有自己的行

java扫描某个包下的所有java类并加载