一、Bean属性依赖注入
对于类成员变量,注入方式有三种
  •构造函数注入
  •属性setter方法注入
  •接口注入
Spring支持前两种
1、构造函数 属性注入
使用构造方法注入,在Spring配置文件中,通过<contruct-arg>设置注入的属性(可以通过index或者type注入)
 
 
2、setter方法注入
 
使用setter方法注入,在Spring配置文件中,通过<property>设置注入的属性
 
 
注入一个复杂类型,通过<property> ref属性 引用其他Bean
  1. package cn.itcast.spring.di;
  2. //构造方法注入
  3. public class Car {
  4. private String name;
  5. private String color;
  6.  
  7. public Car(String name, String color) {
  8. super();
  9. this.name = name;
  10. this.color = color;
  11. }
  12.  
  13. @Override
  14. public String toString() {
  15. return "Car [name=" + name + ", color=" + color + "]";
  16. }
  17. }
  18.  
  19. package cn.itcast.spring.di;
  20. //setter方法注入
  21. public class Car2 {
  22. private String name;
  23. private String color;
  24.  
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28.  
  29. public void setColor(String color) {
  30. this.color = color;
  31. }
  32.  
  33. @Override
  34. public String toString() {
  35. return "Car2 [name=" + name + ", color=" + color + "]";
  36. }
  37.  
  38. }
  39.  
  40. package cn.itcast.spring.di;
  41.  
  42. //employee 引用一个复杂数据类型 Car2
  43. public class Employee {
  44. private String name;
  45. private Car2 car2;
  46.  
  47. public void setCar2(Car2 car2) {
  48. this.car2 = car2;
  49. }
  50.  
  51. public void setName(String name) {
  52. this.name = name;
  53. }
  54.  
  55. @Override
  56. public String toString() {
  57. return "Employee [name=" + name + ", car2=" + car2 + "]";
  58. }
  59.  
  60. }
  61.  
  62. <!-- 使用构造函数 完成属性注入 -->
  63. <bean id="car" class="cn.itcast.spring.di.Car">
  64. <!-- 构造函数注入 通过constructor-arg -->
  65. <!-- 通过索引和类型,指定注入参数位置 -->
  66. <constructor-arg index="0" type="java.lang.String" value="宝马"></constructor-arg>
  67. <constructor-arg index="1" type="java.lang.String" value="红色"></constructor-arg>
  68. </bean>
  69.  
  70. <!-- 使用setter 方法注入 -->
  71. <bean id="car2" class="cn.itcast.spring.di.Car2">
  72. <!-- setter 方法注入 ,根据setter 方法编写注入属性 -->
  73. <property name="name" value="保时捷"></property>
  74. <property name="color" value="黑色"></property>
  75. </bean>
  76.  
  77. <!--注入一个复杂类型,通过<property> ref属性 引用其他Bean -->
  78. <bean id="employee" class="cn.itcast.spring.di.Employee">
  79. <property name="name" value="小丽"></property>
  80. <!-- ref 引用另一个Bean -->
  81. <property name="car2" ref="car2"></property>
  82. </bean>
  1. // 测试复杂类型 注入
  2. @Test
  3. public void demo3() {
  4. ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
  5. "applicationContext.xml");
  6. Employee employee = (Employee) applicationContext.getBean("employee");
  7. System.out.println(employee);
  8. }
  9.  
  10. // 测试setter 方法注入
  11. @Test
  12. public void demo2() {
  13. ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
  14. "applicationContext.xml");
  15. Car2 car2 = (Car2) applicationContext.getBean("car2");
  16. System.out.println(car2);
  17. }
  18.  
  19. // 测试构造函数属性注入
  20. @Test
  21. public void demo1() {
  22. ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
  23. "applicationContext.xml");
  24. Car car = (Car) applicationContext.getBean("car");
  25. System.out.println(car);
  26. }

3、p名称空间的使用

从spring2.5版本,为了简化 bean属性注入写法,引入p名称空间

p:<属性名>="xxx"  引入常量值

p:<属性名>-ref="xxx"  引入其他bean对象

使用p名称空间之前,先引用p名称空间:"xmlns:p="http://www.springframework.org/schema/p" 加入bean 元素

  1. <bean id="employee" class="cn.itcast.spring.di.Employee">
  2. <property name="name" value="小丽"></property>
  3. <property name="car2" ref="car2"></property>
  4. </bean>

简化为:

  1. 1 <!-- 使用p名称空间 -->
  2. <bean id="employee" class="cn.itcast.spring.di.Employee" p:name="小丽" p:car2="#{car2}" />

4、SpEL (Spring Expression Language ) 的使用

Spring 3.0 创建了一种新的方式用以配置对象的注入(set 注入或者构造参数注入),它便是SpEL (Spring Expression Language)

语法格式 : #{...}

用法一: 向一个Bean 引用另一个Bean

  1. <property name="car2" ref="car2" /> ------ > <property name="car2" value="#{car2}" /

用法二: 使用另一个Bean属性 为当前Bean 属性赋值

  1. public class CarInfo {
  2. // 说明CarInfo 有个 name 属性
  3. public String getName() {
  4. return "奇瑞QQ";
  5. }
  6.  
  7. // 是一个普通方法
  8. public String initColor() {
  9. return "白色";
  10. }
  11.  
  12. }
  1. <bean id="carinfo" class="cn.itcast.spring.di.CarInfo"></bean>
  2. <bean id="car3" class="cn.itcast.spring.di.Car2">
  3. <property name="name" value="#{carinfo.name}"></property>
  4. </bean>

car3 的name值,调用 carinfo对象 getName() 方法

用法三 : 使用另一个Bean 方法 ,为当前Bean 属性赋值

  1. public class CarInfo {
  2. // 说明CarInfo 有个 name 属性
  3. public String getName() {
  4. return "奇瑞QQ";
  5. }
  6.  
  7. // 是一个普通方法
  8. public String initColor() {
  9. return "白色";
  10. }
  11.  
  12. }
  1. <bean id="carinfo" class="cn.itcast.spring.di.CarInfo"></bean>
  2. <bean id="car3" class="cn.itcast.spring.di.Car2">
  3. <property name="name" value="#{carinfo.name}"></property>
  4. <property name="color" value="#{carinfo.initColor()}"></property>
  5. </bean>

car3 的color值,有carinfo对象 initColor方法提供的

用法四: 读取properties 文件的值

5、如何向一个Bean对象 ,注入集合类型的属性

    List 、Set 、 Map 、Properties
  1. // 集合Bean ,向Bean中注入 List 、 Set 、Map 、Properties 对应数据
  2.  
  3. public class CollectionBean {
  4. private List<String> hobbies;
  5. private Set<Car2> cars;
  6. private Map<String, Integer> webSiteVisitMap;
  7. private Properties employees;
  8.  
  9. public void setHobbies(List<String> hobbies) {
  10. this.hobbies = hobbies;
  11. }
  12.  
  13. public void setCars(Set<Car2> cars) {
  14. this.cars = cars;
  15. }
  16.  
  17. public void setWebSiteVisitMap(Map<String, Integer> webSiteVisitMap) {
  18. this.webSiteVisitMap = webSiteVisitMap;
  19. }
  20.  
  21. public void setEmployees(Properties employees) {
  22. this.employees = employees;
  23. }
  24.  
  25. @Override
  26. public String toString() {
  27. return "CollectionBean [hobbies=" + hobbies + ", cars=" + cars
  28. + ", webSiteVisitMap=" + webSiteVisitMap + ", employees="
  29. + employees + "]";
  30. }
  31.  
  32. }
  33.  
  34. <!-- Bean注入 集合类型属性 -->
  35. <bean id="collectionBean" class="cn.itcast.spring.di.CollectionBean">
  36. <!-- 注入list 基本数据类型 -->
  37. <property name="hobbies">
  38. <list>
  39. <value>体育</value>
  40. <value>音乐</value>
  41. <value>爬山</value>
  42. </list>
  43. </property>
  44. <!-- 注入 Set 复杂数据类型 -->
  45. <property name="cars">
  46. <set>
  47. <ref bean="car2"/>
  48. <ref bean="car3"/>
  49. </set>
  50. </property>
  51. <!-- 注入Map -->
  52. <property name="webSiteVisitMap">
  53. <map>
  54. <entry key="传智播客" value="100"></entry>
  55. <entry key="黑马程序员" value="110"></entry>
  56. </map>
  57. </property>
  58. <!-- 注入property -->
  59. <property name="employees">
  60. <props>
  61. <prop key="张三">传智播客</prop>
  62. <prop key="李四">黑马程序员</prop>
  63. </props>
  64. </property>
  65. </bean>
  66.  
  67. </beans>
  68.  
  69. // 测试集合属性赋值
  70. @Test
  71. public void demo5() {
  72. ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
  73. "applicationContext.xml");
  74. CollectionBean collectionBean = (CollectionBean) applicationContext
  75. .getBean("collectionBean");
  76. System.out.println(collectionBean);
  77. }

依赖注入Bean属性的更多相关文章

  1. 依赖注入Bean属性——手动装配Bean

    一.构造方法注入 其中,可以根据不同的参数列表调用不同的重载的构造方法: 其中,基本数据类型没有包,引用类型都有包路径,基本类型对应封装类: 二.通过property标签调用类的set方法注入 三.通 ...

  2. spring实战一:装配bean之注入Bean属性

    内容参考自spring in action一书. 创建应用对象之间协作关系的行为通常称为装配,这也是依赖注入的本质. 1. 创建spring配置 spring是一个基于容器的框架.如果没有配置spri ...

  3. [转载]Spring下IOC容器和DI(依赖注入) @Bean及@Autowired

    Spring下IOC容器和DI(依赖注入) @Bean及@Autowired自动装配 bean是什么 bean在spring中可以理解为一个对象.理解这个对象需要换一种角度,即可将spring看做一门 ...

  4. Spring入门(4)-注入Bean属性

    Spring入门(4)-注入Bean属性 本文介绍如何注入Bean属性,包括简单属性.引用.内部Bean.注入集合等. 0. 目录 注入简单值 注入引用 注入内部Bean 装配集合 装配空值 使用命名 ...

  5. Spring学习笔记--注入Bean属性

    这里通过一个MoonlightPoet类来演示了注入Bean属性property的效果. package com.moonlit.myspring; import java.util.List; im ...

  6. Spring学习(五)-----注入bean属性的三种方式( 1: 正常的方式 2: 快捷方式 3: “p” 模式)

    在Spring中,有三种方式注入值到 bean 属性. 正常的方式 快捷方式 “p” 模式 看到一个简单的Java类,它包含两个属性 - name 和 type.稍后将使用Spring注入值到这个 b ...

  7. SpringMVC的filter怎么使用Autowired依赖注入bean

      有的时候根据我们业务的需要,我们需要在web项目中定义一个自己的filter,并想在这个filter中使用@Autowired注入bean供我们使用.如果直接使用的话是不行的,需要我们在xml文件 ...

  8. SpringBoot集成Quartz(解决@Autowired空指针Null问题即依赖注入的属性为null)

    使用spring-boot作为基础框架,其理念为零配置文件,所有的配置都是基于注解和暴露bean的方式. Quartz的4个核心概念: 1.Job表示一个工作,要执行的具体内容.此接口中只有一个方法v ...

  9. Spring 源码分析之 bean 依赖注入原理(注入属性)

         最近在研究Spring bean 生命周期相关知识点以及源码,所以打算写一篇 Spring bean生命周期相关的文章,但是整理过程中发现涉及的点太多而且又很复杂,很难在一篇文章中把Spri ...

随机推荐

  1. linux下验证码无法显示:Could not initialize class sun.awt.X1 解决方案

    转自:http://my.oschina.net/xiangtao/blog/28441 网站验证码突然无法显示,并报如下错误. Caused by: java.lang.NoClassDefFoun ...

  2. Action类为何要 extends ActionSupport

    我做的时候,我的action是继承ActionSupport的 Struts 2的Action无须实现任何接口或继承任何类型,普通的POJO类就可以用做Action类,但是,我们为了方便实现Actio ...

  3. 解决Windows 10下Wireshark运行问题

    解决Windows 10下Wireshark运行问题在Windows 10下,安装Wireshark时候,提示WinPcap不被系统系统支持.这是由于最新版的WinPcap 4.1.3只支持到Wind ...

  4. iOS Simulator功能介绍关于Xamarin IOS开发

    iOS Simulator功能介绍关于Xamarin IOS开发 iOS Simulator功能介绍 在图1.38所示的运行效果中,所见到的类似于手机的模型就是iOS Simulator.在没有iPh ...

  5. MBR 基础

    1.简介 MBR,全称为Master Boot Record,即硬盘的主引导记录,它位于整个硬盘的0磁道0柱面1扇区,其主要对硬盘进行了组织,是在驱动器最前端的一段引导扇区. MBR是不属于任何一个操 ...

  6. java中特殊的String类型

    Java中String是一个特殊的包装类数据有两种创建形式: String s = "abc"; String s = new String("abc"); 第 ...

  7. MONO Jexus部署最佳体验

    根据我的测试和得到的反馈意见,目前几个月内开发跨平台的asp.net企业应用,应该在这个范围内进行:mono版本:3.2.8 (或3.2.7)Jexus版本:5.5.1(或5.5)MVC版本:1.2. ...

  8. 【BZOJ】1270: [BeijingWc2008]雷涛的小猫(DP+水题)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1270 这完全是一眼题啊,但是n^2的时间挺感人.(n^2一下的级别请大神们赐教,我还没学多少dp优化 ...

  9. lucene 3.0.2 搜索

    1.lucene 词频 转载:http://mxdxm.iteye.com/blog/989031 lucene in action作为action系列,确实坚持了其实用性的特色.全书花了很大的篇幅来 ...

  10. java命令行参数

    命令行参数就是main方法里面的参数String[] args他就是一个数组,args只是数据类型的一个名称,就是一个数组的变量,名称无所谓,类型没变就行了.这个就是程序的入口点.如图7.4所示: 图 ...