Bean的装配(笔记)

主要内容
  • 声明Bean
  • 注入Bean属性
  • 表达式装配
依赖注入的本质是 装配(wiring)。装配其实就是创建应用对象之间协作关系的行为,通俗的讲:就是各个类之间传递数据,对象引用。

1. 声明Bean


      声明Bean首先需要先了解Spring的配置。

1.1 Spring配置

Spring是一个基于容器的框架,如果没有配置Spring,那么它就是一个空的容器。Spring 3.0 开始,提供了两种配置Bean的方式。
  1. 传统上,Spring使用一个或多个XML文件作为配置文件;
  2. 基于java注解的配置方式。(Spring 3.0 后支持的,这一章不会讲解)

先了解下Spring的配置文件。

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	
	<!-- Bean 定义在这 -->
</beans>


在标签内,可以放置Spring所有的配置信息,包括元素的声明。但是beans不是唯一的Spring的命名空间。Spring框架自带的多种XML命名空间,通过这些命名空间可以配置Spring容器

命名空间
用途
aop 为声明切面以及将@AspectJ注解的类代理为Spring切面提供了配置元素
beans 支持声明Bean和装配Bean,是Spring最核心也是最原始的命名空间
context 为配置Spring应用上下文提供了配置元素,包括自动检测和自动装配Bean,注入非Spring直接管理的对象
jee 提供了与Java EE API的集成,例如JNDI和EJB
jms 为声明消息驱动的POJO提供了配置元素
lang 支持配置由Groovy, JRuby,货BeanShell等脚本实现的Bean
mvc 启用Spring MVC的能力,例如面向注解的控制器,视图控制器和拦截器
oxm 支持Spring的对象到XML映射配置
tx 提供声明试事务配置
util 提供各种各样的工具类元素,包括把集合配置为Bean,支持属性占位符元素


同样,很多的命名空间我们暂时没有接触到,这里先了解清楚<beans>命名空间。

1.2 通过构造器注入Bean

在说构造器之前,先讲下声明
 

声明id和对应的class类通过构造器注入,前提是构造器能够接受参数。如下:

public class Juggler implemnets Performer {
  private int beanBags = 3;

  public Juggler(){}

  public Juggler(int beanBags){
     this.beansBags = beanBags;
  }

  ·····
}

Juggler类有两个构造函数,默认构造函数不接受任何参数;另外则是接收一个int型的参数。为了调用带参数的构造函数,需要传递一个参数。因此在配置文件中,声明应以下面的形式: 通过constructor-arg设置构造函数参数。这样就调用了带参数的构造函数。
  • 通过构造器注入对象引用

如果构造函数的参数除了基本的类型,还带有其它的类型,比如,自定义的类名。即对象引用。bean的声明就必须做稍微的改变:

<!--首先需要先声明引用的对象为spring<bean>,假设我需要引用Sonnet29-->
<bean id="sonnet29" class="com.springinaction.springidol.Sonnet29" />

<!--与之前的构造函数的稍微有点差别-->
<bean id="poeticDuke" class="com.springinaction.springidol.PoeticJuggler">
    <constructor-arg value="15"/>
    <constructor-arg ref="sonnet29"/>
</bean>

上面的代码所执行的逻辑本质上与以下java代码相同:

Poem sonnet29 = new Sonnet29();
Performer duke = new PoticJuggler(15, sonnet29);

  • 通过工厂创建Bean

有时候静态工厂是实例化对象的唯一方法。Spring支持通过<bean>元素的factory-method属性来装配工厂创建Bean。

public class Stage{
  private Stage(){
  }

  private static class StageSingletonHolder {
      static Stage instance = new Stage();  //延迟加载实例
  }
  
  private static Stage getInstance() {
      return StageSingletonHolder.instance;  //返回实例
  }
}

由于Stage没有公开的构造方法,而是通过调用静态方法getInstance()返回实例(出于线程安全的考虑,使用了一种称为“Initialization-on-demand holder”的技术,具体请查看http://chenjianjx.iteye.com/blog/1839117)。因此我们可以用如下方法,进行配置:
 

1.3 Bean作用域

默认情况下,所有的Spring Bean都是单例。当容器分配一个Bean时,总返回的是同一个实例。在<bean>配置时,Spring支持声明Bean的作用域。通过配置Bean的scope属性,设置作用域。默认情况下,scope的属性设置为singleton,但是如果需要每次请求时产生一个新的Bean实例,则需要设置为prototype。除此之外,还包括以下几个作用域选项:

作用域
描述
singleton 一个bean定义对应一个对象实例。
prototype 一个bean定义对应多个对象实例。
request 在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext 情形下有效。
session 在一个HTTP Session 中,一个bean定义对应一个实例。该作用域仅在基于web的SpringApplicationContext 情形下有效。
global-session 在一个全局的HTTP Session 中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext 情形下有效。

具体细节,可以参考:http://blog.csdn.net/feihong247/article/details/7798474

2. 注入Bean属性

简单的讲,其实注入Bean属性,就相当于调用Bean中的setter函数,和<bean>中的构造器注入差不多。
  • 简单值是通过<property>配置,直接值直接调用value,而其他对象引用使用ref。
    <bean id="poeticDuke" class="com.springinaction.springidol.PoeticJuggler">
        <property name="song" value="haha"/>
        <property name="instrument" ref="saxophone"/>
  • 注入内部Bean是在<property>元素中直接声明Bean
    <bean id="poeticDuke" class="com.springinaction.springidol.PoeticJuggler">
        <property name="song" value="haha"/>
        <property name="instrument" >
           <bean class="org.springinaction.springidol.Saxophone"/>
        </property>
  • 使用Spring命名空间p装配属性前提: 在<beans>中加入
    xmlns:p="http://www.springframework.org/schema/p"
  • 然后bean的配置就变成如下所示:
    <bean id="poeticDuke" class="com.springinaction.springidol.PoeticJuggler">
        <p:song = "haha"/>
        <p:instrument = "saxophone"/>

2.1 装配集合

  • 装配List、Set和Array

    一般为以下形式:

    <bean id="hank" class="com.springinaction.springidol.OneManBand">
        <property name="instruments">
            <list>
               <ref bean="guitar" />
               <ref bean="cymbal" />
               <ref bean="harmonica" />
            </list>
        </property>
    </bean>

    <list>元素包含一个或多个值。<ref>元素用来定义Spring上下文中的其它Bean引用,成员还包括<value>、<bean>和<null>。实际上,<list>也可以包含<list>作为其成员,形成多维列表。

  • 装配Map集合    先来看看Spring配置文件中如何申明配置:上面的示例其实就相当于一个声明了一个map集合,以键值对的方式,key指定entry的键,而value-ref属性定义了entry的值,并引用了Spring上下文的其它Bean。
    <bean id="hank" class="com.springinaction.springdiol.OneManBand">
      <property name="instruments">
        <map>
          <entry key="GUITAR" value-ref="guitar" />
          <entry key="CYMBAL" value-ref="cymbal" />
          <entry key="HARMONICA" value-ref="harmonica" />
        </map>
      </property>
  • 装配Properties集合

        当如果map装配的每一个entry的键和值都为String类型是,就可以用Properties代替Map。声明可map的示例差不多,只要稍微改动些值。如下:

    ······
        <props>
          <prop key="aaa">BBB CCC </prop>
        </props>
    ······

  • 装配空值

        属性为空的,可以按以下设置:

    <property name="someNullObject"><null/></property>

    3. 使用Spring表达式装配

    Spring 3 引入了Spring表达式语言(Spring Expression Language,SpEL)。SpEL的主要作用在于:能够动态的获取值,进行传参,包括传递函数参数的值或者直接值。

    采用的格式是: #{}

    比如说SpEL和标准的bean装配是等价的。

    <property name="hello" value="#{world}" />

    等价于

    <property name="hello" ref="world" />

    SpEL装配立即值时,支持以下几种格式或者类型:

    1. 整数和浮点型数
    2. 科学计数法
    3. 字符串
    4. 布尔型
    在引用方法时,可能会遇到空指针异常,SpEL提供了一个null-safe存取器,简单得讲就是做了异常处理。
     这就避免了如果selectSong()返回空值时,再调用toUpperCase()方法时出现的异常,做的工作就是如果返回空,则不会调用toUpperCase()方法。在调用操作类是需要注意的是:要使用 T()运算符例如: 
     

    SpEL提供了几种运算符,

    运算符类型 运算符
    算术运算 +、-、*、/、%、^
    关系运算 <、>、==、<=、>=、lt、gt、eq、le、ge
    逻辑运算 and、or、not、|
    条件运算 ?: (ternary)、?: (Elvis)
    正则表达式 matches

    进行运算同样提供了筛选集合的方法。

    访问集合:和java一样。

    查询集合:.?[] 另外 提供了“.^[]”和“.$[]”匹配第一个和最后一个匹配项。

    投影集合:.![]


    4. 小结

    本章,对装配Bean的方法进行了系统的概述,并且介绍了一些实例和技巧。最常见的方式是使用XML文件,因此在了解Spring必须先从了解Spring的XML文件开始。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值