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标签就可以了,不同的类型选择不同的标签即可。

<bean id="student" class="com.gl.demo.model.Student">
    <constructor-arg>
        <value>张三</value>
    </constructor-arg>
    <constructor-arg>
        <value>22</value>
    </constructor-arg>
</bean>

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

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

写到这里就会发现,构造方法有重载啊,要是重载过程中都是只有一个参数呢?这时候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标签即可

<bean id="student" class="com.gl.demo.model.Student">
    <constructor-arg>
        <value>李四</value>
    </constructor-arg>
</bean>

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

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

<bean id="student" class="com.gl.demo.model.Student">
    <constructor-arg>
        <value>21</value>
    </constructor-arg>
</bean>

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

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

<bean id="student" class="com.gl.demo.model.Student">
    <constructor-arg type="int">
        <value>21</value>
    </constructor-arg>
</bean>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值