1、SpringBean概述
在Spring中,一切Java对象都被视为Bean,用于实现某个具体功能。 Bean的依赖关系注入的过程,也称为Bean的装配过程。
Bean的装配方式有3种:
- XML配置文件
- 注解
- Java类
Spring中常用的两种装配方式分别是基于XML的装配和基于注解的装配。
2、基于XML的配置
在Spring中,XML配置文件的根元素是<beans>,<beans>元素又包含多个<bean>子元素。每个<bean>子元素可以定义一个Bean,并描述该Bean的装配方式。Bean的常用属性如下表所示。
属 性 | 说 明 |
---|---|
id | Bean的唯一标识,其属性值不能重复,通过id属性值可以配置和管理Bean,也可以获取Bean |
name | Bean的名称标识,可以指定多个名称,每个名称之间用逗号或分号隔开,其他用法与id类似 |
class | 指定Bean的实现类,其属性值为类路径 |
scope | 指定Bean的作用范围,常用的属性值为singleton(单例)和prototype(原型) |
autowire | 指定Bean的自动装配方式,可设置为以下值。 (1)no:默认值,不进行Bean的自动装配。 (2)byName:根据id或name属性值自动装配。 (3)byType:根据属性类型自动装配。 (4)constructor:根据构造方法参数的数据类型进行byType模式的自动装配。 (5)default:由上级<beans>元素的default-autowire属性值确定 |
init-method | Bean的生命周期方法-指定Bean初始化后节点的监控方法 |
destroy-method | Bean的生命周期方法-指定Bean销毁前节点的监控方法 |
分
3、依赖注入
依赖注入(DI)是SpringIOC的具体实现。
在编写程序的过程中,通过控制反转,将对象交给了Spring容器,但是对象和对象之间是存在依赖关系的,IOC只是降低了他们的依赖关系,并不能消除,例如业务层需要调用持久层的方法,控制层需要调用业务层的方法。
在传统的编程中,这种依赖关系需要程序员自己进行维护,在使用Spring之后,就可以交给Spring来进行维护。简单的来说,就是让框架将持久层对象注入到业务层中,而不用程序员自己取获取。这就是依赖注入。
基于XML配置文件,Spring容器提供了两种注入方式:
- setter方法注入
- 构造方法注入
元素 | 说明 |
---|---|
<constructor-arg> | 通过Bean实现类的构造方法的参数设置其属性值,有以下几个属性。 (1)name:指定构造参数名称。 (2)index:指定构造参数序号,从0开始。 (3)type:指定构造参数类型。 (4)ref:设置构造参数值,为一个Bean的引用,即<bean>元素中的id或name属性值。 (5)value:设置构造参数值,为常量值。 此外,ref和value也可以作为其子元素设置构造参数值 |
<property> | 通过Bean实现类中的setter方法设置其属性值, (1)name:指定属性名称。 (2)ref:设置构造参数值,为一个Bean的引用,即<bean>元素中的id或name属性值。 (3)value:设置构造参数值,为常量值。 |
1
3.1、set方式注入
使用setter方法注入时,首先会调用Bean实现类的默认构造方法实例化Bean,然后通过Java的反射机制调用setXxx()方法来注入属性值,大致步骤如下。
- 在Bean的实现类中提供一个默认的无参构造方法(在没有有参构造方法的情况下,可省略),并为所有需要注入的属性提供一个setXxx()方法。
- 在XML配置文件中,通过<beans>元素及其<bean>子元素定义Bean。
- 在<bean>元素内使用<property>子元素注入各个属性的值。
示例:在UserService使用set方式注入userDao的对象,调用userDao的方法;
1.在UserService添加set方法
public class UserService {
//添加的方法, service 调用 dao层
private UserDao ud;
//setter方式注入
public void setUd(UserDao ud) {
this.ud = ud;
}
public void add(){
ud.addUser();
}
}
2.配置spring容器
<bean id="userDao" class="com.yngm.dao.UserDao" ></bean>
<bean id="userService" class="com.yngm.service.UserService">
<!--setter方式进行依赖注入
name:指定 set的属性
ref:设置构造参数值,为一个Bean的引用
-->
<property name="ud" ref="userDao"/>
</bean>
3.2、构造方法注入
构造方法注入是指通过Bean实现类的有参构造方法来注入属性值。
1.创建有参构造方法
public class UserService {
//添加的方法, service 调用 dao层
private UserDao ud;
//有参构造方法
public UserService(UserDao ud) {
this.ud = ud;
}
public void add(){
ud.addUser();
}
}
2、调用有参构造时进行注入
<bean id="userDao" class="com.yngm.dao.UserDao" ></bean>
<bean id="userServiceArgs" class="com.yngm.service.UserService">
<!--构造方法注入
name:指定 set的属性
ref:设置构造参数值,为一个Bean的引用
-->
<constructor-arg name="ud" ref="userDao"/>
</bean>
4、不同数据类型的依赖注入
上面的操作,都是注入的引用Bean,除了对象的引用可以注入,普通数据类型,数组、集合等都可以在容器中进行注入。
注入数据的三种数据类型
● 普通数据类型
● 引用数据类型
● 集合数据类型
4.1、普通数据类型注入
这里的普通数据类型指的是java的基本数据类型和String的类型,请参考如下代码:
public class BubbleTea {
private String drinkName;
private String size;
private String ice;
private String sugar;
//省略setter和getter方法,编写测试的时候需要添加setter方法哦
}
<!--注入奶茶数据-->
<bean id="tea" class="com.yngm.domain.BubbleTea">
<!--通过set方法进行初始化-->
<property name="drinkName" value="伯牙绝弦"/>
<property name="size" value="大杯"/>
<property name="ice" value="热"/>
<property name="sugar" value="不糖"/>
</bean>
4.2、集合类型注入
public class BubbleTea {
//String 类型的集合
private List<String> listStr;
//用户类型的集合
private List<User> listUser;
public void setListUser(List<User> listUser) {
this.listUser = listUser;
}
public void setListStr(List<String> listStr) {
this.listStr = listStr;
}
<bean id="user" class="com.kdf.domain.User">
<property name="name" value="张三"/>
<property name="pwd" value="123"/>
</bean>
<bean name="user1" class="com.kdf.domain.User">
<property name="name" value="里斯"/>
<property name="pwd" value="456"/>
</bean>
<bean id="tea" class="com.kdf.domain.BubbleTea">
<property name="listStr">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
<property name="listUser">
<!--ref bean 引入对象给list集合赋值-->
<list>
<ref bean="user"/>
<ref bean="user1"/>
</list>
</property>
</bean>
4.3、集合类型 Map<String,User>
public class BubbleTea{
//map集合
private Map<String,User> userMap;
public void setUserMap(Map<String, User> userMap) {
this.userMap = userMap;
}
}
<bean id="tea" class="com.kdf.domain.BubbleTea">
<property name="userMap">
<map>
<!--key:自定义map的键, value:赋常量值 value-ref:引用user对象给map赋值-->
<entry key="u1" value-ref="user"/>
<entry key="u2" value-ref="user1"/>
</map>
</property>
</bean>