亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

關于@Value注解失效的原因分析

 更新時間:2023年09月21日 15:12:55   作者:阿爾法小師妹  
這篇文章主要介紹了關于@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的實現類中,手動獲取容器的變量

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容器

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 詳解如何用spring Restdocs創(chuàng)建API文檔

    詳解如何用spring Restdocs創(chuàng)建API文檔

    這篇文章將帶你了解如何用spring官方推薦的restdoc去生成api文檔。具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • java基于遞歸算法實現漢諾塔問題實例

    java基于遞歸算法實現漢諾塔問題實例

    這篇文章主要介紹了java基于遞歸算法實現漢諾塔問題,結合具體實例形式分析了java遞歸算法的實現與使用技巧,需要的朋友可以參考下
    2017-07-07
  • java使用ffmpeg命令來實現視頻編碼轉換的示例

    java使用ffmpeg命令來實現視頻編碼轉換的示例

    本文主要介紹了java使用ffmpeg命令來實現視頻編碼轉換的示例,可以通過調用系統(tǒng)命令來執(zhí)行FFmpeg命令,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • spring boot 結合jsp案例詳解

    spring boot 結合jsp案例詳解

    這篇文章主要介紹了spring boot 結合jsp案例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Java foreach循環(huán)是否可以修改數據的值問題解決方法

    Java foreach循環(huán)是否可以修改數據的值問題解決方法

    最近在做項目的時候,需要修改一個數組里面各個元素的值,foreach循環(huán)迭代數組元素時,不能改變數組元素的值,這篇文章給大家介紹Java foreach循環(huán)是否可以修改數據的值的問題及解決方法,感興趣的朋友一起看看吧
    2024-02-02
  • BeanUtils.copyProperties()所有的空值不復制問題

    BeanUtils.copyProperties()所有的空值不復制問題

    這篇文章主要介紹了BeanUtils.copyProperties()所有的空值不復制問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Tomcat處理請求的線程模型詳解

    Tomcat處理請求的線程模型詳解

    這篇文章主要為大家詳細介紹了Tomcat處理請求的線程模型,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • java 代碼塊與靜態(tài)代碼塊加載順序

    java 代碼塊與靜態(tài)代碼塊加載順序

    這篇文章主要介紹了java 代碼塊與靜態(tài)代碼塊加載順序的相關資料,需要的朋友可以參考下
    2017-07-07
  • Cookie 實現的原理

    Cookie 實現的原理

    我們在瀏覽器中,經常涉及到數據的交換,比如你登錄郵箱,登錄一個頁面。我們經常會在此時設置30天內記住我,或者自動登錄選項。那么它們是怎么記錄信息的呢,答案就是今天的主角cookie了
    2021-06-06
  • 關于ArrayList的動態(tài)擴容機制解讀

    關于ArrayList的動態(tài)擴容機制解讀

    這篇文章主要介紹了關于ArrayList的動態(tài)擴容機制解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論