声明Bean
创建Spring配置
从Spring3.0开始,Spring容器提供了两种配置Bean的方式。传统上,Spring使用一个或多个XML文件作为配置文件,而Spring3.0还同时提供了基于Java注解的配置方式,我们首先来关注传统的XML文件配置方式
在XML文件中声明Bean时,Spring配置文件的根元素是来源于Spring beans命名空间所定义的
在
命名空间 | 用途 |
---|---|
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的能力,例如面向注解的控制器、视图控制器和拦截器 |
tx | 提供声明式配置 |
oxm | 支持Spring的对象到XML映射配置 |
util | 提供各种各样的工具类元素,包括把集合配置为Bean、支持属性占位符元素 |
声明一个简单的Bean
当Spring容器加载该Bean时,Spring将使用默认的构造器来实例化duke Bean。实际上duke会使用如下代码来创建:
new com.springincation.springidol.Juggler();
为了给Duke一个排练的机会,你可以使用如下代码加载Spring上下文:
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"classpath/spring-idol.xml");
通过构造器注入
下面的XML声明了Duke成为一个可以同时抛15个豆子的杂技师:
在构造Bean的时候,我们可以使用
通过构造器注入对象引用
可以使用下面的XML配置将Sonnet29声明为一个Spring
有了poem,你需要做的就是将poem赋予Duke。现在Duke是一个PoeticJuggler了,它的
构造PoeticJuggler的唯一方法只能使用带有参数的构造方法。*我们可以使用带有int参数和Poem引用的构造方法。在Duke Bean的声明中,我们通过
但是,我们不能使用value属性为第二个构造参数赋值,因为Poem不是简单类型。取而代之的是,我们使用ref属性来讲ID为sonnet29的Bean引用传递给构造器。可以想象当Spring碰到sonnet29和duke的
Poem sonnet29 = new Sonnet29();
Performer duke = new PoeticJuggler(15, sonnet29);
通过工厂方法创建Bean
有时候静态工厂方法是实例化对象的唯一方法。Spring支持通过
Bean的作用域
所有的Spring Bean默认都是单例。当容器分配一个Bean时(不论是通过装配还是调用容器的getBean()方法),它总是返回Bean的同一个实例。
当在Spring中配置
作用域 | 定义 |
---|---|
singleton | 在每一个Spirng容器中,一个Bean定义只有一个对象实例 |
prototype | 允许Bean的定义可以被实例化任意次(每次调用都创建一个实例) |
request | 在一次HTTP请求中,每个Bean定义对应一个实例。该作用域仅在基于Web的Spring上下文(例文(例如Spring MVC)中才有效 |
session | 在一个HTTP Session中,每个Bean定义对应一个实例。该作用域仅在基于Web的Spring上下文(例文(例如Spring MVC)中才有效 |
global-session | 在一个全局HTTP Session中,每个Bean定义对应一个实例。该作用于仅在Portlet上下文中才有效 |
初始化和销毁Bean
为Bean定义初始化和销毁操作,只需要使用init-method和destroy-method参数来配置
注入Bean属性
通常,JavaBean的属性是私有的,同时拥有一组存取器方法,以setXXX()和getXXX()形式存在。Spring可以借助属性的set方法来配置属性的值,以实现setter方式的注入。