iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >浅谈spring DI 依赖注入方式和区别
  • 866
分享到

浅谈spring DI 依赖注入方式和区别

2024-04-02 19:04:59 866人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录spring DI 3种DI注解的区别 1 @Autowired 2 @Inject 3 @Resource 3种注入方式的区别 1 field注入 2 构造器注入 3 sett

spring DI

Spring框架对Java开发的重要性不言而喻,其核心特性就是ioc(Inversion of Control, 控制反转)和aop,平时使用最多的就是其中的IOC,我们通过将组件交由Spring的IOC容器管理,将对象的依赖关系由Spring控制,避免硬编码所造成的过度程序耦合。

3种DI注解的区别

1 @Autowired

使用特点

  • Autowired注解是spring框架提供的
  • Autowired注解优先byType获取java bean,其次byName
  • Autowired注解配合Qualifier注解区分java bean的名称,主要用于同一个类型的javabean有多个实
  • Autowired注解注入的对象,一般要求非null,如果允许为null,需要required=false属性声明
  • @Autowired可以作用在变量、setter方法、构造函数上

使用过程

a、 将@autowored写在被注入的成员变量上,就不用再xml文件中配置了,在程序中去掉相应的setter和getter方法,

b、 还可以写在构造方法上、setter方法上

c、@Qualifier
@Qualifier("XXX") 中的 XX是 Bean 的名称,所以 @Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变成 byName 了。
不过需要注意的是@Autowired 可以对成员变量、方法以及构造函数进行注释,而 @Qualifier 的标注对象是成员变量、方法入参、构造函数入参。

2 @Inject

使用特点

  • @Inject是jsR330 (Dependency Injection for Java)中的规范,需要导入javax.inject.Inject; 实现注入
  • @Inject是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Named
  • @Inject可以作用在变量、setter方法、构造函数上
  • 与@Autowired使用类似,想比之下,采用spring提供的@Autowired更为普遍

使用过程
a、 将@Inject可以作用在变量、setter方法、构造函数上,和@Autowired一样

b、@Named
@Named("XXX") 中的 XX是 Bean 的名称,所以 @Inject和 @Named结合使用时,自动注入的策略就从 byType 转变成 byName 了。

3 @Resource

使用特点

  • esource注解是jdk提供的,属于j2ee规范
  • Resource注解优先byname获取java bean,其次byType
  • Resource注解的属性名称作为java bean的名称进行查找,如果有name参数,则使用name参数查找java bean
  • Resource注解如果声明了name属性,则必须按照name查找对象,不会再使用类型查找
  • @Resource可以作用在变量、setter方法上

使用过程
a、@Resource实例

3种注入方式的区别

注意项

  • 注入方式:field注入、setter注入与构造器注入
  • spring推荐使用setter方法和构造器注入Autowired的bean对象,因此idea工具中私有属性使用Autowired注入会提示警告。setter方法和构造器注入的方式,可以让对象不依赖于spring而独立使用,更加灵活;私有属性则只能通过spring上下文自动注入,一旦注入失败,没有重新注入的方式。
  • @Resource不能用于构造器注入

1 field注入


@Controller
public class FooController {
  @Autowired
  //@Inject
  private FooService fooService;
  
  //简单的使用例子,下同
  public List<Foo> listFoo() {
      return fooService.list();
  }
}

这种注入方式应该是最常见的注入方式。原因很简单:

  • 注入方式简单:加入要注入的字段,附上@Autowired,即可完成。
  • 使得整体代码简洁明了,看起来美观大方。

2 构造器注入


@Controller
public class FooController {
  
  private final FooService fooService;
  
  @Autowired
  public FooController(FooService fooService) {
      this.fooService = fooService;
  }
  
  //使用方式上同,略
}

Spring4.x版本中推荐的注入方式,相较于field注入方式,就显得有点难看,特别是当注入的依赖很多(5个以上)的时候,就会明显的发现代码臃肿。
构造器注入的好处后面单独讨论。

3 setter注入


@Controller
public class FooController {
  
  private FooService fooService;
  
  //使用方式上同,略
  @Autowired
  public void setFooService(FooService fooService) {
      this.fooService = fooService;
  }
}

在Spring3.x刚推出的时候,推荐使用注入的就是这种,现在很少使用这种注解方式,写起来麻烦,当初推荐Spring自然也有他的道理: 构造器注入参数太多了,显得很笨重,另外setter的方式能用让类在之后重新配置或者重新注入。

构造器注入的好处

Spring在文档里怎么说:

The Spring team generally advocates constructor injection as it enables one to implement application components as immutable objects and to ensure that required dependencies are not null. Furthermore constructor-injected components are always returned to client (calling) code in a fully initialized state.

简单的翻译一下:构造器注入的方式,能够保证注入的组件不可变,并且确保需要的依赖不为空。此外,构造器注入的依赖总是能够在返回客户端(组件)代码的时候保证完全初始化的状态。

1 依赖不可变

属性使用final关键字修饰

2 依赖不为空

(省去了我们对null的检查)
当要实例化类的时候,由于类已经实现了有参数的构造函数,所以不会调用默认构造函数,那么就需要Spring容器传入所需要的参数,所以就两种情况:1、有该类型的参数->传入,OK 。2:无该类型的参数->报错。所以保证不会为空,Spring不会传一个null进去
如果使用field注入,缺点显而易见,因为你不调用将一直无法发现NPE的存在。

3 完全初始化状态

这个可以跟上面的依赖不为空结合起来,向构造器传参之前,要确保注入的内容不为空,那么肯定要调用依赖组件的构造方法完成实例化。而在Java类加载实例化的过程中,构造方法是最后一步(之前如果有父类先初始化父类,然后自己的成员变量,最后才是构造方法)。所以返回来的都是初始化之后的状态。

4 避免循环依赖

使用field注入可能会导致循环依赖,即A里面注入B,B里面又注入A:


public class A {
    @Autowired
    private B b;
}
​
public class B {
    @Autowired
    private A a;
}

使用构造器注入,在spring项目启动的时候,就会抛出:BeanCurrentlyInCreationException:Requested bean is currently in creation: Is there an unresolvable circular reference?从而提醒你避免循环依赖;
如果是field注入的话,启动的时候不会报错,在使用那个bean的时候才会报错。

5 总结

  1. 保证依赖不可变(final关键字)
  2. 保证依赖不为空(省去了我们对其检查)
  3. 避免了循环依赖
  4. 当有一个依赖有多个实现的使用,推荐使用field注入或者setter注入的方式来指定注入的类型

Q1:跟3.x里说的一样,我要是有大量的依赖要注入,构造方法不会显得很臃肿吗?
对于这个问题,说明你的类当中有太多的责任,那么你要好好想一想是不是自己违反了类的单一性职责原则,从而导致有这么多的依赖要注入。
Q2:是不是其他的注入方式都不适合用了呢?
存在即是合理!setter的方式既然一开始被Spring推荐肯定是有它的道理,像之前提到的setter的方式能用让类在之后重新配置或者重新注入,就是其优点之一。除此之外,如果一个依赖有多种实现方式,我们可以使用@Qualifier,在构造方法里选择对应的名字注入,也可以使用field或者setter的方式来手动配置要注入的实现。

到此这篇关于浅谈spring DI 依赖注入方式和区别的文章就介绍到这了,更多相关spring DI 依赖注入内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅谈spring DI 依赖注入方式和区别

本文链接: https://www.lsjlt.com/news/131400.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈spring DI 依赖注入方式和区别
    目录spring DI 3种DI注解的区别 1 @Autowired 2 @Inject 3 @Resource 3种注入方式的区别 1 field注入 2 构造器注入 3 sett...
    99+
    2024-04-02
  • spring DI依赖注入方式和区别有哪些
    小编给大家分享一下spring DI依赖注入方式和区别有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!spring DISpring框架对Java开发的重要性...
    99+
    2023-06-20
  • spring如何实现依赖注入DI(spring-test方式)
    目录spring依赖注入DI1、创建一个maven项目2、修改pom.xml3、添加类Person和Body4、在配置类App中,添加ComponentScan5、新建一个测试类6、...
    99+
    2024-04-02
  • Spring DI依赖注入过程解析
    目录依赖简介依赖注入Spring DI依赖注入详解依赖简介 一个典型的企业应用程序不是由一个单一的对象组成(或Spring的说法中的bean)。即使是最简单的应用程序也只有几个对象一...
    99+
    2022-11-13
    Spring DI依赖注入 Spring 依赖注入
  • Spring的DI依赖注入详解
    目录1、什么是DI依赖注入?2、利用 set 方法给属性赋值3、利用 构造函数 给属性赋值总结:1、什么是DI依赖注入? spring动态的向某个对象提供它所需要的其他对象。这一点是...
    99+
    2024-04-02
  • spring怎么实现依赖注入DI
    这篇文章主要介绍了spring怎么实现依赖注入DI的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇spring怎么实现依赖注入DI文章都会有所收获,下面我们一起来看看吧。spring依赖注入DI1、创建一个mav...
    99+
    2023-06-29
  • Spring依赖注入(DI)两种方式的示例详解
    目录一、依赖注入方式二、setter注入引用类型简单类型三、构造器注入引用类型简单类型参数适配(了解)四、依赖注入方式选择一、依赖注入方式 思考:向一个类中传递数据的方式有几种? 普...
    99+
    2024-04-02
  • mybatisTypeHandler注入spring的依赖方式
    目录TypeHandler注入spring的依赖解决方法mybatis扩展:自定义TypeHandler1、编写自定义TypeHandler2、配置TypeHandler3、测试4、...
    99+
    2024-04-02
  • .Net Core依赖注入IOC和DI介绍
    名词解释 说起依赖注入,很多人会想起两个词:IOC和DI。 IOC(Inversion of Control)=控制反转DI(Dependency Injection)=依赖注入 I...
    99+
    2024-04-02
  • 浅谈Spring解决循环依赖的三种方式
    引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错。下面说一下Spring是如果解决循环依赖的。第一种:构造器参数循环依赖表示通过构造器注入构成的...
    99+
    2023-05-30
    spring 循环 依赖
  • Spring依赖注入DependencyInjection的三种方式
    目录一、变量注入(Field Injection)二、构造器注入(Constructor Injection)三、setter方法注入(Setter Injection)四、使用场景...
    99+
    2023-02-14
    Spring依赖注入 Spring依赖注入的方式
  • spring IOC中三种依赖注入方式
    一、Spring IOC(依赖注入的三种方式): 1、Setter方法注入。 2、构造方法注入。 使用构造方法,注入bean值。 关键代码: public UserServ...
    99+
    2024-04-02
  • Spring依赖注入的方式有哪些
    这篇文章主要介绍“Spring依赖注入的方式有哪些”,在日常操作中,相信很多人在Spring依赖注入的方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring依赖注入的方式有哪些”的疑惑有所帮助!...
    99+
    2023-07-02
  • Spring的依赖注入方式有哪几种
    Spring的依赖注入方式有三种: 构造器注入(Constructor Injection):通过在类的构造器中注入依赖对象来实...
    99+
    2024-04-02
  • Java Spring中各依赖注入注解的区别是什么
    本篇文章给大家分享的是有关Java Spring中各依赖注入注解的区别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Spring对于Be...
    99+
    2024-04-02
  • ASP.NETCore依赖注入DI容器的方法实现
    目录一、注册服务二、解析依赖三、实现自定义的服务提供程序四、总结ASP.NET Core 是一个跨平台、高性能的框架,它提供了一种依赖注入(DI)容器,用于管理应用程序中的对象和服务...
    99+
    2023-03-19
    ASP.NET Core依赖注入DI ASP.NET Core依赖注入
  • Spring中依赖注入的方式有哪些
    在Spring中,依赖注入的方式主要有以下几种:1. 构造函数注入:通过构造函数将依赖对象作为参数传递给类的实例化过程。2. Set...
    99+
    2023-08-18
    Spring
  • Spring使用Setter完成依赖注入方式
    目录对依赖注入的理解使用Setter完成不同类型属性的注入整体配置文件Spring解决setter方式的循环依赖的原理对依赖注入的理解 依赖:实体间的所有依赖由容器创建 注入:容器负...
    99+
    2024-04-02
  • Spring依赖注入的两种方式是什么
    今天小编给大家分享一下Spring依赖注入的两种方式是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、依赖注入方式思考...
    99+
    2023-07-02
  • spring框架依赖注入方式有哪几种
    Spring框架的依赖注入方式主要有三种:1. 构造函数注入(Constructor Injection):通过构造函数实现依赖注入...
    99+
    2023-08-08
    spring
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作