Spring学习笔记之Bean装配

Dependency Injection,即依赖注入,为Spring的主要特色之一,其通过XML文件配合Annotation配置各类bean,以达到松耦合,易扩展的目的。


先介绍下Spring Container中bean的生命周期,若POJO实现了这些接口,则相应的方法将会被调用:


用于定义bean的XML文件基本结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans 	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	<!-- Bean declarations go here -->
	<bean id="duke" class="com.springinaction.springidol.Juggler" /> 
</beans>

常用的命名空间有以下几种:

命名空间功能
aopAOP功能
beans主要核心空间,用于bean的装配
context用于application context的配置,支持基于Annotation的bean自动匹配
jee支持Java EE API,例如JNDI,EJB
jms声明message-driven POJOs
lang声明通过Groovy,JRuby,或BeanShell scripts实现的bean
mvc支持spring mvc框架
oxm支持Object-to-XML映射
tx支持transaction
util一些通用功能,如properties文件导入数据


以上的例子列出了一个最简单的bean声明:<bean id="duke" class="com.springinaction.springidol.Juggler" />,Spring将会调用Juggler类的default constructor用于生成bean。

然大多数情况下,我们需要的bean会更复杂,为此spring提供了更为丰富的配置方法:


配置constructor参数:

  • 引用类型用ref关键词,通过bean id匹配
  • 基本类型用value关键词
  • 支持内部bean声明

Spring在配置文件中是不进行类型判断的,而是尝试匹配所有拥有对应数目参数的constructor,并将String类型的参数转化为对应的类型,一旦匹配成功则不再继续,若无一匹配成功则抛出BeanCreationException

<bean id="poeticDuke" class="com.springinaction.springidol.PoeticJuggler">
    <constructor-arg value="15" />                          //基本类型
    <constructor-arg ref="sonnet1" />                       //引用类型
    <constructor-arg>
        <bean class="com.springinaction.springidol.Sonnet"> //内建bean
    </constructor-arg>
</bean>

对于没有public constructor的类,如singleton,可以指定factory method来获取实例
<bean id="theStage" class="com.springinaction.springidol.Stage" factory-method="getInstance" />

配置property,需要在POJO中声明对应的setter函数,配置方式和constructor类似
<bean id="kenny" class="com.springinaction.springidol.Instrumentalist">
    <property name="song" value="Jingle Bells" />            //基本类型
    <property name="instrument" ref="saxophone" />           //引用类型
    <property name="sonnet">
        <bean class="com.springinaction.springidol.Sonnet">  //内建bean
    </property>
</bean>

Spring提供了 命名空间p来简化property的配置,以上bean可简化为:
<bean id="kenny" class="com.springinaction.springidol.Instrumentalist" p:song="Jingle Bells" p:instrument-ref="saxophone" />

当需要处理 数组型的参数时,我们有如下选择:
  • <list>:对应POJO中数组属性或任何使用了java.util.Collection接口的类,并不一定是java.util.List类
    element可重复,基本类型使用<value="">标签,应用类型使用<ref bean="">标签,空值使用<null />标签,支持内建bean
  • <set>:类似于list,区别在于element不可重复
  • <map>:key-value类型的参数,key和value均可以是任何类型,POJO中对应java.util.Map接口的实现
    内部元素标签为<entry key/key-ref="" value/value-ref="" />,基本类型是key/value,引用类型为key-ref/value-ref
  • <props>:类似于map,但key和value均只能是String,POJO中对应java.util.Properties类
    内部元素标签为<prop key="">value</prop>
<bean>标签拥有 scope这个属性,用于配置bean是否为单例,默认情况下为"singleton",即单例,在同一context中对同一个bean的多次引用返回的均是同一实例。除此之外,Spring还提供了"prototype",每次都是不同实例;"request",每个http request拥有不同的实例;"session",每个session拥有不同实例;"global-session",每个portlet session拥有不同实例

<bean>标签还可以定义 init-methoddestroy-method,如<bean ... init-method="" destroy-method="">,此种方式优于实现InitializingBean,DisposableBean接口,后者将使POJO限制于Spring框架。<beans>标签支持default-init-method,default-destroy-method,可用于所有bean通用的init,destroy方法

以上介绍了Spring常用配置bean的方式,应该可以满足大多数情况了,但还没有结束,如果你需要到运行时才能确定bean的参数的话,就需要Spring Expression Language(SpEL)的帮助了,我将在下一篇读书笔记中介绍这个Spring特性


参考书目:Spring in Action 3rd Edition by Craig Walls

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值