java构造器复用方式

 更新时间:2024年03月26日 08:36:09   作者:chuanzhangsss  
这篇文章主要介绍了java构造器复用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

构造器复用

创建一个Employee类,属性有(名字,性别,年龄,职位,薪水),提供3个构造方法,可以初始化(⑴)(名字,性别,年龄,职位,薪水),(2)(名字,性别,年龄)(3)(职位,薪水).要求充分复用构造器Hello.java

 public class Hello {
     public static void main(String[] args) {
         
     }
 }
 class EMployee{
     String name;
     char gender;
     int age;
     String job;
     double sal;
     // 职位 薪水
     public EMployee(String job,double sal) {
         this.job = job;
         this.sal = sal;
     }
     // 姓名 性别 年龄
     public EMployee(String name,char gender,int age) {
         this.name = name;
         this.gender = gender;
         this.age = age;
     }
     // 名字 性别 年龄 职位 薪水
     public EMployee(String job,double sal,String name,char gender,int age) {
         this(name,gender,age);
         this.job = job;
         this.sal = sal;
     }
 }

推荐使用构造器注入

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

前几天的时候,朋友问我为什么要使用构造器的注入方式,后面抽时间了解了一下,下面就是笔者要讨论的就是其注入方式。 

常见的三种注入方式

field注入

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

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

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

构造器注入

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

setter注入

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

构造器注入的好处

  • 依赖不可变:其实说的就是final关键字,这里不再多解释了。不明白的园友可以回去看看Java语法。
  • 依赖不为空(省去了我们对其检查):当要实例化FooController的时候,由于自己实现了有参数的构造函数,所以不会调用默认构造函数,那么就需要Spring容器传入所需要的参数,所以就两种情况:1、有该类型的参数->传入,OK 。2:无该类型的参数->报错。所以保证不会为空,Spring总不至于传一个null进去吧 😦
  • 完全初始化的状态:这个可以跟上面的依赖不为空结合起来,向构造器传参之前,要确保注入的内容不为空,那么肯定要调用依赖组件的构造方法完成实例化。而在Java类加载实例化的过程中,构造方法是最后一步(之前如果有父类先初始化父类,然后自己的成员变量,最后才是构造方法,这里不详细展开。)。所以返回来的都是初始化之后的状态。
//承接上面field注入的代码,假如客户端代码使用下面的调用(或者再Junit测试中使用)
//这里只是模拟一下,正常来说我们只会暴露接口给客户端,不会暴露实现。
FooController fooController = new FooController();
fooController.listFoo(); // -> NullPointerException

如果使用field注入,缺点显而易见,对于IOC容器以外的环境,除了使用反射来提供它需要的依赖之外,无法复用该实现类。而且将一直是个潜在的隐患,因为你不调用将一直无法发现NPE的存在。

还值得一提另外一点是:使用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的时候才会报错。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Eclipse 2020-06 汉化包安装步骤详解(附汉化包+安装教程)

    Eclipse 2020-06 汉化包安装步骤详解(附汉化包+安装教程)

    这篇文章主要介绍了Eclipse 2020-06 汉化包安装步骤(附汉化包+安装教程),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java程序执行Cmd指令所遇问题记录及解决方案

    Java程序执行Cmd指令所遇问题记录及解决方案

    这篇文章主要介绍了Java程序执行Cmd指令所遇问题记录,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Java List一些常用方法完全攻略

    Java List一些常用方法完全攻略

    List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作,这篇文章主要介绍了Java List一些常用方法的相关资料,需要的朋友可以参考下
    2026-04-04
  • SpringBoot 中的 @Transactional 事务基本作用及注意事项示例详解

    SpringBoot 中的 @Transactional 事务基本作用及注意事项示例详解

    @Transactional是SpringBoot中声明式事务管理的核心注解,通过注解简化事务控制,确保操作的原子性,支持异常回滚、隔离级别和传播行为配置,需注意代理模式、异常抛出及数据库支持等条件,避免事务失效,本文介绍SpringBoot @Transactional事务作用,感兴趣的朋友一起看看吧
    2025-09-09
  • java基面试础知识详解

    java基面试础知识详解

    这篇文章主要介绍了java基面试础知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Java中IO流概述

    Java中IO流概述

    大家好,本篇文章主要讲的是Java中IO流概述,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • SpringMVC生成的验证码图片不显示问题及解决方法

    SpringMVC生成的验证码图片不显示问题及解决方法

    这篇文章主要介绍了SpringMVC生成的验证码图片不显示问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Java使用utf8格式保存文本文件的方法

    Java使用utf8格式保存文本文件的方法

    这篇文章主要介绍了Java使用utf8格式保存文本文件的方法,涉及Java针对字符流编码操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • java实现停车场系统

    java实现停车场系统

    这篇文章主要为大家详细介绍了java实现停车场系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Spring boot JPA实现分页和枚举转换代码示例

    Spring boot JPA实现分页和枚举转换代码示例

    这篇文章主要介绍了Spring boot JPA实现分页和枚举转换代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09

最新评论