天天看點

使用@Autowired出現Field injection is not recommended

文章目錄

    • 使用@Autowired的時候代碼出現警告:
    • @Autowire注入的對象可能為null

使用@Autowired的時候代碼出現警告:

使用@Autowired出現Field injection is not recommended

原因是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容器。