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的时候才会报错。

总结

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

相关文章

  • Java中的动态数组和栈Vector Stack使用区别介绍

    Java中的动态数组和栈Vector Stack使用区别介绍

    这篇文章主要为大家介绍了Java中的动态数组和栈Vector Stack使用介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 四个Java必须知道的负载均衡算法分享

    四个Java必须知道的负载均衡算法分享

    我们在设计系统的时候,为了系统的高扩展性,会创建无状态的系统。但是,要使系统具有更好的可扩展性,除了无状态设计之外,还要考虑采用什么负载均衡算法,本文就带领大家认识以下常见的4种负载均衡算法
    2023-01-01
  • Spring Boot使用Druid进行维度的统计和监控

    Spring Boot使用Druid进行维度的统计和监控

    这篇文章主要介绍了Spring Boot使用Druid进行维度的统计和监控,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-04-04
  • 关于mybatis-plus逻辑删除无效的问题

    关于mybatis-plus逻辑删除无效的问题

    这篇文章主要介绍了mybatis-plus逻辑删除无效,文中给大家提到了配置过程及全部代码,代码简单易懂,需要的朋友可以参考下
    2021-09-09
  • Java使用ExecutorService来停止线程服务

    Java使用ExecutorService来停止线程服务

    这篇文章主要介绍了Java使用ExecutorService来停止线程服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 在IntelliJ IDEA中创建和运行java/scala/spark程序的方法

    在IntelliJ IDEA中创建和运行java/scala/spark程序的方法

    这篇文章主要介绍了在IntelliJ IDEA中创建和运行java/scala/spark程序的教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • SpringBoot整合MyBatis逆向工程及 MyBatis通用Mapper实例详解

    SpringBoot整合MyBatis逆向工程及 MyBatis通用Mapper实例详解

    这篇文章主要介绍了SpringBoot整合MyBatis逆向工程及 MyBatis通用Mapper实例详解 ,需要的朋友可以参考下
    2017-09-09
  • Spring容器添加组件方式实现

    Spring容器添加组件方式实现

    这篇文章主要介绍了Spring容器添加组件方式实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • idea中database不显示问题的解决

    idea中database不显示问题的解决

    这篇文章主要介绍了idea中database不显示问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 详解Spring boot Admin 使用eureka监控服务

    详解Spring boot Admin 使用eureka监控服务

    本篇文章主要介绍了详解Spring boot Admin 使用eureka监控服务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12

最新评论