Spring3系列5-Bean的基本用法

本篇讲述了Bean的基本配置方法,以及Spring中怎样运用Bean。

主要内容如下:

一、      Spring中Bean的相互引用

二、      Spring中给Bean属性注入value

三、      Spring Inner Bean—内部嵌套的Bean

四、      Spring Bean Scopes—Bean的作用域

五、      Spring Collections(List、Set、Map、Properties) — 集合类型的Bean

一、      Spring中Bean的相互引用

在Spring框架中,可以通过ref来互相引用相同或不同xml配置文件中定义的Bean。

1.        引用不同xml配置文件中的bean

如果你想引用不同xml配置文件中的bean,可以使用’ref’标签,结合’bean’属性。

格式:<ref bean="someBean"/>

在下边的例子中,bean’ OutputHelper’在’ Spring-Common.xml’文件中被定义,通过使用’ref’标签,结合’bean’属性,可以引用’ Spring-Output.xml’文件中定义的两个bean(“CsvOutputGenerator” 和 “JsonOutputGenerator“)

配置文件:Spring-Output.xml如下

<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-2.5.xsd">   <bean id="CsvOutputGenerator" class="com.lei.output.impl.CsvOutputGenerator" />
  <bean id="JsonOutputGenerator" class="com.lei.output.impl.JsonOutputGenerator" /> </beans>

配置文件: Spring-Common.xml如下

<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-2.5.xsd"> <bean id="OutputHelper" class="com.lei.output.OutputHelper">
<property name="outputGenerator" >
<ref bean="CsvOutputGenerator"/>
</property>
</bean>
</beans>

2.        引用相同xml配置文件中的bean

如果你想引用相同xml配置文件中的bean,可以使用’ref’标签,结合’local’属性。

格式:<ref local="someBean"/>

配置文件:Spring-Output.xml如下

<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-2.5.xsd"> <bean id="OutputHelper" class="com.lei.output.OutputHelper">
<property name="outputGenerator" >
<ref local="CsvOutputGenerator"/>
</property>
</bean>
<bean id="CsvOutputGenerator" class="com.lei.output.impl.CsvOutputGenerator" />
<bean id="JsonOutputGenerator" class="com.lei.output.impl.JsonOutputGenerator" /> </beans>

注意

实际上,’ref’标签中’bean’属性,既可以引用相同xml文件中的bean,也可以引用不同xml文件中的bean,但是,考虑到项目的可读性,引用相同xml配置文件的bean时,应该尽量使用’local’属性。

二、      Spring中给Bean属性注入value

Spring中,通常有3种方法给Bean的属性注入value。

一般方法,缩写方法,”p” schema方法。

先看下边的Bean:FileNameGenerator.java,其中包含两个properties,name和type,我们向两个properties注入value。

package com.lei.common;

public class FileNameGenerator
{ private String name;
private String type; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getType() {
return type;
} public void setType(String type) {
this.type = type;
}
}

1.        一般方法

<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-2.5.xsd"> <bean id="FileNameGenerator" class="com.lei.common.FileNameGenerator">
<property name="name">
<value>lei</value>
</property>
<property name="type">
<value>txt</value>
</property>
</bean> </beans>

2.        缩写方法

<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-2.5.xsd"> <bean id="FileNameGenerator" class="com.lei.common.FileNameGenerator">
<property name="name" value="lei" />
<property name="type" value="txt" />
</bean> </beans>

3.        ”p” schema

<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-2.5.xsd"> <bean id="FileNameGenerator" class="com.lei.common.FileNameGenerator"
p:name="lei" p:type="txt" /> </beans>

注意,这种方法需要在bean的配置文件xml中,加入以下声明

xmlns:p=”http://www.springframework.org/schema/p

三、      Spring Inner Bean—内部嵌套的Bean

以下Demo演示了一个Bean中嵌套了另一个Bean,即所谓的内部嵌套Bean的配置方法,内部嵌套的Bean支持属性(property)注入和构造函数(constructor-arg)注入。

先看一下Customer.java 和Person.java

package com.lei.common;

public class Customer
{
private Person person;
public Customer(Person person) {
this.person = person;
} public void setPerson(Person person) {
this.person = person;
} @Override
public String toString() {
return "Customer [person=" + person + "]";
}
}
package com.lei.common;

public class Person
{
private String name;
private String address;
private int age; //getter and setter methods…此处省略 @Override
public String toString() {
return "Person [address=" + address + ",
age=" + age + ", name=" + name + "]";
}
}

配置Bean时,要在Customer的Bean中注入内部Bean,即Person。

1.     Customer中,可以用’ref’属性引用PersonBean,如下

<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-2.5.xsd"> <bean id="CustomerBean" class="com.lei.common.Customer">
<property name="person" ref="PersonBean" />
</bean> <bean id="PersonBean" class="com.lei.common.Person">
<property name="name" value="lei" />
<property name="address" value="address1" />
<property name="age" value="28" />
</bean> </beans>

2.     以上方法利用’ref’很好的引用了Person,但是,一旦Person仅仅被用在Customer下,也就是说不会被别的Bean引用,最好的方法就是在Customerbean中声明一个内部Bean,如下

<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-2.5.xsd"> <bean id="CustomerBean" class="com.lei.common.Customer">
<property name="person">
<bean class="com.lei.common.Person">
<property name="name" value="lei" />
<property name="address" value="address1" />
<property name="age" value="28" />
</bean>
</property>
</bean>
</beans>

3.     内部Bean也可以通过构造函数注入

<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-2.5.xsd"> <bean id="CustomerBean" class="com.lei.common.Customer">
<constructor-arg>
<bean class="com.lei.common.Person">
<property name="name" value="lei" />
<property name="address" value="address1" />
<property name="age" value="28" />
</bean>
</constructor-arg>
</bean>
</beans>

注意,以上2,3两种情况下,Person的Bean配置中,可以忽略id属性。

四、      Spring Bean Scopes—Bean的作用域

在Spring中,Bean的作用域决定了从Spring容器中返回的Bean实例的类型。

在Spring中,支持以下5中类型的作用域:

  1. singleton — 单例模式,由IOC容器返回一个唯一的bean实例。
  2. prototype — 原型模式,被请求时,每次返回一个新的bean实例。
  3. request — 每个HTTP Request请求返回一个唯一的Bean实例。
  4. session — 每个HTTP Session返回一个唯一的Bean实例。
  5. globalSession — Http Session全局Bean实例。

注:大多数情况下,你可能只需要处理Spring的核心作用域 — 单例模式(singleton)和原型模式(prototype),默认情况下,作用域是单例模式。

singletonprototype区别

CustomerService.java如下

package com.lei.customer.services;

public class CustomerService
{
String message; public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
}
}

如果是singleton情况下的配置如下

<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-2.5.xsd">
<bean id="customerService"
class="com.lei.customer.services.CustomerService" />
</beans>

以上配置中,如果没有指定scope范围,默认情况下是sighleton模式。

运行下边的代码:

package com.lei.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.lei.customer.services.CustomerService; public class App
{
public static void main( String[] args )
{
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {"Spring-Customer.xml"}); CustomerService custA = (CustomerService)context.getBean("customerService");
custA.setMessage("Message by custA");
System.out.println("Message : " + custA.getMessage()); //retrieve it again
CustomerService custB = (CustomerService)context.getBean("customerService");
System.out.println("Message : " + custB.getMessage());
}
}

输出结果如下:

Message : Message by custA
Message : Message by custA

Protptype情况下的配置如下:

<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-2.5.xsd"> <bean id="customerService" class="com.lei.customer.services.CustomerService"
scope="prototype"/>
</beans>

再运行一下测试代码,输出结果如下:

Message : Message by custA
Message : null

设置scope为prototype后,测试代码中,每调用一次getBean()方法后,都会得到一个新的实例。

五、      Spring Collections(List、Set、Map、Properties) — 集合类型的Bean

本节讲述怎样将值注入集合类型,包含以下四种主要的集合类型:

List —— <list/>

Set —— <set/>

Map —— <map/>

Properties —— <props/>

首先写一个Bean,一个Customer对象,包含四种集合属性,如下,

Customer.java

package com.lei.common;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set; public class Customer
{
private List<Object> lists;
private Set<Object> sets;
private Map<Object, Object> maps;
private Properties pros; //...此处省略setter和getter
}

1.        List

  <property name="lists">
<list>
<value>1</value>
<ref bean="PersonBean" />
<bean class="com.lei.common.Person">
<property name="name" value="leiList" />
<property name="address" value="address" />
<property name="age" value="28" />
</bean>
</list>
</property>

2.        Set

  <property name="sets">
<set>
<value>1</value>
<ref bean="PersonBean" />
<bean class="com.lei.common.Person">
<property name="name" value="leiSet" />
<property name="address" value="address" />
<property name="age" value="28" />
</bean>
</set>
</property>

3.        Map

  <property name="maps">
<map>
<entry key="Key 1" value="1" />
<entry key="Key 2" value-ref="PersonBean" />
<entry key="Key 3">
<bean class="com.lei.common.Person">
<property name="name" value="leiMap" />
<property name="address" value="address" />
<property name="age" value="28" />
</bean>
</entry>
</map>
</property>

4.        Properties

  <property name="pros">
<props>
<prop key="admin">admin@nospam.com</prop>
<prop key="support">support@nospam.com</prop>
</props>
</property>

综上,所有的bean配置文件如下

<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-2.5.xsd"> <bean id="CustomerBean" class="com.lei.common.Customer">
<!-- java.util.List -->
<property name="lists">
<list>
<value>1</value>
<ref bean="PersonBean" />
<bean class="com.lei.common.Person">
<property name="name" value="leiList" />
<property name="address" value="address" />
<property name="age" value="28" />
</bean>
</list>
</property> <!-- java.util.Set -->
<property name="sets">
<set>
<value>1</value>
<ref bean="PersonBean" />
<bean class="com.lei.common.Person">
<property name="name" value="leiSet" />
<property name="address" value="address" />
<property name="age" value="28" />
</bean>
</set>
</property> <!-- java.util.Map -->
<property name="maps">
<map>
<entry key="Key 1" value="1" />
<entry key="Key 2" value-ref="PersonBean" />
<entry key="Key 3">
<bean class="com.lei.common.Person">
<property name="name" value="leiMap" />
<property name="address" value="address" />
<property name="age" value="28" />
</bean>
</entry>
</map>
</property> <!-- java.util.Properties -->
<property name="pros">
<props>
<prop key="admin">admin@nospam.com</prop>
<prop key="support">support@nospam.com</prop>
</props>
</property>
</bean> <bean id="PersonBean" class="com.lei.common.Person">
<property name="name" value="lei1" />
<property name="address" value="address 1" />
<property name="age" value="28" />
</bean> </beans>

Spring3系列5-Bean的基本用法的更多相关文章

  1. Spring3系列8- Spring 自动装配 Bean

    Spring3系列8- Spring 自动装配 Bean 1.      Auto-Wiring ‘no’ 2.      Auto-Wiring ‘byName’ 3.      Auto-Wiri ...

  2. Spring3系列7- 自动扫描组件或Bean

    Spring3系列7- 自动扫描组件或Bean 一.      Spring Auto Scanning Components —— 自动扫描组件 1.      Declares Component ...

  3. Spring3系列13-Controller和@RequestMapping

    Spring3系列13-Controller和@RequestMapping Controller返回值,String或者ModelAndView @RequestMapping关联url @Requ ...

  4. Spring3系列12- Spring AOP AspectJ

    Spring3系列12- Spring AOP AspectJ 本文讲述使用AspectJ框架实现Spring AOP. 再重复一下Spring AOP中的三个概念, Advice:向程序内部注入的代 ...

  5. Spring3系列11- Spring AOP——自动创建Proxy

    Spring3系列11- Spring AOP——自动创建Proxy 在<Spring3系列9- Spring AOP——Advice>和<Spring3系列10- Spring A ...

  6. Spring3系列10- Spring AOP——Pointcut,Advisor拦截指定方法

    Spring3系列10- Spring AOP——Pointcut,Advisor 上一篇的Spring AOP Advice例子中,Class(CustomerService)中的全部method都 ...

  7. Spring3系列9- Spring AOP——Advice

    Spring3系列9- Spring AOP——Advice Spring AOP即Aspect-oriented programming,面向切面编程,是作为面向对象编程的一种补充,专门用于处理系统 ...

  8. Spring3系列6 - Spring 表达式语言(Spring EL)

    Spring3系列6-Spring 表达式语言(Spring EL) 本篇讲述了Spring Expression Language —— 即Spring3中功能丰富强大的表达式语言,简称SpEL.S ...

  9. Spring3系列4-多个配置文件的整合

    Spring3系列4-多个配置文件的整合 在大型的Spring3项目中,所有的Bean配置在一个配置文件中不易管理,也不利于团队开发,通常在开发过程中,我们会按照功能模块的不同,或者开发人员的不同,将 ...

随机推荐

  1. PHP类与继承

    <?php class Person { private $name; private $age; function __construct($name,$age){ $this->nam ...

  2. 用c#开发微信 (11) 微统计 - 阅读分享统计系统 1 基础架构搭建

    微信平台自带的统计功能太简单,有时我们需要统计有哪些微信个人用户阅读.分享了微信公众号的手机网页,以及微信个人用户访问手机网页的来源:朋友圈分享访问.好友分享消息访问等.本系统实现了手机网页阅读.分享 ...

  3. 在Mac/Linux/Windows上编译corefx遇到的问题及解决方法

    这两天尝试在Mac/Linux/Windows三大平台上编译.NET跨平台三驾马车(coreclr/corefx/dnx)之一的corefx(.NET Core Framework),结果三个平台的编 ...

  4. SQL Server转发记录指针的坏味道

    什么是转发记录指针? 转发记录指针是堆表中特有的数据存储机制. 当你修改了某个数据页中的一行时,如果该行所在的数据页已经无法存放其修改后的行, SQL Server会把这行数据移动到一个新的数据页上面 ...

  5. Unity3D——相机跟随物体移动

    public Transform target; public float moveSmooth=5f; Vector3 offset; void Start () { offset = transf ...

  6. js随机点名

    定时器案例. <!-- Author: XiaoWen Create a file: 2016-12-08 12:27:32 Last modified: 2016-12-08 12:51:59 ...

  7. duilib进阶教程 -- 扩展duilib的消息 (11)

    duilib并没有提供双击和右键消息,所以需要我们自行扩展,这里以添加双击消息为例, 在UIDefine.h里,我们只看到了DUI_MSGTYPE_CLICK消息,却没有看到双击消息,因此需要在这里添 ...

  8. paip.获取文件名从路径uapi java python php总结...

    paip.获取文件名从路径uapi java python php总结... =====uapi basename_noext($fname); =============java  自己写.. St ...

  9. fir.im Weekly - 我回来了

    Hey, 大家好,距离 fir.im 新版上线已匆忙过去一周多的时间,新版的fir正在慢慢稳定优化中,感谢大家的反馈与支持!后续我们将上线 FAQ 帮助中心,如还有疑问请邮件至 help@fir.im ...

  10. HTML5骨骼动画Demo | 使用min2d、createjs、pixi播放spine动画

    Spine做骨骼动画是比较流行的,使用起来可能相对复杂,但功能毕竟强大,所以市场占有率较大. 在unity.cocos2d.starling中使用spine已经很成熟了,而HTML5这一块可能刚刚起步 ...