關(guān)于@Value注解失效的原因分析
@Value注解失效的原因分析
@Value的注意事項
- 1.不能作用于靜態(tài)變量(static);
- 2.不能作用于常量(final);
- 3.不能在非注冊的類中使用(類需要被注冊在spring上下文中,如用@Service,@RestController,@Component等);
- 4.使用這個類時,只能通過依賴注入的方式,用new的方式是不會自動注入這些配置的。
錯誤的方式
/**
* 抽象工廠+反射
*/
//不能在非注冊的類中使用(類需要被注冊在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{
//使用這個類時,只能通過依賴注入的方式,用new的方式是不會自動注入這些配置的。
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
//使用這個類時,只能通過依賴注入的方式,用new的方式是不會自動注入這些配置的。
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項目中@Value沒有讀取到y(tǒng)aml文件中的變量
原因
spring boot的攔截器/過濾器中要讀取配置文件時,@Value為null,@Resource 的注入也是null,原因是因為加載順序的問題 listener->filter->servlet,所以過濾器/攔截器在初始化的時候,值和類還沒加載
解決方案
在你的HandlerInterceptor的實現(xiàn)類中,手動獲取容器的變量
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失效場景:
- 路徑拼寫錯誤
- 類的加載順序
- SpringMVC的父子容器,mvc容器無法讀取spring容器
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java前后端分離的在線點餐系統(tǒng)實現(xiàn)詳解
這是一個基于SpringBoot+Vue框架開發(fā)的在線點餐系統(tǒng)。首先,這是一個前后端分離的項目。具有一個在線點餐系統(tǒng)該有的所有功能,感興趣的朋友快來看看吧2022-01-01
SpringBoot3.4.0無法找到StringRedisTemplate?bean的問題Consider?def
本文主要介紹了SpringBoot3.4.0無法找到StringRedisTemplate?bean的問題Consider?defining?a?bean?of?type?‘org.springframework,具有一定的參考價值,感興趣的可以了解一下2025-03-03
Java中List集合去除重復數(shù)據(jù)的方法匯總
這篇文章主要給大家介紹了關(guān)于Java中List集合去除重復數(shù)據(jù)的方法,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
關(guān)于IDEA 2020.3 多窗口視圖丟失的問題
這篇文章主要介紹了關(guān)于IDEA 2020.3 多窗口視圖丟失的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
Java的微信開發(fā)中使用XML格式和JSON格式數(shù)據(jù)的示例
這篇文章主要介紹了Java微信開發(fā)中使用XML格式和JSON格式數(shù)據(jù)的示例,注意一下json-lib所需要的jar包,需要的朋友可以參考下2016-02-02

