Spring的Bean属性依赖注入
- 属性依赖注入的三种方式
什么是Bean属性的注入?就是对一个对象的属性赋值。有三种方式:
- 第一种:构造器参数注入
- 第二种:setter方法属性注入(setter方法的规范需要符合JavaBean规范)
- 第三种:接口注入
Spring 框架规范中通过配置文件配置的方式,只支持构造器参数注入和setter方法属性注入,不支持接口注入 !
- 构造器参数注入 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>
- 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);
}
【扩展】
- <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属性依赖注入相关推荐
- Spring核心——Bean的依赖注入
依赖注入 在设计模式与IoC这篇文章中,介绍了Spring基础的三大支柱的两项内容--IoC.Bean.本篇将继续围绕着Bean的创建时的注入方式来介绍Spring的核心思想与设计模式. 天底下所有面 ...
- 采用Spring管理Bean和依赖注入
1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] ApplicationContext ctx ...
- Spring注解开发-属性依赖注入指定名称的bean
1.@Autowired它默认是根据类型进行注入.多个IUserDao会报错. 如果与@Qualifier一起使用,就可以根据名称来进行注入. 2.也可以使用下面的方式来根据名称进行属性注入:
- Spring注解开发-属性依赖注入
1.简单的属性注入.无需增加get/set方法 注意:@Value @Autowired它们可以修饰属性,也可以修饰setter方法,如果写在属性上,就不需要提供setter方法. 2.复杂的属性注入 ...
- AbstractAutoWireCapableBeanFactory 对Bean 实例进行属性依赖注入
应用第一次通过getBean()方法(配置了lazy-init 预实例化属性的除外)向IOC 容器索取Bean 时,容器创建Bean 实例对象, 并且对Bean 实例对象进行属性依赖注入,Abstra ...
- Spring(二)--------Spring配置、DI依赖注入、Bean自动装配
Spring(二)--------Spring配置.DI依赖注入.Bean自动装配 5.Spring配置 5.1 别名 设置别名:第一种方式alias <!--其中name为ID的对应值--&g ...
- 一步一步手绘Spring DI运行时序图(Spring 自动装配之依赖注入)
相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...
- 回客科技 面试的 实现ioc 容器用到的技术,简述BeanFactory的实现原理,大搜车面试的 spring 怎么实现的依赖注入(DI)...
前言:这几天的面试,感觉自己对spring 的整个掌握还是很薄弱.所以需要继续加强. 这里说明一下spring的这几个面试题,但是实际的感觉还是不对的,这种问题我认为需要真正读了spring的源码后说 ...
- Spring的核心机制依赖注入简介
Spring能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的管理下有机地协调.运行.Spring将各层的 ...
最新文章
- 麦咭早教机器人_号外|「2019第一站」麦咭亮相香港国际授权展!
- cms监控android,CMSV9道路监控终端
- 图像处理技术之分辨率与压缩
- 给apm换一个软件源
- js日期操作,某天的N天后,一个月后的日期
- Flutter OverflowBox溢出容器
- js中this理解。
- 统计年鉴29份3种格式混合
- Echarts 地图基本使用
- android 消息推送js,消息推送方式
- 知识图谱问答 | (3) 关系分类概述
- 公告或通知的未读 设计(MySQL Redis)
- 2017,知识与财富
- cocos2d-x的初步学习二十之坦克大战七
- Proxy SwitchyOmega安装和使用
- 决策树(Decision Tree)算法原理总结(一)
- ts没有与此调用匹配的重载
- C 练习4-7 求e的近似值 (15 分)
- java中获取当前一周日期和上周下周日期当前周数
- 北京大学 李胜 计算机,rasterization-北京大学计算机系图形与交互技术室.pdf
热门文章
- SE 2014 年4月21日(二)
- 软工结对项目之词频统计update
- CentOS7编译安装libc++和libc++abi
- 博客十年,感谢有你!
- C#中Thread.sleep()
- IE报告“存储空间不足,无法完成此操作”的原因
- linux 间隔时间中断测试
- 计算机网络原理填空题
- SQL函数学习 之 DENSE_RANK() OVER (PARTITION BY col2 ORDER BY col3 DESC) AS seq
- 当有脚本错误时,停止运行。