Spring中的Bean配置

Spring中的Bean配置

一.内容提要

  • IOC & DI 概述
  • 配置bean:
  1. 配置形式:基于XML文件的方式;基于注解的方式
  2. Bean的配置方式:通过全类名(反射)、通过工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean
  3. IOC 容器 BeanFactory & ApplicationContext 概述
  4. 依赖注入的方式:属性注入;构造器注入
  5. 注入属性值细节
  6. 自动转换
  7. bean 之间的关系:继承;依赖
  8. bean 的作用域:singleton;prototype;WEB 环境作用域
  9. 使用外部属性文件
  10. spEL
  11. IOC 容器中 Bean 的生命周期
  12. Spring 4.x 新特性:泛型依赖注入

 

二.IOC 和 DI

  • IOC(Inversion of Control):其思想是反转资源获取的方向.传统的资源查找方式要求组件向容器发起请求查找资源.作为回应,容器适时的返回资源.而应用了IOC之后,则是容器主动地讲资源推给它所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源.这种行为也被称为查找的被动形式.
  • DI(Dependency Injection)一IOC的另一种表达方式:既组件以一些预先定义好的方式(例如:setter方法)接收来自如容器的资源注入.相对于IOC而言,这种表述更直接

 

三.在Spring的IOC容器里配置Bean

  • 在xml文件中通过bean节点来配置bean
    <!-- 通过全类名的方式来配置bean -->
        <bean id="helloWorld" class="com.yangxiao.spring.beans.HelloWorld">
        </bean>
  • id:Bean的名称

  1. 在IOC容器中必须是唯一的
  2. 若id没有指定,Spring自动将权限定性类名作为Bean的名字
  3. id可以指定多个名字,名字之间可用逗号、分号、或空格分隔

 

四.Spring容器

  • 在Spring IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化,只有在容器实例化后,才可以从IOC容器里获取Bean实例并使用.
  • Spring提供了两种类型的IOC容器实现
  1. BeanFactory IOC容器的基本实现
  2. ApplicationContext提供了更多的高级特性,是BeanFactory的子接口
  3. BeanFactory是Spring 框架的基础设置,面向Spring本身;ApplicationContext面向使用 Spring框架的开发者,几乎所有的应用场合都直接使用ApplicationContext而非底层的BeanFactory
  4. 无论使用何种方式,配置文件是相同的

 

五.ApplicationContext

  • ApplicationContext的主要实现类:
  1. ClassPathXmlApplicationContext:从类路径下加载配置文件
  2. FileSystemXmlApplicationContext:从文件系统中加载配置文件
  • ConfigurableApplicationContext扩展于ApplicationContext,新增加两个只主要方法:refresh()和close(),让ApplicationContext具有启动、刷新和关闭上下文的能力
  • ApplicationContext在初始化上下文时就实例化所有单例的Bean
  • WebApplicationContext是专门为WEB应用而准备的,它允许从相对于WEB根目录的路径中完成初始化工作

 

六.依赖注入的方式

  • Spring支持3中依赖注入的方式
  1. 属性注入
  2. 构造器注入
  3. 工厂方法注入(很少使用,不推荐) 

 

  属性注入

  • 属性注入即通过setter 方法注入Bean 的属性值或依赖的对象
  • 属性注入使用<property>元素,使用name属性指定Bean的属性名称,value属性或<value>子节点指定属性值
  • 属性注入式实际应用中最常用的注入方式

 

     构造方法注入

  • 通过构造方法注入Bean 的属性值或依赖的对象,它保证了Bean 实例在实例化后就可以使用.
  • 构造器注入在<constructor-arg>元素里声明属性,<constructor-arg>中没有那么属性

 

  字面值

  • 字面值:可用字符串表示的值,可以通过<value>元素标签或value属性进行注入.
  • 基本数据类型及其封装类、String等类型都可以采取字面值注入的方式.
  • 若字面值中含特殊字符,可以使用<![CDATA[]]>把字面值包裹起来

 

  引用其它Bean

  • 组成应用程序的Bean经常需要相互协作以完成应用程序的功能,要使Bean能够相互访问,就必须在Bean配置文件中指定对Bean的引用
  • 在Bean的配置文件中,可以通过<ref>元素或ref属性为Bean的属性或构造器参数指定对Bean的引用
  • 也可以在属性或构造器里包含Bean的声明,这样的Bean称为内部Bean.

 

  注入参数详解:null值和级联属性

  • 可以使用专用的<null/>元素标签为Bean的字符串或其它对象类型的属性注入null值
  • 和Strusts、Hibernate等框架一样,Spring支持级联属性的配置. 

 

  集合属性

  • 在Spring中可以通过一组内置的xml标签(例如:<list>,<set>或<map>)来配置集合属性.
  • 配置java.util.List类型的属性,需要指定<list>标签,在标签里包含一些元素,这些标签可以通过<value>指定简单的常量值,通过<ref>指定对其他Bean的引用,通过<bean>指定内置Bean定义,通过<null/>指定空元素,甚至可以内嵌其他集合.
  • 数组的定义和List一样,都是用<list>
  • 配置java.util.Set需要使用<set>标签,定义元素的方法与List一样

 

  • Java.util.Map通过<map>标签定义,<map>标签里可以使用多个<entry>作为字标签.每个条目包含一个键和一个值
  • 必须在<key>标签里定义键
  • 因为键和值的类型没有限制,所以可以自由地位它们指定<value>,<ref>,<bean>或<null>元素
  • 可以将Map的键和值作为<entry>的属性定义:简单常量使用key和value来定义;Bean引用通过key-ref和value-ref属性定义
  • 使用<props>定义java.util.Properties,该标签使用多个<prop>作为子标签,每个<prop>标签必须定义key属性

 

  使用utility scheme 定义集合

  • 使用基本的集合标签定义集合时,不能将集合作为独立的Bean定义,导致其他Bean无法引用该集合,所以无法在不同Bean之间共享集合
  • 可以使用util schema 里的几个标签定义独立的集合Bean.需要注意的是,必须在<beans>根元素里添加util schema 定义

 

  使用p命名空间

  • 为了简化XML文件的配置,越来越多的XML文件采用属性而非子元素配置信息.
  • Spring从2.5版本开始引入一个新的p命名空间,可以通过<bean>元素属性的方式配置Bean的属性.
  • 使用p命名空间后,基于XML的配置方式将进一步简化

 

七.自动装配

  XML配置里的 Bean 自动装配

  • SpringIOC 容器可以自动装配Bean.需要做的仅仅是在<bean>的autowire属性里指定自动装配的模式
  • byType(根据类型自动装配):若IOC容器中有多个与目标Bean类型一致的Bean,在这种情况下,Spring将无法判定哪个Bean最合适该属性,在这种情况下,Spring将无法判定哪个Bean最合适该属性,所以不能执行自动装配.
  • byName(根据名称自动装配):必须将目标Bean的名称和属性设置的完全相同
  • constructor(通过构造器自动装配):当Bean中存在多个构造器时,此种自动装配方式将会很复杂,不推荐使用.

 

  自动装配的缺点

  • 在Bean配置文件里设置autowire属性进行自动装配将会装配Bean的所有属性,然而,若只希望装配个别属性时,autowire属性就不够灵活了.
  • autowire属性要么根据类型自动装配,要么根据名称自动装配,不能两者兼而有之.
  • 一般情况下,在实际的项目中很少使用自动装配功能,因为和自动装配功能所带来的好处比起来,明确清晰的配置文档更有说服力一些.

 

八.继承 Bean 配置

  • Spring允许继承 bean 的配置,被继承的bean称为父bean.继承这个父 Bean 的 Bean 称为子 Bean
  • 子Bean 从父Bean 中继承配置,包括Bean 的属性配置
  • 子Bean也可以覆盖从父Bean 继承过来的配置
  • 父Bean可以作为配置模板,也可以作为Bean实例.若只想把父Bean作为模板,可以设置<bean>的abstract属性为true,这样Spring将不会实例化这个Bean
  • 并不是<bean>元素里的所有属性都会被继承,比如:autowire,abstract等
  • 可以忽略父Bean 的 class 属性,让子Bean 指定自己的类,而共享相同的属性配置,但此时abstract必须设为true

 

  依赖Bean配置

  • Spring允许用户通过depends-on 属性设定Bean前置依赖的Bean,前置依赖的Bean 会在本Bean 实例化之前创建好
  • 如果前置依赖于多个Bean,则可以通过逗号,空格或的方式配置Bean 的名称

 

九.使用外部属性文件

  • 在配置文件里配置Bean 时,有时需要在Bean 的配置混入系统部署的细节信息(例如:文件的路径,数据源配置信息等),而这些部署细节实际上需要和Bean配置相分离
  • Spring 提供了一下PropertyPlaceholderConfigurer的BeanFactory后置处理器,这个处理器允许用户将Bean配置的部分内容外移到属性文件中.可以在Bean配置文件里使用形式为${var}的变量,PropertyPlaceholderConfigurer从属性文件里加载属性,并使用这些属性来替换变量.
  • Spring还允许在属性文件中使用${propName},以实现属性之间的相互引用.

 

十.Spring表达式语言:SpEL

  • Spring表达式语言(简称SpEL):是一个支持运行时查询和操作对象图的强大的表达式语言.
  • 语法类似于EL:SpEL使用#{...}作为定界符,所有在大括号中的字符都将被认为是SpEL
  • SpEL为bean 的属性进行动态赋值提供了便利
  • 通过SpEL可以实现:
  1. 通过bean 的id 对bean 进行引用
  2. 调用方法以及引用对象中的属性
  3. 计算表达式的值
  4. 正则表达式的匹配    

                  

posted @ 2017-04-13 01:13  Young_Yang_Yang  阅读(2454)  评论(0编辑  收藏  举报