风也温柔

计算机科学知识库

java反射动态注入方法-阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  前言

  本章的内容主要是想探讨我们在进行 开发过程当中java反射动态注入方法,关于依赖注入的几个知识点。感兴趣的读者可以先看一下以下问题:

  如果你对上述问题都了解,那我个人觉得你的开发经验应该是不错的

  下面我们就依次对上述问题进行解答,并且总结知识点。

  @, @, @ 三个注解的区别

   支持使用@, @, @ 三个注解进行依赖注入。下面来介绍一下这三个注解有什么区别。

  @

  @为 框架提供的注解,需要导入包org..beans...。

  这里先给出一个示例代码java反射动态注入方法-阿里码农用5年经验告诉你,Spring为什么建议构造器注入?,方便讲解说明:

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  测试类:

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  @

  在 的环境下,@和@ 是相同的,因为它们的依赖注入都是使用来处理的。

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  @是 JSR-330 定义的规范,如果使用这种方式,切换到Guice也是可以的。

  Guice 是 开源的轻量级 DI 框架

  如果硬要说两个的区别,首先@是Java EE包里的,在SE环境需要单独引入。另一个区别在于@可以设置=false而@并没有这个属性。

  @

  java反射中的方法调用_java反射动态注入方法_java 反射获取set方法

  @是JSR-250定义的注解。 在 实现了对JSR-250的注解的处理,其中就包括@。

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  @有两个重要的属性:name和type,而 将@注解的name属性解析为bean的名字,而type属性则解析为bean的类型。

  装配顺序:

  如果同时指定了name和type,则从上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。如果既没有指定name,又没有指定type,则默认按照方式进行装配;如果没有匹配,按照进行装配。IDEA 提示 Field is not

  在使用IDEA 进行 开发的时候,当你在字段上面使用@注解的时候,你会发现IDEA 会有警告提示:

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  翻译过来就是这个意思:

  不建议使用基于 field 的注入方式。

  java反射中的方法调用_java反射动态注入方法_java 反射获取set方法

   开发团队建议:在你的 Bean 永远使用基于 的方式进行依赖注入。对于必须的依赖java反射动态注入方法,永远使用断言来确认。

  比如如下代码:

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  将光标放到@处,使用Alt + Enter 快捷进行修改之后,代码就会变成基于的注入方式,修改之后:

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  如果按照 团队的建议,如果svc是必须的依赖,应该使用.(svc, "svc must not be null")来确认。

  修正这个警告提示固然简单,但是我觉得更重要是去理解为什么 团队会提出这样的建议?直接使用这种基于 field 的注入方式有什么问题?

  首先我们需要知道, 中有这么3种依赖注入的方式:

  1. 基于 field 注入

  所谓基于 field 注入,就是在bean的变量上使用注解进行依赖注入。本质上是通过反射的方式直接注入到field。这是我平常开发中看得最多也是最熟悉的一种方式,同时,也正是 团队所不推荐的方式。比如:

  java反射动态注入方法_java 反射获取set方法_java反射中的方法调用

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  3. 基于 注入

  将各个必需的依赖全部放在带有注解构造方法的参数中,并在构造方法中完成对应变量的初始化,这种方式,就是基于构造方法的注入。比如:

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  在 4.3 及以后的版本中,如果这个类只有一个构造方法,那么这个构造方法上面也可以不写 @ 注解。

  基于 field 注入的好处

  正如你所见,这种方式非常的简洁,代码看起来很简单,通俗易懂。你的类可以专注于业务而不被依赖注入所污染。你只需要把@扔到变量之上就好了,不需要特殊的构造器或者set方法,依赖注入容器会提供你所需的依赖。

  基于 field 注入的坏处

  成也萧何败也萧何

  基于 field 注入虽然简单,但是却会引发很多的问题。

  java反射动态注入方法_java反射中的方法调用_java 反射获取set方法

  不能使用属性注入的方式构建不可变对象(final 修饰的变量) 开发团队的建议

  Since you can mix -based and -based DI, it is a good rule of thumb to use for and or for .

  简单来说,就是

  让我们看看 这样推荐的理由,首先是基于构造方法注入,

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

   团队提倡使用基于构造方法的注入,因为这样一方面可以将依赖注入到一个不可变的变量中 (注:final 修饰的变量),另一方面也可以保证这些变量的值不会是 null。此外,经过构造方法完成依赖注入的组件 (注:比如各个 ),在被调用时可以保证它们都完全准备好了。与此同时,从代码质量的角度来看,一个巨大的构造方法通常代表着出现了代码异味,这个类可能承担了过多的责任。

  而对于基于 的注入,他们是这么说的:

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  基于 的注入,则只应该被用于注入非必需的依赖,同时在类中应该对这个依赖提供一个合理的默认值。如果使用 注入必需的依赖,那么将会有过多的 null 检查充斥在代码中。使用 注入的一个优点是,这个依赖可以很方便地被改变或者重新注入。

  总结:以上就是本文的所有内容,希望阅读本文之后能让你对 的依赖注入有更深的理解。

  阿里码农用5年经验告诉你,Spring为什么建议构造器注入?

  如何获取?

  转发分享此文,后台私信小编:“ 666 ”即可获取。(注:转发分享,感谢大家)

  文章来源:http://www.toutiao.com/a6981354979894477345/