一、bean基础配置
-
1.1 bean基础配置
- id:bean的id,使用容器可以通过id值找到对应bean,在一个容器中id唯一
- class:bean的类型,配置的全路径类名
1.2 bean别名配置
- name:别名,并且可以提供多个别名
1.3 bean作用域配置
- scope:定义bean的作用番位,可选范围
- singleton:单例
- prototype:非单例
为什么bean默认为单例?
- 适合交给容器进行管理的bean
- 表现层对象
- 业务层对象
- 数据层对象
- 工具对象
- 不适合交给容器进行管理的bean
- 封装实体的域对象
二、实例化bean的方法
-
2.1 bean实例化-构造方法
默认方式
2.2 bean实例化-静态工程
工厂:public class OrderDaoFactory {
public static OrderDao getOrderDao() {
return new OrderDaoImpl();
}
}
配置:<bean
id="orderDao"
factory-method="getOrderDao"
class="xx.xx.OrderDaoFactory"
/>
2.3 bean实例化-实例工厂与FactoryBean
2.3.1
实例工厂:public class UserDaoFactory {
public UserDao getUserDao() {
return new UserDaoImpl();
}
}
配置:<bean
id="userDaoFactory"
class="xx.xx.UserDaoFactory"
/>
<bean
id="UserDao"
factory-method="getUserDao"
factory-bean="userDaoFactory"
/>
2.3.2
FactoryBean:public class UserDaoFactoryBean impl FactoryBean<UserDao> {
public UserDao getObject() {
return new UserDaoImpl();
}
public Class<?> getObjectType() {
return UserDao.class;
}
}
配置:<bean
id="userDao"
class="xxxx.UserDaoFactoryBean"
/>
五、bean的生命周期
-
5.1 生命周期控制方法
5.1.1 提供生命周期控制方法
|
5.1.2 配置生命周期控制的方法
|
5.1.3 接口控制
实现InitializingBean
、DisposableBean
接口。
5.2 bean生命周期过程
- 容器初始化
- 创建对象(内存分配)
- 执行构造方法
- 执行属性注入(set)
- 执行bean初始化方法
- 使用bean
- 执行业务操作
- 关闭/销毁容器
- 执行bean销毁方法
5.3 销毁机制
- 容器关闭前出发bean的销毁
- 关闭容器方式
- 手工关闭容器
ConfigurableApplicationContext
接口close()
操作 - 注册关闭钩子,在虚拟机退出前关闭容器,在关闭虚拟机
ConfigurableApplicationContext
接口registerShutdownHook()
操作
- 手工关闭容器
六、依赖注入
-
6.1 分析
- 向一个类中传递数据的方式有
- 普通方法(set)
- 构造方法
- 依赖注入描述了在容器中建立bean与bean之间依赖关系的过程,如果bean运行需要数字或字符串?
- 引用类型
- 简单类型
- 依赖注入方式
- setter注入
- 构造器注入
6.2 简单类型注入
在bean中定义类型属性并提供
set
方法private int number;
public void setNumber(int number) {
this.number = number;
}配置中使用
prototype
标签value
属性注入简单类型数据<bean id="bookDao" class="xxxx.BookDaoImpl">
<property name="number" value="10"/>
</bean>
6.3 构造器注入
在bean中定义引用类型属性提供可访问的构造方法
private BookDao bookDao;
public BookDaoImpl(BookDao bookDao) {
this.bookDao = bookDao;
}配置中使用
constructor-arg
标签ref
属性注入引用类型对象<bean id="bookService" class="xxxx.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
<constructor-arg type="String" value="1"/>
<constructor-arg index="0" value="1"/>
</bean>
6.4
- 强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现
- 可选依赖使用setter进行注入,灵活性强
- spring提倡使用构造器
- 如果有必要可以使用两者同时注入
- 实际开发中根据实际情况
- 推荐使用setter注入
七、依赖自动装配
-
- IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程
自动装配方式
- 按类型
- 按名称
- 按构造方法
- 不启动自动装配
配置中使用bean标签
autowire
属性设置自动装配的类型<bean id="bookDao" class="xxxx.BookDaoImpl"/>
<bean id="bookService" class="xxxx.BookServiceImpl" autowire="byName"/>
7.1 特征
- 自动装配用于引用类型依赖注入,不能对简单类型进行操作
- 使用按类型装配时,必须保障容器中相同类型的bean唯一
- 使用按名称装配时,必须保障容器中具有指定名称的bean
- 自动装配优先级低于setter注入和构造器注入
八、集合注入
-
- 数组: array-value
- list: list-value
- set: list-value
- map: map-entry-key-value
- properties: props-prop-key
九、加载properties
-
- 开启context命名空间
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd - 使用context命名空间,加载指定properties, 不加载系统属性,加载properties文件标准格式
<context:property-placeholder location="jdbc.properties"/>
<context:property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/> - 使用
${}
读取加载的属性值<property name="username" value="${jdbc.username}" />
十、容器
-
10.1 创建容器
- 方式一:类路径加载
ApplicationContext ctx = new ClassPathXmlApplicationContext("xxx");
- 方式二:文件路径加载
ApplicationContext ctx = new FileSystemXmlApplicationContext("xxx");
- 方式三:加载多个配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("xxx.xml", "yyy.xml");
10.2 创建bean
- 方式一:使用bean名称获取
BookDao bookDao = (BookDao)ctx.getBean("bookDao");
- 方式二:使用bean名称获取并指定类型
BookDao bookDao = ctx.getBean("bookDao", BookDao.class);
- 方式三:使用bean类型获取
BookDao bookDao = ctx.getBean(BookDao.class);