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 被彻底卸载之前。