属性注入的2种方式

set方法注入;构造方法注入

(一)set方法注入
使用最多的一种注入方式,非常简单,容易掌握

    <bean id="test1" class="com.Test">
        <property name="age" value="20"></property>
        <property name="name" value="Richard"></property>
    </bean>

(1)需要使用bean标签的property子标签
(2)property标签一定有name属性,通过name属性,找到并调用对应的set方法,为属性注入值。
property标签的name属性是age,会去调用setAge(args)方法;
property标签的name属性是name,会去调用setName(args)方法

(二)构造方法注入

Person类

public class Person {
    private String name;
    private Double salary;
    private Dept dept;
    private int age;
    //不用写set方法了
    public Person() {
    }
    public Person(String name, Double salary, Dept dept, int age) {
        this.name = name;
        this.salary = salary;
        this.dept = dept;
        this.age = age;
    }
}

(1)配置bean,constructor-arg标签只有value属性:

    <bean id="person1" class="com.Person">
        <constructor-arg value="张三"></constructor-arg>
        <constructor-arg value="2500"></constructor-arg>
        <constructor-arg ref="dept1"></constructor-arg>
        <constructor-arg value="22"></constructor-arg>
    </bean>

①有4个constructor-arg标签,会调用带4个参数的构造器去创建对象。
②倘若找不到对应的构造器,会抛出异常。例如:我们需要4参构造器,但目标类中没有4参构造器,此时抛出异常
③不再是调用无参构造器,因此不写无参构造器也能正常运行,还是建议写无参构造器。
④只有value属性,没有其他的约束条件,因此:
第一个constructor-arg标签与构造器的第一个参数对应,
第n个constructor-arg标签与构造器的第n个参数对应
⑤由第4点可知:constructor-arg标签的顺序必须和构造器的参数列表一一对应,否则抛出异常
(2)配置bean,constructor-arg标签有value+index属性

    <bean id="person1" class="com.Person">
        <constructor-arg ref="dept1" index="2"></constructor-arg>
        <constructor-arg value="张三" index="0"></constructor-arg>
        <constructor-arg value="22" index="3"></constructor-arg>
        <constructor-arg value="2500" index="1"></constructor-arg>
    </bean>

index=”0”:与构造器的第1个参数对应。
index=”1”:与构造器的第2个参数对应。
……
(3)配置bean,constructor-arg标签有value+name属性

    public Person(String name1, Double salary2, Dept dept3, int age4) {
        super();
        this.name = name1;
        this.salary = salary2;
        this.dept = dept3;
        this.age = age4;
    }
    <bean id="person1" class="com.Person">
        <constructor-arg value="张三" name="name1"></constructor-arg>
        <constructor-arg value="2500" name="salary2"></constructor-arg>
        <constructor-arg ref="dept1" name="dept3"></constructor-arg>
        <constructor-arg value="22" name="age4"></constructor-arg>
    </bean>

name属性和构造器的形参名称一一对应
(4)配置bean, constructor-arg标签有value+type属性

    <bean id="person1" class="com.Person">
        <constructor-arg value="张三" type="java.lang.String"></constructor-arg>
        <constructor-arg value="2500" type="java.lang.Double"></constructor-arg>
        <constructor-arg ref="dept1" type="com.Dept"></constructor-arg>
        <constructor-arg value="22" type="int"></constructor-arg>
    </bean>

如果2个参数的数据类型相同,就按顺序注入。代码如下:

public class Student {
    private String name;
    private String sex;
    public Student() {
    }
    public Student(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }
}
    <bean id="student1" class="Student">
        <!-- 为第一个String类型的参数name注值-->
        <constructor-arg value="张三" type="java.lang.String"></constructor-arg>

        <!-- 为第二个String类型的参数sex注值-->
        <constructor-arg value="男" type="java.lang.String"></constructor-arg>
    </bean>

    <bean id="student2" class="Student">
        <!-- 为第一个String类型的参数name注值-->
        <constructor-arg value="男" type="java.lang.String"></constructor-arg>

        <!-- 为第二个String类型的参数sex注值-->
        <constructor-arg value="张三" type="java.lang.String"></constructor-arg>
    </bean>

构造注入比较繁琐,细节也较多,使用较少;Set方法注入,非常简单,容易理解,是最常用的方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值