1 声明Bean
1.1 创建 Spring 配置
Spring 容器提供两种配置 Bean 的方式:xml 配置和基于注解配置。
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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
Spring 框架自带10个命名空间配置:
- aop:为生命切面以及将@AspectJ注解的类代理为Spring切面提供了配置元素
- beans:支持声明Bean和装配Bean,是Spring最核心也是最原始的命名空间
- context:为配置Spring应用上下文提供了配置元素,包括自动检测和自动装配Bean、注入非Spring直接管理的对象
- jee:提供了Java EE API的集成
- jms:为声明消息驱动的POJO提供了配置元素
- lang:支持配置由Groovy、JRuby或BeanShell等脚本实现的Bean
- mvc:启用Spring MVC的能力,例如面向注解的控制器、视图控制器和拦截器
- oxm:支持Spring的对象到XML映射配置
- tx:提供声明式事物配置
- util:提供各种各样的工具类元素,包括把集合配置为Bean、支持属性占位符元素
1.2 声明一个简单的 Bean
package com.hundsun.idol.impl; import com.hundsun.idol.Performer; // 一个杂技师 public class Juggler implements Performer { private int beanBags = 3; public Juggler() {} public Juggler(int beanBags) { this.beanBags = beanBags; } @Override public void perform() { System.out.println("Juggler " + beanBags + " BEANBAGS"); } }
在 Spring 配置文件中进行声明:
<bean id="duke" class="com.hundsun.idol.impl.Juggler"/>
通过 <bean> 元素将创建一个由 Spring 容器管理的名为 duke 的 Bean。加载 Spring 的上下文:
ApplicationContext context = new ClassPathXmlApplicationContext("com/hundsun/idol/idol.xml"); Performer duke = (Performer) context.getBean("duke"); duke.perform();
1.3 通过构造器
使用有参构造器声明 Bean:
<bean id="duke" class="com.hundsun.idol.impl.Juggler"> <constructor-arg value="15"/> </bean>
使用 <constructor-arg> 将调用 Juggler 的有参构造器。也可以配置通过构造器注入对象的引用:
package com.hundsun.idol.impl; import com.hundsun.idol.Poem; // 会朗诵的杂技师 public class PoeticJuggler extends Juggler { // 朗诵的诗歌 private Poem poem; public PoeticJuggler(Poem poem) { super(); this.poem = poem; } public PoeticJuggler(int beanBags, Poem poem) { super(beanBags); this.poem = poem; } @Override public void perform() { super.perform(); System.out.println("while reciting..."); poem.recite(); } }
先将一个 Poem 对象声明为 Bean:
<bean id="apoem" class="com.hundsun.idol.impl.APoem"/>
使用 <constructor-arg> 的 ref 属性将 id 为 apoem 的 Bean 引用传递给构造器:
<bean id="poeticDuke" class="com.hundsun.idol.impl.PoeticJuggler"> <constructor-arg value="15"/> <constructor-arg ref="apoem"/> </bean>
有时候静态工厂方法是实例化对象的唯一方法,Spring 支持通过 <bean> 元素的 factory-method 属性来装配工厂创建的 Bean。
package com.hundsun.idol.impl; // Stage单例类 public class Stage { private Stage() {} private static class StageSingletonHolder { static Stage instance = new Stage(); } public static Stage getInstance() { return StageSingletonHolder.instance; } }
Stage 没有公开的构造方法,静态方法 getInstance() 每次被调用时都返回相同的实例。在配置文件中可以使用 factory-method 来进行配置:
<bean id="theStage" class="com.hundsun.idol.impl.Stage" factory-method="getInstance"/>
1.4 Bean 的作用域
所有的 Spring Bean 默认都是单例,当容器分配一个 Bean 时,它总是返回 Bean 的同一个实例。scope 属性可以配置 Bean 的作用域:
- singleton:在每一个 Spring 容器中,一个 Bean 定义只有一个对象实例(默认)
- prototype:允许 Bean 的定义可以被实例化任意次(每次调用都创建一个实例)
- request:在一次 HTTP 请求中,每个 Bean 定义对应一个实例(仅基于 Web 的 Spring 上下文)
- session:在一个 HTTP Session 中,每个 Bean 定义对应一个实例(仅基于 Web 的 Spring 上下文)
- global-session:在一个全局的 HTTP Session 中,每个 Bean 定义对应一个实例(仅在 Portlet 上下文中有效)
1.5 初始化和销毁 Bean
<bean> 的 init-method 和 destroy-method 可以配置初始化时和容器移除对象之前要调用的方法。如果在上下文中定义的许多 Bean 都拥有相同名字的初始化方法和销毁方法,可以使用 <beans> 元素的 default-init-method 和 default-destroy-method 属性。
2 注入 Bean 属性