Spring--入门第一天

一、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 的生命周期进行管理的过程:

  1. 通过构造器或工厂方法创建 Bean 实例(调用构造器)
  2. 为 Bean 的属性设置值和对其他 Bean 的引用(调用setter方法)
  3. 调用 Bean 的初始化方法 (调用配置文件中配置的init-method)
  4. 使用bean
  5. 当容器关闭时, 调用 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 的生命周期进行管理的过程:

  1. 通过构造器创建 Bean 实例
  2. 为 Bean 的属性设置值和对其他 Bean 的引用
  3. 将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法
  4. 调用 Bean 的初始化方法
  5. 将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法
  6. 使用Bean 
  7. 当容器关闭时, 调用 Bean 的销毁方法
原文地址:https://www.cnblogs.com/realshijing/p/7942658.html