由于某种情况,我遇到了严重的麻烦。这是我的问题。
问题:需要在 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/