Spring中构造注入详解

目录

一、构造注入是什么

二、构造注入重载


一、构造注入是什么

书接上回,我们已经知道了setter注入是什么了,这里的构造注入也就很好理解了。构造注入也就是Spring通过调用类对象中的构造方法来进行注入。接下来利用代码演示构造注入

1)先创建一个Student类,这里为了防止是setter注入,不写setter方法。但是一定要写构造方法,不然无法进行构造注入

public class Student {
    private String name;
    private int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

2)在Spring的配置文件中配置关于Student类的Bean标签,这里将使用constructor-arg标签为构造方法中的属性进行赋值。构造方法中有几个属性就有几个constructor-arg标签,比如这里的构造方法中有两个属性,就要设置两个constructor-arg标签。在constructor-arg标签中看类型去赋值,这里是8种基本类型,那就使用value标签就可以了,不同的类型选择不同的标签即可。


    
        张三
    
    
        22
    

3)利用 Spring提供的接口获取到student的类对象,根据打印结果可以知道这里的构造注入已经完成了

public void test4() {
    ApplicationContext ctx =
            new ClassPathXmlApplicationContext("applicationContext.xml");
    Student student = (Student) ctx.getBean("student");
    System.out.println(student);
}

Spring中构造注入详解_第1张图片

写到这里就会发现,构造方法有重载啊,要是重载过程中都是只有一个参数呢?这时候Spring怎么去区别呢?

二、构造注入重载

利用刚刚的Student类,加两个构造方法的重载

public class Student {
    private String name;
    private int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Student(String name) {
        this.name = name;
    }
    public Student(int age) {
        this.age = age;
    }

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

这里我只想为name属性进行赋值,那我只需要在Bean标签中写一个constructor-arg标签即可


    
        李四
    

此时通过测试发现只对一个类属性赋值就成功了,其中没有对age赋值,所以这个就是默认值0 

Spring中构造注入详解_第2张图片

接下来,我只想对age进行赋值,使用刚刚的方式还可不可以呢?age是int类型,那这里的value值设置成数字就可以了。按照思路Student类中的age应该是21,接下来进行测试


    
        21
    

哦豁,这里就出现了问题了,age没有进行赋值,反倒是name变成了21。这是为什么呢? 

Spring中构造注入详解_第3张图片

出现上面的问题,也要体会一下Spring的难处,这里都是一个参数,Spring也不知道到底是为哪一个参数进行注入赋值,因为Spring也是通过constructor-arg标签来定位的。接下来就是用另一种方法来解决这个问题,在constructor-arg标签中加上一个type属性指定构造方法中的类型即可


    
        21
    

Spring中构造注入详解_第4张图片

同样的,如果是两个不同的参数,那就两个constructor-arg标签都写上type属性就可以了! 

你可能感兴趣的:(Spring,spring,java,后端)