当前位置: 首页 > 后端技术 > Java

为什么Spring不推荐使用@Autowired注解?

时间:2023-04-01 13:53:37 Java

简介在使用IDEA开发的时候,同组小伙伴喜欢用@Autowired注入,代码警告,看着很不舒服,@Autowired作为Spring的儿子,为什么在IDEA中提示警告:Field不推荐注入在想搞清楚这个问题之前,先了解一下依赖注入的几种方式Spring的三种注入方式attribute(filed)injection这种注入方式是利用bean变量上的注解进行依赖注入。本质上,它是通过反射直接注入到场中的。这是我平时开发中见得最多、最熟悉的方式。@AutowiredUserDaouserDao;复制代码构造函数注入,将所有需要的依赖放在被注解的构造方法的参数中,并完成构造方法中对应变量的初始化。该方法基于构造方法注入。例如:finalUserDaouserDao;@AutowiredpublicUserServiceImpl(UserDaouserDao){this.userDao=userDao;}复制代码集方法注入使用对应变量的setXXX()方法,并在方法上使用注解完成依赖注入。例如:privateUserDaouserDao;@AutowiredpublicvoidsetUserDao(UserDaouserDao){this.userDao=userDao;}重复代码属性注入可能存在的问题Problem基于字段的注入可能会带来一些隐藏的问题。举个例子:@AutowiredprivateUseruser;privateStringcompany;publicUserDaoImpl(){this.company=user.getCompany();}复制代码编译时不会报错,运行后会报NullPointerExceptionInstantiationofbean失败的;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化[...]:构造函数抛出异常;嵌套异常是java.lang.NullPointerException复制代码Java初始化一个类时,遵循静态变量或静态语句块–>实例变量或初始化块–>构造函数–>@Autowired的顺序。所以在执行这个类的构造函数的时候,用户对象还没有注入,它的值还是null。问题2不能有效指定依赖关系。相信很多人都遇到过bug。依赖注入的对象为空。当启动依赖容器时遇到这个问题,是因为配置的依赖注入缺少注解什么的。这种方法对注射容器的依赖性太强。当整个依赖容器没有启动时,类无法运行,反射时无法提供类需要的依赖。Java实训题三依赖注入的核心思想之一就是容器管理的类不应该依赖于容器管理的依赖。依赖项也必须正常运行。但是,使用变量注入并不能保证这一点。Spring建议,由于您可以混合基于构造函数和基于setter的DI,因此使用构造函数作为强制依赖项,使用setter方法或配置方法作为可选依赖项是一个很好的经验法则。翻译是:强制依赖项可以与构造函数一起使用对于可选和可变依赖项,使用setter注入并使用@Resource而不是@Autowired@Resource具有2个属性名称和类型。在spring中,name属性定义为bean的名称,type为bean的类型。如果该属性被@Resource注解,那么它的注入过程就是在指定name和type的情况下从Spring上下文中寻找唯一匹配的bean进行组装,找不到则抛出异常。如果指定了name,会从context中查找与name匹配的bean进行组装,如果没有找到则抛出异常。如果指定了类型,则从上下文中找到唯一与该类型匹配的bean以进行组装。如果没有找到或找到多个bean,将抛出异常。如果既不指定name也不指定type,则默认按照byName进行组装;如果不匹配,则按照byType进行组装。@Autowired只根据类型注入,不匹配名称。如果类型无法区分注入的对象,需要用@Qualifier或@Primary注解进行修饰。使用@RequiredArgsConstructor构造函数注入这种形式是Spring推荐的构造函数注入。该方法是lombok包下的注解。如果使用这种方式,需要在项目中引入lombok,例如:@RequiredArgsConstructorpublicclassUserDaoImpl{privatefinalUseruser;}