關(guān)于@Value注解失效的原因分析
@Value注解失效的原因分析
@Value的注意事項(xiàng)
- 1.不能作用于靜態(tài)變量(static);
- 2.不能作用于常量(final);
- 3.不能在非注冊(cè)的類中使用(類需要被注冊(cè)在spring上下文中,如用@Service,@RestController,@Component等);
- 4.使用這個(gè)類時(shí),只能通過依賴注入的方式,用new的方式是不會(huì)自動(dòng)注入這些配置的。
錯(cuò)誤的方式
/** * 抽象工廠+反射 */ //不能在非注冊(cè)的類中使用(類需要被注冊(cè)在spring上下文中,如用@Service,@RestController,@Component等); public class SimpleAbstractFactory { @Value("${packName}") //不能作用于靜態(tài)變量(static) private static String packName; @Value("${sqlName}") //不能作用于常量(final); private final String sqlName; public IUser CreateUser() throws Exception{ String className=packName+"."+sqlName+"IUser"; return (IUser)Class.forName(className).newInstance(); } public IDepartment CreateDepartment() throws Exception{ String className=packName+"."+sqlName+"IDepartment"; return (IDepartment)Class.forName(className).newInstance(); } }
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:spring-config.xml"}) public class MainToken{ @Test public void testToken() { try{ //使用這個(gè)類時(shí),只能通過依賴注入的方式,用new的方式是不會(huì)自動(dòng)注入這些配置的。 SimpleAbstractFactory simpleAbstractFactory=new SimpleAbstractFactory(); User user=new User(); Department department=new Department(); IDepartment idp=simpleAbstractFactory.CreateDepartment(); IUser ius=simpleAbstractFactory.CreateUser(); idp.insert(department); idp.getDepartment(Long.valueOf(1)); ius.insert(user); ius.getUser(Long.valueOf(1)); }catch(Exception e){ } } }
正確的方式
/** * 抽象工廠+反射 */ @Service public class SimpleAbstractFactory { @Value("${packName}") private String packName; @Value("${sqlName}") private String sqlName; public IUser CreateUser() throws Exception{ String className=packName+"."+sqlName+"IUser"; return (IUser)Class.forName(className).newInstance(); } public IDepartment CreateDepartment() throws Exception{ String className=packName+"."+sqlName+"IDepartment"; return (IDepartment)Class.forName(className).newInstance(); } }
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:spring-config.xml"}) public class MainToken { @Autowired //使用這個(gè)類時(shí),只能通過依賴注入的方式,用new的方式是不會(huì)自動(dòng)注入這些配置的。 private SimpleAbstractFactory simpleAbstractFactory; @Test public void testToken() { try{ User user=new User(); Department department=new Department(); IDepartment idp=simpleAbstractFactory.CreateDepartment(); IUser ius=simpleAbstractFactory.CreateUser(); idp.insert(department); idp.getDepartment(Long.valueOf(1)); ius.insert(user); ius.getUser(Long.valueOf(1)); }catch(Exception e){ } } }
@Value注解失效,HandlerInterceptor讀取為null
問題
在springboot項(xiàng)目中@Value沒有讀取到y(tǒng)aml文件中的變量
原因
spring boot的攔截器/過濾器中要讀取配置文件時(shí),@Value為null,@Resource 的注入也是null,原因是因?yàn)榧虞d順序的問題 listener->filter->servlet,所以過濾器/攔截器在初始化的時(shí)候,值和類還沒加載
解決方案
在你的HandlerInterceptor的實(shí)現(xiàn)類中,手動(dòng)獲取容器的變量
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { ? ? // 從這里開始,先獲取容器 ? ? ServletContext context = request.getServletContext(); ? ? WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context); ? ? // 再讀取配置文件中的變量 ? ? Environment environment = ctx.getBean(Environment.class); ? ? String verify = environment.getProperty("你在yaml文件中的變量");
這樣就能拿到變量,效果等同于
// ? ?@Value("${XXX.verify}") // ? ?public ?String verify;
注意:
@Value失效場(chǎng)景:
- 路徑拼寫錯(cuò)誤
- 類的加載順序
- SpringMVC的父子容器,mvc容器無法讀取spring容器
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解如何用spring Restdocs創(chuàng)建API文檔
這篇文章將帶你了解如何用spring官方推薦的restdoc去生成api文檔。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05java基于遞歸算法實(shí)現(xiàn)漢諾塔問題實(shí)例
這篇文章主要介紹了java基于遞歸算法實(shí)現(xiàn)漢諾塔問題,結(jié)合具體實(shí)例形式分析了java遞歸算法的實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2017-07-07java使用ffmpeg命令來實(shí)現(xiàn)視頻編碼轉(zhuǎn)換的示例
本文主要介紹了java使用ffmpeg命令來實(shí)現(xiàn)視頻編碼轉(zhuǎn)換的示例,可以通過調(diào)用系統(tǒng)命令來執(zhí)行FFmpeg命令,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07Java foreach循環(huán)是否可以修改數(shù)據(jù)的值問題解決方法
最近在做項(xiàng)目的時(shí)候,需要修改一個(gè)數(shù)組里面各個(gè)元素的值,foreach循環(huán)迭代數(shù)組元素時(shí),不能改變數(shù)組元素的值,這篇文章給大家介紹Java foreach循環(huán)是否可以修改數(shù)據(jù)的值的問題及解決方法,感興趣的朋友一起看看吧2024-02-02BeanUtils.copyProperties()所有的空值不復(fù)制問題
這篇文章主要介紹了BeanUtils.copyProperties()所有的空值不復(fù)制問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06關(guān)于ArrayList的動(dòng)態(tài)擴(kuò)容機(jī)制解讀
這篇文章主要介紹了關(guān)于ArrayList的動(dòng)態(tài)擴(kuò)容機(jī)制解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10