在上篇博客中,我们使用Spring通过setter访问器实现了对属性的赋值,这种做法被称为设值注入。除此之外Spring还提供了通过构造方法赋值的能力,成为构造注入。下面我们通过一个小demo来了解如何通过构造方法来注入值(因一个类中可能包含其他自定义类型的对象,所以我们采用Student类中包含Car类的实例来演示如何通过构造来给Student类属性注入值)

Student类:

public class Student {
private String name;//学生姓名
private Integer age; //学生年龄
private Car car;//学生的汽车
@Override
//重写toString()方法方便进行测试
public String toString() {
return "Student [name=" + name + ", age=" + age + ", car=" + car + "]";
}
//构造函数
public Student(String name, Integer age, Car car) {
System.out.println("我是带参构造");
this.name = name;
this.age = age;
this.car = car;
} public Student() {
System.out.println("我是无参构造");
}
//属性访问器
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
} }

Car类:

public class Car {
//汽车颜色
private String color;
//属性访问器
public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
}
//重写toString()方法方便测试
@Override
public String toString() {
return "Car [color=" + color + "]";
} }

applicationContext.xml配置:

<bean id="car" class="cn.wz.entity.Car">
<property name="color" value="白色"/>
</bean> <bean id="stu" class="cn.wz.entity.Student">
<!--通过constructor-arg元素向构造方法传入参数-->
<constructor-arg index="0" value="王哲"/>
<constructor-arg index="1" value="18"/>
<constructor-arg index="2" ref="car"/>
</bean>

测试代码:

public class Test {
public static void main(String[] args) { hasArgumentConstructor();
}
public static void hasArgumentConstructor(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Student student = context.getBean("stu",Student.class);
System.out.println(student); }
}

最终运行结果:

使用p命名空间实现属性注入

Spring配置文件采用schema形式,使用不同的名命空间管理不同类型的配置,是的配置文件更具扩展性。而p命名空间的配置则不再使用property子元素来为对象的属性注入值,而是以Bean元素属性的方式来注入值如我们将上面demo的配置代码更改如下:

<bean id="car" class="cn.wz.entity.Car">
<property name="color" value="白色"/>
</bean>
<bean id="stu" class="cn.wz.entity.Student" p:name="王哲" p:age="18" p:car-ref="car" />

其测试用例运行效果是一样的,但需要注意的是在使用这种方式给属性注入值时一定要先导入P命名空间如图所示:

从上图中我们可以发现我们再xml配置文件的头文件中不但配置了P命名空间还有c命名空间,c命名空间是在使用构造注入值时使用其用法和P命名空间一样,这里不再进行演示了。

为集合属性注入值

对于存在属性类型为集合的对象Spring提供了list、set、map等元素对其进行配置。具体配置如下:

<!-- List集合 -->
<bean id="list" class="cn.wz.entity.Student">
<property name="list">
<list>
<value>王哲</value>
<value>张一铭</value>
</list>
</property>
</bean>
<!-- Set集合 -->
<bean id="set" class="cn.wz.entity.Student">
<property name="set">
<set>
<value>王哲</value>
<value>张一铭</value>
</set>
</property>
</bean>
<!-- map集合 -->
<bean id="map" class="cn.wz.entity.Student">
<property name="map">
<map>
<entry key="wz"><value>王哲</value></entry>
<entry key="zym"> <value>张一铭</value></entry>
</map>
</property>
</bean>
<!-- 数组 -->
<bean id="array" class="cn.wz.entity.Student">
<property name="array">
<list>
<value>王哲</value>
<value>张一铭</value>
</list>
</property>
</bean>

最新文章

  1. TypeScript 2.0候选版(RC)已出,哪些新特性值得我们关注?
  2. JointBoost+CRF+GraphCut做手绘草图的分割
  3. AIX 环境下Telnet返回提示所有端口已经被占用,处理方法
  4. 表头表侧边固定,方法二,丫的,复制td
  5. 软件工程 speedsnail 第二次冲刺5
  6. Regsvr32注册ActiveX控件
  7. 如何解决PHP中文乱码问题
  8. iOS开发——C篇&amp;动态内存分析
  9. JqGrid相关操作
  10. 201521123020《Java程序设计》第8周学习总结
  11. 5.3Python数据处理篇之Sympy系列(三)---简化操作
  12. 什么是IO多路复用
  13. 线上问题排查(2)——JDK内置工具
  14. ftrace利器之trace-cmd和kernelshark
  15. 八皇后问题(dfs)
  16. [廖雪峰] Git 分支管理(2):Bug 分支
  17. Rplidar学习(二)—— SDK库文件学习
  18. 一款经典的 jQuery Lightbox 灯箱效果
  19. 原生javascript星级评分
  20. redis内网无法连接的问题

热门文章

  1. C语言结构体-struct
  2. 故障排查:是什么 导致了服务器端口telnet失败?
  3. 图解集合3:CopyOnWriteArrayList
  4. Python黑客编程2 入门demo--zip暴力破解
  5. Unity3D使用经验总结 编辑器扩展篇
  6. Ubuntu环境搭建系列—JavaEE篇
  7. jQuery的选择器中的通配符[id^=&#39;code&#39;]
  8. 手把手教你做一个原生js拖动滑块【兼容PC和移动端】
  9. Java程序员的日常——存储过程知识普及
  10. Java程序员的日常—— 基于类的策略模式、List&lt;?&gt;与List、泛型编译警告、同比和环比