工作中遇到一个问题给工具类静态变量初始化,就记录了一下。
这里需要注意一下不可以直接使用@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
正常框架是可以实现的,可惜的是公司框架不知道做了什么操作两种方式都无法实现,好气。。。
如有遇到相似的问题,有更好的方式解决,希望给予交流