idea中@Autowired注解下变量报红的解决

目录
  • idea中@Autowired注解下变量报红
    • 问题
    • 解决方法
  • 注解@Autowired--警告(亲测可用)
    • 变量(filed)注入
    • 构造器注入
    • set方法注入
    • 小结下

idea中@Autowired注解下变量报红

问题

idea中@Autowired注解下变量报红

这个不是错误,只是一个警告而已,其实不解决也是可以启动项目的

解决方法

1、修改设置

file–>settings–>Inspections–>spring Core–>Code–>Autowiring for Bean Class

2、修改注解@Autowired为注解@Resource

3、注解@Autowired的属性required = false

4、对应的dao层代码添加注解@Repository(“UserDao”)

注解@Autowired--警告(亲测可用)

@Autowired
UserDao userDao;

警告内容是

Field injection is not recommended

意思就是使用变量依赖注入的方式是不被推荐的。

使用idea解决策略是这样的:

Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies

意思就是总是使用构造器的方式强制注入。

依赖注入有三种方式:

  • 变量(filed)注入
  • 构造器注入
  • set方法注入

先各自看一下实现方式

变量(filed)注入

@Autowired
UserDao userDao;

构造器注入

final
UserDao userDao;
@Autowired
public UserServiceImpl(UserDao userDao) {
    this.userDao = userDao;
}

set方法注入

private UserDao userDao;
@Autowired
public void setUserDao (UserDao userDao) {
    this.userDao = userDao;
}

(我遇到该错误使用了第三种方法)

相比较而言:

优点:变量方式注入非常简洁,没有任何多余代码,非常有效的提高了java的简洁性。即使再多几个依赖一样能解决掉这个问题。

缺点:不能有效的指明依赖。相信很多人都遇见过一个bug,依赖注入的对象为null,在启动依赖容器时遇到这个问题都是配置的依赖注入少了一个注解什么的,然而这种方式就过于依赖注入容器了,当没有启动整个依赖容器时,这个类就不能运转,在反射时无法提供这个类需要的依赖。

在使用set方式时,这是一种选择注入,可有可无,即使没有注入这个依赖,那么也不会影响整个类的运行。

在使用构造器方式时已经显式注明必须强制注入。通过强制指明依赖注入来保证这个类的运行。

另一个方面:

依赖注入的核心思想之一就是被容器管理的类不应该依赖被容器管理的依赖,换成白话来说就是如果这个类使用了依赖注入的类,那么这个类摆脱了这几个依赖必须也能正常运行。然而使用变量注入的方式是不能保证这点的。

既然使用了依赖注入方式,那么就表明这个类不再对这些依赖负责,这些都由容器管理,那么如何清楚的知道这个类需要哪些依赖呢?它就要使用set方法方式注入或者构造器注入。

小结下

变量方式注入应该尽量避免,使用set方式注入或者构造器注入,这两种方式的选择就要看这个类是强制依赖的话就用构造器方式,选择依赖的话就用set方法注入。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们.

(0)

相关推荐

  • Intellij IDEA如何去掉@Autowired 注入警告的方法

    问题 在Service层注入Mybatis的Mapper我们通常会使用@Autowired 自动注入 @Autowired private ProductMapper productMapper; 但是这样Intellij IDEA会显示红色告警,提示不能自动注入. 当我们在Controller层注入Service时我们也经常直接在Filed上使用@Autowired 注解,这时候不显示红色警告,但是也显示Field injection is not recommended 的建议 原因 第一种

  • 快速解决idea @Autowired报红线问题

    1.点击右下角的小老头 2.点击Configure inspections 3.输入spring找到 spring core中的Autowiring for bean class,选择Severity中的Error改为Warning. 补充:idea解决@Autowired注解警告提示和注入类红色下划线报错问题 前言: 当使用@Autowired注解进行对象的注入时候,会出现对象显示红色错误波浪线和@Autowired出现黄色警告,是因为idea会帮忙检查bean对象的注入,虽然报错,但不影响我

  • 解决IDEA中Maven依赖包导入失败报红问题(总结最有效8种解决方案)

    问题描述: 真的,说来话长,这应该是我花最多时间去解决关于Maven依赖包导入的问题,以前粘贴复制导入,自动下载成功了, 这次怎么搞,怎么让他自动下载都还是红红的一片, 花了大半天,各种尝试,只为搏得问题解决!!! 真的看着都难受, 但是, 终于, 还是让我搞定了,这次让我汇总所有最有可能解决这依赖问题的方法,下次遇到这种问题, 真的要说再见了 , 话不多开,开货!!!方案1:(本人平时遇到这问题的常规操作) 当一开始遇到导入的依赖报红了,直接把那段刚导入的对应依赖删了,然后又重新导入,它自动会

  • idea中@Autowired注解下变量报红的解决

    目录 idea中@Autowired注解下变量报红 问题 解决方法 注解@Autowired--警告(亲测可用) 变量(filed)注入 构造器注入 set方法注入 小结下 idea中@Autowired注解下变量报红 问题 idea中@Autowired注解下变量报红 这个不是错误,只是一个警告而已,其实不解决也是可以启动项目的 解决方法 1.修改设置 file–>settings–>Inspections–>spring Core–>Code–>Autowiring fo

  • 基于@Table注解无法使用及报红的解决

    目录 @Table注解无法使用及报红 @Table注解详解 spring @Table注解作用是 常用的两个属性 @Table注解无法使用及报红 在新建实体类时想直接序列化,遇到注解不起作用的问题,后来发现是少了一个依赖,真是无语. @Table(name = "tb_user") public class User implements Serializable {     private static final long serialVersionUID=1L;     @Id

  • pycharm中下载的包但是import还是无法使用/报红的解决方法

    目录 一.查看当前使用的虚拟环境是否是自己想要使用的解释器 二.在文件(file)-设置(settings)中查看项目解释器中是否有自己需要的包 三.pycham中显示有包,但是import导包还是报红 总结 查看自己的虚拟环境是否使用正确 一.查看当前使用的虚拟环境是否是自己想要使用的解释器 查看解释器所在目录是否为想要使用的虚拟环境所在目录 二.在文件(file)-设置(settings)中查看项目解释器中是否有自己需要的包 三.pycham中显示有包,但是import导包还是报红 报错原因

  • Typescript中使用引用路径别名报错的解决方法

    在TS中引用路径别名提示找不到模块或者相应的声明 1.ts中使用路径别名报错 在react中通常路径别名都是在webpack的webpack.config.js文件中配置的,但是在引入了ts之后,webpack中的路径别名引用失效了此时我们需要在跟src文件同级目录的tsconfig.json文件中添加配置: 注意要在compilerOptions中添加(webpack中的路径也需要配置) "compilerOptions": { "target": "e

  • spring中使用@Autowired注解无法注入的情况及解决

    目录 spring @Autowired注解无法注入 问题简述 原因:(此处只说第二种) 解决方案 @Autowired注解注入失败,提示could not autowire spring @Autowired注解无法注入 问题简述 在使用spring框架的过程中,常会遇到这种两情况: 1.在扫描的包以外使用需要使用mapper 2.同目录下两个controller或者两个service,在使用@Autowired注解注入mapper或者service时,其中一个可以注入,另一个却为空. 原因:

  • SpringBoot遇到的坑@Qualifier报红的解决

    目录 SpringBoot遇到的坑@Qualifier报红 解决方法 SpringBoot注解@Qualifier用法 SpringBoot遇到的坑@Qualifier报红 今天写项目的时候@Qualifier一直报红,排查半天后面才知道原来是idea生成项目的时候把主配置的类放在一个包中导致默认包结构扫描发生改变,扫描不到你定义的组件,具体可以去看看SpirngBoot默认包结构规则. 解决方法 主配置类必须放在是你所扫描的包的父包上 SpringBoot注解@Qualifier用法 在Con

  • asp.net中eval不能定义变量的问题的解决方法

    复制代码 代码如下: eval.asp <%@ LANGUAGE='JAVASCRIPT'%> <script Language="javascript" runat=server> eval("var f1=1,f2=2,f3=3;"); Response.Write(f1+"<br/>"); Response.Write(f2+"<br/>"); Response.Write

  • vue.js 中使用(...)运算符报错的解决方法

    今天在起别人项目的时候, 发现报错. 这个错误是,项目中不识别es6的扩展运算符, 解决方式很简单. // 第一步 cnpm install babel-plugin-transform-object-rest-spread // 第二步 看一下你的 .babelrc 里面是否有识别es6语法的配置 { "presets": [ ["env", { "modules": false, "targets": { "br

  • 详解docker中使用systemctl启动服务报错的解决办法

    docker版本: [root@localhost gae_proxy]# docker version Client: Version: 1.10.3 API version: 1.22 Package version: docker-common-1.10.3-46.el7.centos.10.x86_64 Go version: go1.6.3 Git commit: d381c64-unsupported Built: Thu Aug 4 13:21:17 2016 OS/Arch: l

  • MySQL中Multiple primary key defined报错的解决办法

    创建主键可以有两种方式: create table 表名( 字段名 类型, 字段名 类型, -- primary key(name) ); 或者是 create table 表名( 字段名 类型 primary key, 字段名 类型, -- ); 但是要注意的是,想要创建复合主键,就不可以用第二种方式. 下面列举一个小例子: 这里报错Multiple primary key defined,表示定义了多个主键,正确的写法是如下: 如果项设置复合主键,复合主键的特点是同时创建.同时删除,所以需要

随机推荐