java - 如何使用 Spring 将属性值注入(inject)到枚举或普通类的静态属性或方法中?

标签 java spring configuration dependency-injection static

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

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

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 :(

通过属性 setter 等注入(inject)属性根本不起作用。 字符串 appContext 总是结果为 NULL... 尝试过..

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

并在 java 类中使用它而不是属性.. @Value("${appContext}")

这还需要实例化 AppProperty.init(),这是我无法实现的。

我认为从配置 xml 注入(inject)属性的唯一方法似乎是使用 方法调用FactoryBean (How to make spring inject value into a static field)

我也尝试过这个,但不幸的是它也不起作用!!!! 我认为我可能做错的唯一一件事是没有正确使用@value标签

在配置文件中我使用:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="staticMethod" value="com.my.package.setAppContext"/>
    <property name="arguments"  value ="testing"/>
</bean>

在java文件AppProperty中我使用了

public static  String appContext;
  public void setAppContext(String appContext) {
    AppProperty.appContext = appContext;
    }

请求:请提供您的答案以及我可以使用的确切代码,因为我可能使用正确的解决方案,但缺少 Syntex 和配置.. 我应该在我的 AppProperty 类上使用 @Component 吗?等等...请提供详细信息并得到我的祝福...

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

最佳答案

在没有得到SO的帮助后..做了一些 self 斗争并找到了以下解决方案,如果它可以帮助某人:

我意识到 Spring Context 甚至在静态 block 之前就被初始化了。

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

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 接口(interface)来创建相同的类。

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

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

还在 spring config 中创建了一个字符串 SWITCH 变量“appContext”,这是我在 AppProperty 类中注入(inject)的目标变量。

   <bean id="appContext" class="java.lang.String"> 
   <constructor-arg value="Atlast..Injecting this string in a static block..."/> 
    </bean> 

最后......在上面的主类“AppProperty”中获取这个值......

public static String appContext;    // My problem .. see question above...now resolved

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

关于java - 如何使用 Spring 将属性值注入(inject)到枚举或普通类的静态属性或方法中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23278427/

相关文章:

java - 即使具有正确的授予权限,Spring Security @Secured 也会拒绝访问

java - Spring Data Repository 多线程性能

java - 如何测试 Spring @Scheduled

java - 从数组中删除某些内容但游戏崩溃

java - 如何在java中使用正则表达式将数字与字符串分开?

c# - log4net 日志记录不创建日志文件

Hadoop 和 Cassandra 集成如何

caching - Asp.Net Core 中全局变量的替代方法?

java - JUnit 在 Linux 上安装失败

java - 记录 404 的最小 Spring Boot 代码