Spring框架給類的靜態變數初始化
阿新 • • 發佈:2019-02-19
工作中遇到一個問題給工具類靜態變數初始化,就記錄了一下。
這裡需要注意一下不可以直接使用@Value註解的方式給靜態變數初始化賦值;
1.第一種是用spring配置檔案
下面是java類,其中註釋的註解是試驗註解方式,結果是得不到值;一定要有靜態變數的set方法,否則會報錯;本來這個demo是測試@PostConstruct註解的;
package test; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; //@Component("testPostConstruct") public class TestPostConstruct { // @Value("${name}") private String name; // @Value("${age}") private static String age; public TestPostConstruct() { System.out.println("此時b還未被注入:name = " + name); } @PostConstruct private void init() { System.out.println("@PostConstruct將在依賴注入完成後被自動呼叫: name = " +name); } public String getName() { return name; } public void setName(String name) { this.name = name; } public static String getAge() { System.out.println("age:"+TestPostConstruct.age); return age; } public static void setAge(String age) { TestPostConstruct.age = age; } @Override public String toString() { return "TestPostConstruct [name=" + name +"static:age:"+age+ "]"; } }
Spring配置檔案中配置工具類的bean;
<bean id="testPostConstruct" class="test.TestPostConstruct"> <property name="name">//成員變數 <value>${name}</value> </property> <property name="age">//靜態變數 <value>${age}</value> </property> </bean> <bean id="propertyConfigurer" //讀取配置檔案 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <value>test.properties</value> </property> </bean>
配置檔案test.properties
name=oliver
age=17
測試demo,用Junit測試
public class TestCase { ApplicationContext ctx; @Before public void init(){ ctx = new ClassPathXmlApplicationContext("spring-web.xml"); } @Test public void testPostConstruct(){ System.out.println(TestPostConstruct.getAge()); } }
測試結果
此時b還未被注入:name = null
@PostConstruct將在依賴注入完成後被自動呼叫: name = oliver
age:17
17
2.把註解@Value用在set方法上,注意這裡的set方法沒有static修飾符
package test;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component("testPostConstruct")
public class TestPostConstruct {
@Value("${name}")
private String name;
private static String age;
public TestPostConstruct() {
System.out.println("TestPostConstruct.age = " +age);
System.out.println("此時b還未被注入:name = " + name);
}
@PostConstruct
private void init() {
System.out.println("TestPostConstruct.age = " +age);
System.out.println("@PostConstruct將在依賴注入完成後被自動呼叫: name = " +name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static String getAge() {
System.out.println("age:"+TestPostConstruct.age);
return age;
}
@Value("${age}")
public void setAge(String age) {
TestPostConstruct.age = age;
}
@Override
public String toString() {
return "TestPostConstruct [ name=" + name +"static:age:"+age+ "]";
}
}
測試類同第一種一樣
測試結果如下
TestPostConstruct.age = null
此時b還未被注入:name = null
TestPostConstruct.age = 17
@PostConstruct將在依賴注入完成後被自動呼叫: name = oliver
age:17
17
正常框架是可以實現的,可惜的是公司框架不知道做了什麼操作兩種方式都無法實現,好氣。。。
如有遇到相似的問題,有更好的方式解決,希望給予交流