属性注入的2种方式

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

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

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

(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属性

    "person1" class="com.Person">
        value="张三" type="java.lang.String">
        value="2500" type="java.lang.Double">
        ref="dept1" type="com.Dept">
        value="22" type="int">
    

如果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">
        
        <constructor-arg value="张三" type="java.lang.String">constructor-arg>

        
        <constructor-arg value="男" type="java.lang.String">constructor-arg>
    bean>

    <bean id="student2" class="Student">
        
        <constructor-arg value="男" type="java.lang.String">constructor-arg>

        
        <constructor-arg value="张三" type="java.lang.String">constructor-arg>
    bean>

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

你可能感兴趣的:(Spring)