使用@Autowired的时候代码出现警告:
原因是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。
Springboot中new出来的实例中含有@Autowired注入时的Spring Bean为NULL
ps:Mapper不用注解 @Component 也能生效,spring会把@MapperSacn 配置的包全部扫描进去;@EnableFeignClients通过扫描路径的方式将@FeignClient注解的接口都注入IOC容器。