今天在使用@Value注解的時候遇到其不起作用的現象,先把場景說明一下:現在有A類和B類,而A類對象是通過new操作生成的臨時對象,而B類對象是在A類中使用的;調試步驟如下:
(1)將B類的屬性字段都設置為static類型,並且在字段上面添加@Value注解,B類中的方法都是static類型,此時在A類中使用B類方法時通過靜態調用即可;經過調試發現,B類中的所有的靜態字段都是null,也就是說@Value注解返回的是null值,並沒有從配置application.properties文件中獲取到有效值。因此,這種應用方式不對。
(2)將B類的屬性字段依舊都是static類型,並且都添加Get\Set方法,這些方法都是static類型,同時在Set方法上添加了@Value注解,此時沒有在字段上面添加@Value注解;經過調試發現,這些屬性字段值依舊都是null,沒有達到預期效果。
(3)在B類定義上面添加@Component注解,將B類的字段和方法都設置為非static類型,在字段定義上面添加@Value注解,在A類中添加@Autowired注解來組裝B類對象,當然在A類定義上面添加了@Component注解;經過調試發現,B類對象的字段值還是null,此方式依舊沒有滿足需求。
(4)假設之前A類是在C類中通過new操作生成的臨時變量,那么現在修改這種生成對象的方式,在C類中采@Autowired注解來生成A類對象,而A類和B類都在定義上面添加了@Component注解,在A類中也是通過@Autowired注解來組裝B類對象, 並且在B類中字段都是通過@Value注解設置的;最終,經過調試發現,B類對象中的字段都有值了,並且都是配置文件中配置好的值;故,該使用策略能夠符合期望要求。
小結:通過上述步驟的測驗,不能在采用new的方式生成對象的類中有效利用注解。