如何消除IntelliJ IDEA中@Autowired注入的警告提示?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1019个文字,预计阅读时间需要5分钟。
问题:在Service层注入Mybatis的Mapper时,我们通常会用@Autowired自动注入,如下所示:java@Autowiredprivate ProductMapper productMapper;但是,在IntelliJ IDEA中,这样写会显示红色警告,提示不能自动注入。这是为什么?
分析:当在IDEA中遇到这样的红色警告时,通常是因为IDEA无法识别到相应的Mapper接口或其对应的XML文件。以下是一些可能的原因和解决方法:
1. Mapper接口未在项目中找到: 确保Mapper接口在项目中存在,并且与XML文件位于同一目录下。
2. Mapper接口未正确注解: 确保Mapper接口上使用了`@Mapper`注解。 java @Mapper public interface ProductMapper { // ... }
3. XML文件配置错误: 检查Mapper的XML文件是否正确配置了namespace和接口方法。
4. 依赖未正确配置: 确保项目中包含了Mybatis和Mybatis-Spring的依赖。
5. IDEA配置问题: - 检查IDEA的Project Structure设置,确保源代码目录和资源目录配置正确。 - 清理并重新构建项目。
解决步骤:
1.检查Mapper接口和XML文件是否正确配置。
2.确保项目中包含了必要的依赖。
3.清理IDEA缓存并重新构建项目。
4.如果问题依旧,尝试重启IDEA。
问题
在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个问题:
- 当注入的对象依赖其他对象,而被依赖的对象没被创建的话就会出现空指针异常。
- 这样的类没办法在容器之外被重用,也不能期望反射提供其所需的依赖。
详细原因大家可以去这篇文章查看: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刚好可以完成这件事,而且还简化了你的代码,何乐而不为是不是?
到此这篇关于Intellij IDEA如何去掉@Autowired 注入警告的方法的文章就介绍到这了,更多相关IDEA去掉@Autowired 注入警告内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!
本文共计1019个文字,预计阅读时间需要5分钟。
问题:在Service层注入Mybatis的Mapper时,我们通常会用@Autowired自动注入,如下所示:java@Autowiredprivate ProductMapper productMapper;但是,在IntelliJ IDEA中,这样写会显示红色警告,提示不能自动注入。这是为什么?
分析:当在IDEA中遇到这样的红色警告时,通常是因为IDEA无法识别到相应的Mapper接口或其对应的XML文件。以下是一些可能的原因和解决方法:
1. Mapper接口未在项目中找到: 确保Mapper接口在项目中存在,并且与XML文件位于同一目录下。
2. Mapper接口未正确注解: 确保Mapper接口上使用了`@Mapper`注解。 java @Mapper public interface ProductMapper { // ... }
3. XML文件配置错误: 检查Mapper的XML文件是否正确配置了namespace和接口方法。
4. 依赖未正确配置: 确保项目中包含了Mybatis和Mybatis-Spring的依赖。
5. IDEA配置问题: - 检查IDEA的Project Structure设置,确保源代码目录和资源目录配置正确。 - 清理并重新构建项目。
解决步骤:
1.检查Mapper接口和XML文件是否正确配置。
2.确保项目中包含了必要的依赖。
3.清理IDEA缓存并重新构建项目。
4.如果问题依旧,尝试重启IDEA。
问题
在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个问题:
- 当注入的对象依赖其他对象,而被依赖的对象没被创建的话就会出现空指针异常。
- 这样的类没办法在容器之外被重用,也不能期望反射提供其所需的依赖。
详细原因大家可以去这篇文章查看: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刚好可以完成这件事,而且还简化了你的代码,何乐而不为是不是?
到此这篇关于Intellij IDEA如何去掉@Autowired 注入警告的方法的文章就介绍到这了,更多相关IDEA去掉@Autowired 注入警告内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

