Java 如何使用Spring将属性值注入枚举或普通类的静态属性或方法?
由于某种情况,我遇到了严重的麻烦。这是我的问题 问题:需要从spring配置XML在枚举类中注入一个简单的静态字符串字段/属性。 下面是我测试过的一些类似代码: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; }
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();
}