Spring 中,@Value 注解一般使用在非静态方法上的。如下:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Test {
@Value("${jdbc.driver}")
public String driver;
@Value("${jdbc.url}")
public String url;
}如果将 @Value 注解用于静态方法,以下做法是无效的:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Test {
@Value("${jdbc.driver}")
public static String driver;
@Value("${jdbc.url}")
public static String url;
}如果我们非要使用 @Value 注解将值注入到静态属性呢,可以使用下面方法:
方法一:使用 Spring 的 XML 配置文件,通过 Bean 注入,这里不做多讲解;
方式二:使用 setter 方法注入,如下:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Test {
public static String url = "/dev/xx";
@Value("${jdbc.url}")
public static void setUrl(String url) {
Test.url = url;
}
}方法三:通过中间变量赋值,如下:
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Test {
public static String url = "";
@Value("${jdbc.url}")
public String tempUrl = "";
@PostConstruct
public void init() {
url = tempUrl;
}
}上面实例中,@PostConstruct 和 @PreConstruct 作用如下:
@PostConstruct:被 @PostConstruct 注解修饰的方法会在服务器加载 Servlet 的时候运行,并且只会被服务器调用一次,类似于 Serclet 的 inti() 方法。被 @PostConstruct 修饰的方法会在构造函数之后,init() 方法之前运行。
@PreConstruct:被 @PreConstruct 修饰的方法会在服务器卸载 Servlet 的时候运行,并且只会被服务器调用一次,类似于 Servlet 的 destroy() 方法。被 @PreConstruct 修饰的方法会在 destroy() 方法之后运行,在 Servlet 被彻底卸载之前。