Java 如何使用Spring将属性值注入枚举或普通类的静态属性或方法?

Java 如何使用Spring将属性值注入枚举或普通类的静态属性或方法?,java,spring,configuration,dependency-injection,static,Java,Spring,Configuration,Dependency Injection,Static,由于某种情况,我遇到了严重的麻烦。这是我的问题 问题:需要从spring配置XML在枚举类中注入一个简单的静态字符串字段/属性。 下面是我测试过的一些类似代码: public enum AppProperty { NUMBER_OF_ACCOUNTS("accounts"), NUMBER_OF_USERS("users"); private AppProperty(String cuser) { this.current_user = cuser; }

由于某种情况,我遇到了严重的麻烦。这是我的问题

问题:需要从spring配置XML在枚举类中注入一个简单的静态字符串字段/属性。 下面是我测试过的一些类似代码:

public enum AppProperty {
    NUMBER_OF_ACCOUNTS("accounts"), NUMBER_OF_USERS("users");

    private AppProperty(String cuser) {
        this.current_user = cuser;
    }

    private final String current_user;
    private static final String PROPERTY_FILE = "application.properties";

    static {
        init();
    }

    public static String appContext; // **PROBLEM** : need to populate this ONLY
                                        // from spring config XML via property
                                        // injection.

    public static void init() {

        if (appContext.equals("statement")) {
            // do something..... generate statement et...
        } else {
            // do some other process... generate balance etc
        }
    }

    ..........  few more static methods...
    ..... few more non-static methods
}// end of class
对于这个简单的问题,我几乎尝试了所有方法,但奇怪的是,Spring 3.1似乎没有任何效果:(

通过属性设置器等注入属性根本不起作用。。 字符串appContext始终为空。。。 尽力

 @Autowired(required = true)
   setAppConfig( String context){
AppProperty.appContext = context
)
}
并尝试了每种连接和自动连接…通常返回null或异常“AppProperties.init()不能作为无默认构造函数调用…” (看在上帝的份上,甚至尝试了一个默认构造函数,但都不起作用

所以,让我们从一个属性文件中获取这个属性并完成它,但这也不起作用,并且存在同样的问题

<context:component-scan base-package="com.my.package" /> 
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:application.properties</value>
        </list>
    </property>
</bean>
请求:请提供我可以使用的准确代码,因为我可能使用正确的解决方案,但缺少Syntex和配置。。 我是否应该在AppProperty类上使用@Component!!等…请提供详细信息并获得我的祝福

注意:我需要通过Spring Config XML注入此属性,以便在运行时更改上下文..因为我不允许更改此类的现有实现。 所以请不要建议用其他东西删除enum类。。。
提前感谢。

在没有SO的帮助后……进行了一些自我斗争,并找到了以下解决方案,如果它能帮助某人:

我意识到Spring上下文甚至在静态块出现之前就已经初始化了

因此,为了间接获取上下文,我们创建了一个类来获取上下文

public class SpringBean  {

@Autowired
private  ApplicationContext applicationContext;

private static SpringBean bean = new SpringBean();

public static SpringBean getInstance() {
    return bean;
}


public ApplicationContext getApplicationContext() {
    return applicationContext;
}

public Object getBean(String beanName) {
    if (applicationContext == null) {
        throw new IllegalStateException("No context  initialised.");
    }
    return applicationContext.getBean(beanName);
} 

} 
注意:SpringBean可以通过实现ApplicationContextAware接口创建相同的类

在spring配置文件中将其声明为:

  <context:annotation-config/>      
  <bean    class="com.db.icestation.server.pd.common.SpringBean"
    factory-method="getInstance"/>

很抱歉,但您运气不好,Spring可以在创建类实例后注入任何内容。在此之前,Spring没有该控件。您可以通过反射对该字段进行黑客攻击,以从Spring中注入所需的值(但它太脏、太脏,您应该避免它)@LuiggiMendoza实际上我也试过了..它很有效..我所做的是..在AppProperty类中,我使用InputStream/Java IO等读取属性文件..并且我能够读取属性..我的应用程序的要求是在运行时更改加载此类的行为..但是在UAT中,我有不同的spring配置文件e和生产我还有一个。我想将此属性添加到spring XML中,以便我可以从它部署的环境的XML中读取它。这是一个无效的要求,不能用spring完成,请使用另一个策略。句号。@LuiggiMendoza没有什么是不可能的,我的朋友。请参阅下面我的解决方案。.经过测试,它现在可以正常工作。有时我们会限制为现有代码提供功能…因此需要根据现有代码库调整解决方案…无论是好是坏…只是无法重构应用程序以将解决方案带入代码段…尤其是当您是新加入工作的人员时:)
public class SpringBean  {

@Autowired
private  ApplicationContext applicationContext;

private static SpringBean bean = new SpringBean();

public static SpringBean getInstance() {
    return bean;
}


public ApplicationContext getApplicationContext() {
    return applicationContext;
}

public Object getBean(String beanName) {
    if (applicationContext == null) {
        throw new IllegalStateException("No context  initialised.");
    }
    return applicationContext.getBean(beanName);
} 

} 
  <context:annotation-config/>      
  <bean    class="com.db.icestation.server.pd.common.SpringBean"
    factory-method="getInstance"/>
   <bean id="appContext" class="java.lang.String"> 
   <constructor-arg value="Atlast..Injecting this string in a static block..."/> 
    </bean> 
public static String appContext;    // My problem .. see question above...now resolved

 static{
  appContext = SpringBean.getInstance().getBean("appContext").toString();
  init();
  }