文章目錄
-
- 使用@Autowired的時候代碼出現警告:
- @Autowire注入的對象可能為null
使用@Autowired的時候代碼出現警告:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90TUOhXQq1Uc4d0Y1Q2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLlljZyAzYwUGZidDZlRGZ5gjNwQTM2QmZmJWYxAjZlBzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
原因是Spring不推薦使用基于字段的依賴注入
可以改成基于構造函數的依賴注入,idea能夠自動生成,注入的類多的話會導緻構造函數的參數過多(是一個信号,表明依賴項過多)
也可以使用@Resource,隻是沒有警告
區分一下@Autowired和@Resource兩個注解的差別:
(1)、@Autowired預設按照byType方式進行bean比對,@Resource預設按照byName方式進行bean比對
(2)、@Autowired是Spring的注解,@Resource是J2EE的注解
Field injection is not recommended(Spring IOC不再推薦使用屬性注入)
使用@Autowired注解警告Field injection is not recommended
@Autowired 注解提示Field injection 警告
@Autowire注入的對象可能為null
示例:
@Component
@Transactional
public class XXService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private XXDao xxDao;
public void add(XX xxl) {
logger.debug("進入XXService.add(XX xx)方法");
xxDao.save(xx); //此處報空指針,原因是xxDao為null
}
溯源:
@RestController
@RequestMapping(value = "/xxx/xx")
public class XXController {
Logger logger = LoggerFactory.getLogger(getClass());
/*
此處通過new來獲得執行個體導緻service注入的dao為null;
必須在所有使用了dao的地方,包括調用它的servcie都要進行@Autowired注入,否則之後的注入就會失敗
*/
private XXService xxService = new XXService();
.....
}
原因:
@Autowired注入時是将類交給Springboot管理,而new出來的執行個體脫離了Springboot的管理,兩個東西不在一個管理者管理下,是以沒法聯系在一起,@Autowired注入就會為null。
@Autowire注入的對象為null
Springboot中new出來的執行個體中含有@Autowired注入時的Spring Bean為NULL
ps:Mapper不用注解 @Component 也能生效,spring會把@MapperSacn 配置的包全部掃描進去;@EnableFeignClients通過掃描路徑的方式将@FeignClient注解的接口都注入IOC容器。