Spring中的构造注入

 更新时间:2023年12月01日 14:58:01   作者:举个栗子?  
这篇文章主要介绍了Spring中的构造注入,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

在上一篇文章中我们了解了DI的set注入,接下来我们来看一下DI实现的另一种方式,构造注入。

构造注入

构造注入是指,在构造调用者实例的同时,完成被调用者的实例化。

即,使用构造器设置依赖关系。

简单的理解就是spring调用类的有参构造方法,在创建对象的同时使用构造方法给属性赋值。

看一下构造注入的实现

首先定义School类和Student类,在Student类中创建School类的对象。

School类:

public class School {
    private String name;
    private String address;

    public void setName(String name) {
        this.name = name;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "School{" +
                "name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

Student类:

public class Student {
    private String name;
    private int age;
    private School school;

    public Student() {
        System.out.println("Student的无参构造方法");
    }

    public Student(String myName, int myAge, School mySchool){
        System.out.println("Student的有参构造方法");
        this.name = myName;
        this.age = myAge;
        this.school = mySchool;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setSchool(School school) {
        this.school = school;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", school=" + school +
                '}';
    }
}

接下来在spring的配置文件中声明需要用到的对象

<!--
    构造注入使用<constructor-arg>标签
    一个<constructor-arg>标签表示构造方法的一个参数
    <constructor-arg>标签属性:
        name:表示构造方法的形参名
        index:表示构造方法中参数的位置,自左向右从0开始
           value:构造方法的形参类型是简单类型,使用value
        ref:构造方法的形参类型是引用类型,使用ref
        
    下面分别使用name和index来完成构造注入
-->
<!--使用name属性-->
<bean id="myStudent1" class="com.xxx.package01.Student">
    <constructor-arg name="myName" value="张三" />
    <constructor-arg name="myAge" value="20" />
    <constructor-arg name="mySchool" ref="mySchool" />
</bean>
<!--使用index属性-->
<bean id="myStudent2" class="com.xxx.package01.Student">
    <constructor-arg index="0" value="张三" />
    <constructor-arg index="1" value="20" />
    <constructor-arg index="2" ref="mySchool" />
</bean>

<bean id="mySchool" class="com.xxx.package01.School">
    <property name="name" value="北京大学" />
    <property name="address" value="北京" />
</bean>

准备一个测试方法,测试以上程序

public class MyTest {
    @Test
    public void test01(){
        String config = "package01/applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);

        //使用myStudent1或myStudent2对象都能完成注入
        Student myStudent = (Student) ac.getBean("myStudent1");
        //Student myStudent = (Student) ac.getBean("myStudent2");
        System.out.println("Student = " + myStudent);
    }
}

测试结果如下:

从输出结果我们可以看出,构造注入在创建对象时调用的是Student的有参构造方法,因为我们在spring配置文件中声明了两次Student对象,所以会调用两次有参构造方法。

总结

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

相关文章

  • web容器中实例化spring相关配置解析

    web容器中实例化spring相关配置解析

    这篇文章主要介绍了web容器中实例化spring相关配置解析,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java8接口中引入default关键字的本质原因详析

    Java8接口中引入default关键字的本质原因详析

    Default方法是在java8中引入的关键字,也可称为Virtual extension methods—虚拟扩展方法,这篇文章主要给大家介绍了关于Java8接口中引入default关键字的本质原因,需要的朋友可以参考下
    2022-01-01
  • SpringBoot中WEB的启动流程分析

    SpringBoot中WEB的启动流程分析

    今天我们就来分析下springboot启动web项目整个流程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-03-03
  • SpringBoot使用maven实现多环境运行和打包的操作步骤

    SpringBoot使用maven实现多环境运行和打包的操作步骤

    在开发过程中,需要不断进行环境的切换和打包部署,maven提供了多环境配置,可以方便实现不同环境的配置切换和打包,本文通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • Java使用jmeter进行压力测试

    Java使用jmeter进行压力测试

    本篇文章简单讲一下使用jmeter进行压力测试。其压测思想就是 通过创建指定数量的线程,同时请求指定接口,来模拟指定数量用户同时进行某个操作的场景,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • springboot 返回json格式数据时间格式配置方式

    springboot 返回json格式数据时间格式配置方式

    这篇文章主要介绍了springboot 返回json格式数据时间格式配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java获取Date类型的年份实例代码

    java获取Date类型的年份实例代码

    这篇文章主要给大家介绍了关于java如何获取Date类型的年份,针对java获取Date时间的各种方式汇总,有常用的时间获取方式,还有一些其他特殊时间获取方式,需要的朋友可以参考下
    2024-06-06
  • java中堆内存与栈内存的知识点总结

    java中堆内存与栈内存的知识点总结

    在本篇文章里小编给大家整理的是关于java中堆内存与栈内存的知识点总结,有需要的朋友们可以跟着学习下。
    2019-12-12
  • 浅谈MyBatis-Plus学习之Oracle的主键Sequence设置的方法

    浅谈MyBatis-Plus学习之Oracle的主键Sequence设置的方法

    这篇文章主要介绍了浅谈MyBatis-Plus学习之Oracle的主键Sequence设置的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java开发如何把数据库里的未付款订单改成已付款

    Java开发如何把数据库里的未付款订单改成已付款

    这篇文章主要介绍了Java开发如何把数据库里的未付款订单改成已付款,先介绍MD5算法,简单的来说,MD5能把任意大小、长度的数据转换成固定长度的一串字符,实现思路非常简单需要的朋友可以参考下
    2022-11-11

最新评论