首页 > 其他分享 >Spring的注入方式

Spring的注入方式

时间:2023-02-17 18:14:40浏览次数:39  
标签:依赖 方式 Spring 构造 fooService 注入

Spring的注入方式

目录

一、前言

Spring框架对Java开发的重要性不言而喻,其核心特性就是IOC(Inversion of Control, 控制反转)和AOP,平时使用最多的就是其中的IOC,我们通过将组件交由Spring的IOC容器管理,将对象的依赖关系由Spring控制,避免硬编码所造成的过度程序耦合。前几天的时候,笔者的同事问我为什么要使用构造器的注入方式,我回答说因为Spring文档推荐这种,而说不出为什么 T^T,后面抽时间了解了一下,下面就是笔者要讨论的就是其注入方式。

二、常见的三种注入方式

笔者为了方便起见就只是用注解的方式注入(现在也很少使用xml了吧)

2.1、Field注入

@Controller
public class FooController {
  
  @Autowired
  private FooService fooService;

  //简单的使用例子,下同
  public List<Foo> listFoo() {
    return fooService.list();
  }
}

这种注入方式应该是笔者目前为止开发中见到的最常见的注入方式。原因很简单:

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

2.2 构造器注入

@Controller
public class FooController {

  private final FooService fooService;

  @Autowired
  public FooController(FooService fooService) {
    this.fooService = fooService;
  }

  //使用方式上同,略
}

在Spring4.x版本中推荐的注入方式就是这种,相较于上面的field注入方式而言,就显得有点难看,特别是当注入的依赖很多(5个以上)的时候,就会明显的发现代码显得很臃肿。对于这一点我们后面再来讨论,别急。

2.3 setter注入

@Controller
public class FooController {

  private FooService fooService;

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

在Spring3.x刚推出的时候,推荐使用注入的就是这种,笔者现在也基本没看到过这种注解方式,写起来麻烦,当初推荐Spring自然也有他的道理,这里我们引用一下Spring当时的原话:

The Spring team generally advocates setter injection, because large numbers of constructor arguments can get unwieldy, especially when properties are optional. Setter methods also make objects of that class amenable to reconfiguration or re-injection later. Management through JMX MBeans is a compelling use case.

Some purists favor constructor-based injection. Supplying all object dependencies means that the object is always returned to client (calling) code in a totally initialized state. The disadvantage is that the object becomes less amenable to reconfiguration and re-injection.

咳咳,简单的翻译一下就是:构造器注入参数太多了,显得很笨重,另外setter的方式能用让类在之后重新配置或者重新注入

那么后面为什么又换成构造器注入了呢?(喂喂喂,Spring你前一大版本还贬低构造器注入,后面就立刻捧人家了不好吧,不过能用于承认自己的错误,才是真正令人称赞的地方吧

三、构造器注入的好处

先来看看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.

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

下面来简单的解释一下:

  • 依赖不可变:其实说的就是final关键字,这里不再多解释了。不明白的园友可以回去看看Java语法。
  • 依赖不为空(省去了我们对其检查):当要实例化FooController的时候,由于自己实现了有参数的构造函数,所以不会调用默认构造函数,那么就需要Spring容器传入所需要的参数,所以就两种情况:1、有该类型的Bean参数->传入,OK 。2:无该类型的Bean参数->报错。所以保证不会为空,Spring总不至于传一个null进去吧

    标签:依赖,方式,Spring,构造,fooService,注入
    From: https://www.cnblogs.com/likeguang/p/17131130.html

相关文章

  • SpringMVC09 - 文件的下载与上传
    文件下载ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文使用ResponseEntity实现下载文件的功能①浏览器触发下载<ath:href......
  • SpringMVC10 - 拦截器 Interceptor
    拦截器拦截器的配置SpringMVC中的拦截器用于拦截控制器方法的执行SpringMVC中的拦截器需要实现HandlerInterceptorSpringMVC的拦截器必须在SpringMVC的配置文件中进行......
  • SpringMVC11 - 异常处理器 ExceptionResolver
    异常处理器SpringMVC默认使用DefaultHandlerExceptionResolver,因此,会跳转到出现404、405等报错页面基于XML配置的异常处理SpringMVC提供了一个处理控制器方法执行过......
  • Spring Security
    1.SpringBoot+SpringSecurity+JWT整合https://blog.csdn.net/seeyouagain_/article/details/128549455?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.no......
  • SpringMVC12 - 基于注解配置SpringMVC
    注解配置SpringMVC使用配置类和注解代替web.xml和SpringMVC配置文件的功能创建初始化类,代替web.xml在Servlet3.0环境中,容器会在类路径中查找实现javax.servlet.Servlet......
  • SpringMVC13 - 执行流程
    SpringMVC常用组件DispatcherServlet:前端控制器,不需要工程师开发,由框架提供作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求HandlerMapping......
  • springboot接入kafka
    1、windows下安装、启动kafka,这一步只是搭建环境​​https://blog.51cto.com/u_15595167/6026035​​2、安装kafka管理工具:kafkamanager,推荐linux下安装,windows下编译等很麻......
  • 使用SpringBoot简单实现WebRTC群聊会议室(Mesh方案)
    近期需要做一个类似会议室功能,但网络上大多数是一对一通信,故记录分享希望帮助到有用的人WebRTC一对一聊天原理关于WebRTC建立一对一聊天的模板网上很多,可参考以下博客:spr......
  • 使用springboot cache + redis缓存时使用gzip压缩以提升性能
    背景在高并发的场景中,我们通常会使用缓存提升性能。在使用springbootcache时,我们通常会使用基于JSON的序列化与反序列化。JSON具有可读性强,结构简单的特点,使用灵活。但......
  • 沟通方式 -一秒钟让人懂你
    日常沟通、汇报讨论、头脑风暴等工作场景中,有没有遇到过你怎么讲别人都不懂你的时候?除了尴尬、抓逛、或者心里暗骂对方悟性太低意外还能做点什么?为什么人家不懂你-原因分析......