1. 属性依赖注入的三种方式

什么是Bean属性的注入?就是对一个对象的属性赋值。有三种方式:

  1. 第一种:构造器参数注入
  2. 第二种:setter方法属性注入(setter方法的规范需要符合JavaBean规范)
  3. 第三种:接口注入

Spring 框架规范中通过配置文件配置的方式,只支持构造器参数注入和setter方法属性注入,不支持接口注入 !

  1. 构造器参数注入 constructor-arg

【示例】

第一步:构造器参数注入属性值。

创建包com.igeek.xmlpropertydi,创建Car类,定义构造方法

//目标,构造器参数注入,new car直接将参数的值直接赋值

public class Car {

private Integer id;

private String name;

private Double price;

//有参构造

public Car(Integer id, String name, Double price) {

this.id = id;

this.name = name;

this.price = price;

}

//取值要用getter

public Integer getId(){

return this.id;

}

public String toString() {

return "Car [id=" + id + ", name=" + name + ", price=" + price + "]";

}

}

第二步:配置applicationContext.xml

<!-- 构造器注入属性的值 -->

<bean id="car" class="com.igeek.xmlpropertydi.Car">

<!--constructor-arg:告诉spring容器,要调用有参构造方法了,不再调用默认的构造方法了

new Car(1,"宝马",99999d)

参数第一组:定位属性

* index:根据索引定位属性,0表示第一个位置

* name:根据属性参数名称定位属性

* type:根据属性数据类型定位属性

参数第二组:值

* value:简单的值,字符串

* ref:复杂的(由spring容器创建的bean对象)

-->

<!-- <constructor-arg index="0" value="1"/> -->

<constructor-arg index="0" name="id" value="1"/>

<!-- <constructor-arg name="name" value="宝马1代"/> -->

<constructor-arg name="name" >

<value>宝马2代</value>

</constructor-arg>

<constructor-arg type="java.lang.Double" value="99999d"/>

</bean>

第三步:使用SpringTest.java测试:

@Test

public void test(){

//spring容器

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

//获取car

Car car =(Car) applicationContext.getBean("car");

System.out.println(car);

}

【补充】

1.定位属性的标签,可以混用

<constructor-arg index="0" name="id" value="1"/>

2.自标签的属性赋值问题,可以使用子标签的value,效果和value属性一样

<constructor-arg name="name" value="宝马1代"/>

等同于

<constructor-arg name="name" >

<value>宝马2代</value>

</constructor-arg>

  1. setter方法属性注入 property

使用的默认的构造器(new Bean()),但必须提供属性的setter方法,使用setter方法也是企业经常使用的属性注入方式。

两步:在类中加入setter方法,在配置文件中使用<property>

【示例】

第一步:创建Person.java,定义id、name、car属性

/**

* 定义人类

* setter方法属性注入

* 相当于new Person();

*/

public class Person {

private Integer id;

private String name;

private Car car;

//必须提供setter属性方法

public void setId(Integer id) {

this.id = id;

}

public void setName(String name) {

this.name = name;

}

public void setCar(Car car) {

this.car = car;

}

@Override

public String toString() {

return "Person [id=" + id + ", name=" + name + ", car=" + car + "]";

}

}

第二步:配置spring容器applicationContext.xml

<!-- setter方法属性注入:调用默认构造器,相当于new Person() -->

<bean id="person" class="com.igeek.xmlpropertydi.Person">

<!--

property:专门进行setter属性注入用的标签 。

* name:setter方法的属性的名字,例如SetXxx-那么name的属性值为xxx

* value:简单的值

* ref:bean的名字,对象的引用

-->

<property name="id" value="1001"/>

<property name="name" value="Tom"/>

<!-- <property name="car" ref="car"/> --><!--等同于-->

<property name="car">

<ref bean="car"/>

</property>

</bean>

第三步:使用SpringTest.java测试:

@Test

public void test1(){

//spring容器

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

//获取人

Person person=(Person)applicationContext.getBean("person");

System.out.println(person);

}

【扩展】

  1. <ref>标签的用法:

<!-- <property name="car" ref="car"/> -->

<!--等同于-->

<property name="car">

<ref bean="car"/>

</property>

2.深入理解setter方法的属性注入

抛出问题:<property name="name" value="关羽"/>里面的name,是不是必须和类中的private String name;的name一致才可以呢?能不一样么?

可以的!

修改Person.java类。

public class Person {

private Integer id;

private String pname;//其中pname和setName方法的属性不一致,而<property name="name" value="关羽"/>其中的name属性的值指的是setName()的属性名称。

private Car car;

//必须提供setter属性方法

public void setId(Integer id) {

this.id = id;

}

public void setName(String name) {

this.pname = name;

}

public void setCar(Car car) {

this.car = car;

}

public String toString() {

return "Person [id=" + id + ", pname=" + pname + ", car=" + car + "]";

}

}

Spring的Bean属性依赖注入相关推荐

  1. Spring核心——Bean的依赖注入

    依赖注入 在设计模式与IoC这篇文章中,介绍了Spring基础的三大支柱的两项内容--IoC.Bean.本篇将继续围绕着Bean的创建时的注入方式来介绍Spring的核心思想与设计模式. 天底下所有面 ...

  2. 采用Spring管理Bean和依赖注入

    1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] ApplicationContext ctx ...

  3. Spring注解开发-属性依赖注入指定名称的bean

    1.@Autowired它默认是根据类型进行注入.多个IUserDao会报错. 如果与@Qualifier一起使用,就可以根据名称来进行注入. 2.也可以使用下面的方式来根据名称进行属性注入:

  4. Spring注解开发-属性依赖注入

    1.简单的属性注入.无需增加get/set方法 注意:@Value @Autowired它们可以修饰属性,也可以修饰setter方法,如果写在属性上,就不需要提供setter方法. 2.复杂的属性注入 ...

  5. AbstractAutoWireCapableBeanFactory 对Bean 实例进行属性依赖注入

    应用第一次通过getBean()方法(配置了lazy-init 预实例化属性的除外)向IOC 容器索取Bean 时,容器创建Bean 实例对象, 并且对Bean 实例对象进行属性依赖注入,Abstra ...

  6. Spring(二)--------Spring配置、DI依赖注入、Bean自动装配

    Spring(二)--------Spring配置.DI依赖注入.Bean自动装配 5.Spring配置 5.1 别名 设置别名:第一种方式alias <!--其中name为ID的对应值--&g ...

  7. 一步一步手绘Spring DI运行时序图(Spring 自动装配之依赖注入)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  8. 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)...

    前言:这几天的面试,感觉自己对spring 的整个掌握还是很薄弱.所以需要继续加强. 这里说明一下spring的这几个面试题,但是实际的感觉还是不对的,这种问题我认为需要真正读了spring的源码后说 ...

  9. Spring的核心机制依赖注入简介

    Spring能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的管理下有机地协调.运行.Spring将各层的 ...

最新文章

  1. 麦咭早教机器人_号外|「2019第一站」麦咭亮相香港国际授权展!
  2. cms监控android,CMSV9道路监控终端
  3. 图像处理技术之分辨率与压缩
  4. 给apm换一个软件源
  5. js日期操作,某天的N天后,一个月后的日期
  6. Flutter OverflowBox溢出容器
  7. js中this理解。
  8. 统计年鉴29份3种格式混合
  9. Echarts 地图基本使用
  10. android 消息推送js,消息推送方式
  11. 知识图谱问答 | (3) 关系分类概述
  12. 公告或通知的未读 设计(MySQL Redis)
  13. 2017,知识与财富
  14. cocos2d-x的初步学习二十之坦克大战七
  15. Proxy SwitchyOmega安装和使用
  16. 决策树(Decision Tree)算法原理总结(一)
  17. ts没有与此调用匹配的重载
  18. C 练习4-7 求e的近似值 (15 分)
  19. java中获取当前一周日期和上周下周日期当前周数
  20. 北京大学 李胜 计算机,rasterization-北京大学计算机系图形与交互技术室.pdf

热门文章

  1. SE 2014 年4月21日(二)
  2. 软工结对项目之词频统计update
  3. CentOS7编译安装libc++和libc++abi
  4. 博客十年,感谢有你!
  5. C#中Thread.sleep()
  6. IE报告“存储空间不足,无法完成此操作”的原因
  7. linux 间隔时间中断测试
  8. 计算机网络原理填空题
  9. SQL函数学习 之 DENSE_RANK() OVER (PARTITION BY col2 ORDER BY col3 DESC) AS seq
  10. 当有脚本错误时,停止运行。