一、bean之间的关系
1)bean的继承配置:
使用bean的parent属性指定继承哪个bean的配置;此时可以不用配置父类中已有的属性配置。并不是 <bean> 元素里的所有属性都会被继承. 比如: autowire, abstract 等
<bean id="address1" class="yang.mybatis.test.Address" p:city="BeiJing" p:street="TianAnMen" ></bean> <bean id="address2" p:street="ZhongGuanCun" parent="address1"></bean>
抽象bean可以不指定class属性,抽象bean bean的abstract=“true”的bean,这样的bean不能被IOC容器实例化,只能用来被继承。
2)depends-on 依赖配置
depend-on用来表示一个Bean的实例化依靠另一个Bean先实例化,如果在一个bean A上定义了depend-on B那么就表示:A 实例化前先实例化 B。
二、Bean的作用域
在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域.
默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实例, 整个 IOC 容器范围内都能共享该实例:所有后续的 getBean() 调用和 Bean 引用都将返回这个唯一的 Bean 实例.该作用域被称为 singleton, 它是所有 Bean 的默认作用域.在创建IOC容器时bean被实例化,调用其构造方法。
类别 | 说明 |
singleton | 在SpringIOC 容器中仅存在一个Bean实例,Bean以单实例的方式存在 |
prototype | 每次调用getBean()时都会返回一个新的实例 |
request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 |
session | 同一个HTTP Session共享一个Bean,不同的HTTP Session使用不同的Bean.该作用域仅适用于WebApplicationcontext环境 |
三、使用外部属性文件
Spring 提供了一个 PropertyPlaceholderConfigurer 的 BeanFactory 后置处理器, 这个处理器允许用户将 Bean 配置的部分内容外移到属性文件中. 可以在 Bean 配置文件里使用形式为 ${var} 的变量, PropertyPlaceholderConfigurer 从属性文件里加载属性, 并使用这些属性来替换变量.
注册 PropertyPlaceholderConfigurer
- Spring 2.0:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="db.properties"></property> </bean>
- Spring 2.5 之后:
可通过 <context:property-placeholder> 元素简化:
<beans> 中添加 context Schema 定义xmlns:context="http://www.springframework.org/schema/context"
在配置文件中加入如下配置:
<!--引入文件 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 数据库连接池,使用dbcp --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> classpath类路径下的db.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8 jdbc.username=root jdbc.password=1234
四、Spring 表达式语言(简称SpEL):
是一个支持运行时查询和操作对象的强大的表达式语言。语法类似于 EL:SpEL 使用 #{…} 作为定界符,所有在大框号中的字符都将被认为是 SpEL
SpEL 为 bean 的属性进行动态赋值提供了便利
- 通过 SpEL 可以实现:
- 通过 bean 的 id 对 bean 进行引用
- 调用方法以及引用对象中的属性
- 计算表达式的值
- 正则表达式的匹配
字面量的表示:
整数:<property name="count" value="#{5}"/> 小数:<property name="frequency" value="#{89.7}"/> 科学计数法:<property name="capacity" value="#{1e4}"/> Boolean:<property name="enabled" value="#{false}"/>
引用其他对象
<!--通过value属性和SpEL配置Bean之间的引用关系--> <property name="car" value="#{car}"></property>
引用其他对象的属性
<!--通过value属性和SpEL配置一个Bean的属性值为另一个Bean的属性值--> <property name="carPrice" value="#{car.price}"></property>
调用其他方法,还可以链式操作
<property name="carPrice" value="#{car.price.toString().toUpperCase}"></property>
调用静态方法或静态属性:通过 T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性:
<property name="initValue" value="#{T(java.lang.Math).PI}"></property>
五、OC 容器中Bean 的生命周期
Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务.
Spring IOC 容器对 Bean 的生命周期进行管理的过程:
- 通过构造器或工厂方法创建 Bean 实例(调用构造器)
- 为 Bean 的属性设置值和对其他 Bean 的引用(调用setter方法)
- 调用 Bean 的初始化方法 (调用配置文件中配置的init-method)
- 使用bean
- 当容器关闭时, 调用 Bean 的销毁方法(调用配置文件中配置的destory-method)
在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法.同时Bean类中设置这两个方法
<bean id="address" class="yang.mybatis.test.Address" init-method="init" destroy-method="destory" p:city="BeiJing" p:street="TianAnMen"/>
六、创建 Bean 后置处理器
Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理.
Bean 后置处理器对 IOC 容器里的所有 Bean 实例逐一处理, 而非单一实例. 其典型应用是: 检查 Bean 属性的正确性或根据特定的标准更改 Bean 的属性.
创建自定义后置处理器, 需要实现接口(org.springframework.bean.config.BeanPostProcessor). 在初始化方法被调用前后, Spring 将把每个 Bean 实例分别传递给上述接口的以下两个方法:
// init 方法之后调用 postProcessAfterInitialization(java.lang.Object bean, java.lang.String beanName) //init 方法之前调用 postProcessBeforeInitialization(java.lang.Object bean, java.lang.String beanName)
bean:bean实例名字
beanName:IOC容器配置的id
在Spring配置文件中配置自定义Bean后置处理器
<bean class="自定义后置处理器的全路径名"></bean>
添加 Bean 后置处理器后 Bean 的生命周期
Spring IOC 容器对 Bean 的生命周期进行管理的过程:
- 通过构造器创建 Bean 实例
- 为 Bean 的属性设置值和对其他 Bean 的引用
- 将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
- 调用 Bean 的初始化方法
- 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
- 使用Bean
- 当容器关闭时, 调用 Bean 的销毁方法