上一节中我们了解了bean对于集合的装配,可以看到,还是很简单的,总是总结这样的知识点,瞬时间自信心爆棚啊!好,下面我们来总结又一个简单的知识点,继承配置和通过构造函数来配置bean。
通过继承来配置bean
school.javapackage rogue.inherit; public class School { private String name; private String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
Student.java
package rogue.inherit; public class Student extends School{ private String stuName; private int age; public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
beans.xml
<bean id="school" class="rogue.inherit.School"> <property name="name" value="高水中学"/> <property name="address" value="大阪"/> </bean> <bean id="student" parent ="school" class="rogue.inherit.Student"> <property name="stuName" value="王小明"/> <property name="age" value="10"/> </bean>
测试程序:
public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("rogue/inherit/beans.xml"); Student student = (Student) ac.getBean("student"); System.out.println(student.getStuName()+"是"+student.getAge()+"岁的学生,他的学校位于"+student.getAddress()); }
以上,我们都是利用set方式给bean注入值的,Spring还提供了通过构造函数给bean注入值,下面我们来说一下。
还以上面的Student.java为例,在beans.xml做如下配置
<bean id="student2" class="rogue.inherit.Student">
<constructor-arg index="0" type="java.lang.String" value="小樱">
<constructor-arg index="1" type="int" value="10">
</bean>
这样,我们就得到了一个实例对象。当然,前提是在Student.java 里面必须有这样有两个参数的构造函数才可以成功。
通过以上的讲解,我们大体上了解了利用set和构造函数来配置bean的方式。set注入的缺点是无法清晰表达哪些属性是必须的,哪些属性是可选的。比如说,student这个bean中有age、name、address三个属性,我用set的方式可以配置这三个中的任意几个,这样就导致了如果我们需要配置两个属性但是实际上却只配置了一个,这样也不会报错。构造函数注入的优势是通过构造强制依赖关系,不可能实例化不完全的或无法使用的bean。就是说,有什么样的构造函数就必须只能那样配置,参数个数和类型必须要匹配。