gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:08:55 38 4
gpt4 key购买 nike

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

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

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
)
}

并尝试了所有接线和 Autowiring ....主要是返回 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)属性的唯一方法似乎是使用方法调用工厂 Bean( 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 中创建了一个 String SWITCH 变量 'appContext',这是我要注入(inject) AppProperty 类的目标变量。

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

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com