首页 / 技术 / 正文

Spring中使用XML创建和配置Bean

2016年01月05日 1 条评论 ... 技术

Spring 容器中,使用 Bean 作为高效组件来填充容器,Bean 的实例方法完成依赖注入,实现方便快速地管理实例实现功能,Spring 中配置 Bean 的方法有多种,实际编写过程中要根据实际情况来选择方法。

1.最简单的声明 Bean

最简单的声明 Bean 需要在 Spring 的配置文件中实现的,例如代码:

  1. <bean id="HelloWorld" class="com.hundsun.spring.HelloWorld"></bean> 

简单的 Bean 是由 <bean></bean> 标签包裹,其中两个属性:

id 的作用是作为 Bean 的唯一标识,以后使用 Bean 的时候就使用 id 后面的名字即可;

class 的作用是作为制定该 Bean 的实现类,运行中 Spring 会 new 该实现类的对象,因此 class 必须指向实现类,而非其他接口等。

2.通过构造器声明

构造器声明 Bean 适用于目标实现类中有含有参数的构造器。

例如代码:

  1. <bean id="HelloWorld" class="com.hundsun.spring.HelloWorld"> 
  2.     <constructor-arg value="TOM"></constructor-arg> 
  3. </bean> 

与简单声明 Bean 方法有所区别的是,<bean></bean> 标签中增加了一个 <constructor-arg></constructor-arg> 标签,此标签中有 value 属性。多出的这个 constructor-arg 标签的作用就是为了填充目标实现类中含有参数的构造器中的参数。

如果不是特别明白,可以查看一下 bean 指向的实现类的源代码:

  1. package com.hundsun.spring;  
  2.  
  3. public class HelloWorld {  
  4.  
  5.     public HelloWorld(String name) {  
  6.         System.out.println("Hello World"+name);  
  7.     }  
  8.  

代码中含有一个带参的构造器,而 constructor-arg 中的 value 指的就是参数 name。不必担心 value 中的值的类型问题,Spring 会根据实现类中的变量类型自动转换 value 中的类型。

如果构造器中含有多个参数,可以添加多个 constructor-arg ,可以增加 index 属性排列顺序,顺序从小到大。

如果实现类中有多个构造器,但是参数类型不同,需要在 <constructor-arg></constructor-arg> 标签中增加属性 value 以区分具体声明的哪一个类型的参数。

3.通过工厂方法创建 Bean

工厂方法创建 Bean 的方法适用于单例类实例,即实例中只含有静态方法。

例如代码

  1. <bean id="staticFunction" class="com.hundsun.spring.StaticHello" factory-bean="HelloWorld"></bean> 

相对简单方法,多出来一个 factory-bean 的属性,该属性指向的就是 StaticHello 实现类中 HelloWorld 静态方法。

4.使用 Set 方法注入 Bean 属性

要为创建 Bean 的实现类中的私有属性注入值,需要使用 Set 方法注入,简单安全。

要实现 set 方法注入 Bean 要做这样的步骤

1.在实现类中为目标私有属性生成 set 方法。

2.在构造 Bean 的 XML 文件中增加 <property name="xxx" value="xxx">

例如代码

  1. <bean id="demo" class="com.hundsun.spring.HelloWorld"> 
  2.     <property name="message" value="你好"></property> 
  3. </bean> 

对应的 name 属性指的是 HelloWorld 实现类中 message 的私有属性,并且将 value 属性中的“你好”注入给 message。这个时候你若输出 message ,则会输出汉字“你好”。但是前提是你一定一定要在实现类中生成好 setMessage() 方法。

同样的,你可以给 Bean 属性赋值已有的其他 Bean,如代码所示。

  1. <!-- 事先声明好的person的bean --> 
  2. <bean id="Sam" class="com.hundsun.spring.entity.Person"></bean> 
  3.  
  4. <bean id="demo" class="com.hundsun.spring.HelloWorld"> 
  5.     <property name="message" value="你好"></property> 
  6.     <property name="person" ref="Sam"></property> 
  7. </bean> 

一个 id 名为 Sam 的 Bean 被一个 id 为 demo 的 Bean 引用,关键属性为 ref ,ref 直接指向了已有的 Bean。

假设我只希望名为 Sam 的 Bean 被 demo 引用,我可以使用注入内部 Bean,只需将上述代码修改为这样:

  1. <bean id="demo" class="com.hundsun.spring.HelloWorld"> 
  2.     <property name="message" value="你好"></property> 
  3.     <property name="person"> 
  4.         <bean id="Sam" class="com.hundsun.spring.entity.Person"></bean> 
  5.     </property> 
  6. </bean> 

5.其他零碎

1.Bean 的作用域

<bean></bean> 标签中的 scope 属性,该属性作用是控制 Bean 的作用域,默认情况下,Bean 是单例,即如果创建,如果被再次使用的话不会创建新的,而取之前创建过的 Bean 使用,如果想要每次都创建新的实例,则需要修改 scope 属性。

scope 属性值有:

singleton 一个 Bean 只有一个对象(默认)

prototype 每次都被重新创建一个实例

request 在一次 HTTP 请求中有效

session 在一次对话中有效

global-session 在整个 HTTP 请求中有效

2.初始化和销毁 Bean

两个属性:

init-method=""

在初始化 Bean 时执行实例中的某个方法。

destory-method=""

在 Bean 销毁时执行实例中的某个方法。

如果希望设置默认初始化和销毁方法的话,可以在文件头部<beans></beans>标签中增加两个属性:

default-init-method=""

default-destory-method=""

3.Spring 命名空间 p

为了简化 Bean 的装配,Spring 提供了 p 方法装配 Bean。

首先需要引入 p 的命名空间;

这个时候,Bean 可以改写为:

  1. <bean id="Sam" class="com.hundsun.spring.entity.Person"></bean> 
  2. <bean id="demo" class="com.hundsun.spring.HelloWorld" p:message="你好" p:person-ref="Sam"></bean> 

大大缩短了编写时间。

4.装配集合(略)

5.SpEL 表达式(略)

1 条评论

Loading...
  1. 炎藤

    那么 bean 文件应该放在什么位置呢?

    2016-06-25 [回复]

发布评论