属性注入的2种方式

来源:互联网 发布:mac plsql developer 编辑:程序博客网 时间:2024/06/12 01:06

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方法注入,非常简单,容易理解,是最常用的方式