1. 程式人生 > >Spring框架給類的靜態變數初始化

Spring框架給類的靜態變數初始化

工作中遇到一個問題給工具類靜態變數初始化,就記錄了一下。

這裡需要注意一下不可以直接使用@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

正常框架是可以實現的,可惜的是公司框架不知道做了什麼操作兩種方式都無法實現,好氣。。。

如有遇到相似的問題,有更好的方式解決,希望給予交流