zoukankan      html  css  js  c++  java
  • Intellij IDEA 如何去掉 @Autowired 注入警告

    问题

    在Service层注入Mybatis的Mapper我们通常会使用@Autowired 自动注入

    @Autowired
    private ProductMapper productMapper;
    

    但是这样Intellij IDEA会显示红色告警,提示不能自动注入。

    当我们在Controller层注入Service时我们也经常直接在Filed上使用@Autowired 注解,这时候不显示红色警告,但是也显示Field injection is not recommended 的建议

    原因

    第一种情况是因为IDEA可以识别并理解Spring的上下文。然而Mapper接口是Mybatis的,IDEA理解不了。所以会出现红色告警。

    而第二种原因是因为官方不推荐使用Filed进行注解,而推荐使用构造器或Setter方法进行注解,像下面两种写法就不会出现警告。

    private final ProductService productService;
    @Autowired
    public ProductController(ProductService productService) {
    	this.productService = productService;
    }
    

    or

    private ProductService productService;
    @Autowired
    public void setProductService(ProductService productService) {
    	this.productService = productService;
    }
    

    问题是什么

    Field注入看起来非常好,够简洁,代码通俗易懂。你的类可以专注于业务而不被依赖注入所污染。你只需要把@Autowired扔到变量之上就好了,不需要特殊的构造器或者set方法,依赖注入容器会提供你所需的依赖。但是Field注入会带来2个问题:

    • 当注入的对象依赖其他对象,而被依赖的对象没被创建的话就会出现空指针异常。

    • 这样的类没办法在容器之外被重用,也不能期望反射提供其所需的依赖。

    详细原因大家可以去这篇文章查看:http://olivergierke.de/2013/11/why-field-injection-is-evil/

    构造器注入 VS Setter注入

    Setter应该被用来注入可变的依赖。当没有提供依赖时,这个类也应该能够运转。当实例化对象后,这些依赖也能随时改变。其实也视情况而变,有时,一个不变的对象是理想状态。有时,最好是能在运行期间改变对象的属性。

    构造器注入对象需要依赖的对象初始化后才能正常运转,通过构造器提供这些依赖就能保证对象初始化后就能被使用。使用构造器注入的一个可能的影响就是循环依赖。

    怎么解决

    我们可以使用Lombok提供的注解 @RequiredArgsConstructor 来解决这两个问题(Lombok这个大家项目都会使用吧)

    @Service
    @Log4j2
    @RequiredArgsConstructor(onConstructor = @__(@Autowired))
    public class ProductServiceImpl implements ProductService {
        private final ProductMapper productMapper;
    	...
    }
    

    这里必须使用final修饰符来修饰注入的Service或Mapper首先我们看看编译后的类是什么样

    编译完成后变成了使用构造器进行注入

    认识@RequiredArgsConstructor

    Lombok官方给出的解释是: Generates constructor that takes one argument per final / non-null field. 所以它会为final和nonnull的属性作为参数产生一个构造函数。

    而上面我们讲了Spring推荐使用Setter或构造器注入,那么@RequiredArgsConstructor刚好可以完成这件事,而且还简化了你的代码,何乐而不为是不是?

    好了,各位朋友们,本期的内容到此就全部结束啦,能看到这里的同学都是优秀的同学,下一个升职加薪的就是你了!
    如果觉得这篇文章对你有所帮助的话请扫描下面二维码加个关注。"转发" 加 "在看",养成好习惯!咱们下期再见!

    热文推荐

    ☞ 数据库优化之SQL优化
    ☞ 数据库优化之实例优化
    ☞ Docker基础与实战,看这一篇就够了!
    ☞ Docker-Compose基础与实战,看这一篇就够了!
    ☞ OAuth2.0最简向导(多图预警)
    ☞ 构建三维一体立体化监控体系
    ☞ SpringCloud实战系列

  • 相关阅读:
    Gitlab forbidden
    oracle查询directory_path
    oracle_backup
    oracle
    客户端读取图片文件
    Sql游标的使用
    Sql解锁 数据库死锁检测
    css3d总结
    Redis在Linux系统下的安装和启动
    Linux系统基本操作命令
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13295890.html
Copyright © 2011-2022 走看看