[Spring] 声明Bean
2016-03-13 17:25
507 查看
定义如下接口:
在
的核心框架自带了10个命名空间配置,如下:
Juggler类默认可以同时抛3个豆袋子,但是也可以通过构造器设置豆袋子的个数。
声明一个bean:
当spring加载该bean时,spring将使用默认的构造器来实例化duke bean。实际上,duke会使用如下代码来创建:
为了给duke一个排练机会,可以使用如下代码加载spring上下文:
其中,spring-idol.xml文件放置于resources目录下。
通过构造器注入对象引用
一个会朗诵诗歌的杂技师:
朗诵诗歌接口如下:
Sonnet29实现了Poem接口:
可以使用如下配置将Sonnet29声明为一个spring bean:
有了poem之后要做的就是将poem赋予duke,将duke的声明如下:
对于不是简单类型的参数,不能使用value属性进行赋值,而需要使用来传递bean引用。
如果想声明的bean没有一个公开的构造函数,则可以通过装配通过工厂方法创建的bean。
通过工厂方法创建bean
有时候静态工厂方法是实例化对象的唯一方法,spring支持通过
Stage类是一个典型的单例类:
为了在spring上下文中将Stage配置为bean,可以像下面的配置来使用factory-method:
如果要装配的对象需要通过静态方法来创建,那么这种配置方式可以适用于任何场景。
spring的bean作用域允许用户配置所创建的bean属于哪一种作用域,而无需在bean的实现里硬编码作用域规则。
注意:spring有关单例的概念限于spring上下文的范围内,不像真正的单例,在每个类加载器中保证只有一个实例。spring的单例只能保证在每个应用上下文中只有一个bean的实例。没有人能够阻止你使用传统的方式实话同一个bean,甚至你可以定义几个
例如,声明一个bean,实现在开始前关灯,在结束后关灯。
当我们使用这种方法配置时,auditorium bean实例化后会立即调用turnOnLights()方法,在该bean从容器移除和销毁前,会调用turnOffLights()方法将灯关闭。
为bean定义初始化和销毁的另一种可选方式是,让bean实现spring的InitalizingBean和DisposableBean接口。spring以特殊的方式对待实现这两个接口的bean,允许它们进入bean的声明周期。实现这些接口的缺点是bean与spring的API产生了耦合。唯一可能使用spring的生命周期接口的场景是,开发一个明确在spring容器内使用的bean。
默认的init-method和destroy-method
如果在上下文中定义的很多bean都拥有相同名字的初始化方法和销毁方法,可以使用
package com.springinaction.springidol; public interface Performer { void perform() throws PerformanceException; }
1 创建spring配置
spring容器提供了两种配置bean的方式,使用xml文件或java注解。一个典型的spring 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"> </beans>
在
<beans>元素内,可以放置所有的spring配置信息,包括
<bean>元素的声明。spring
的核心框架自带了10个命名空间配置,如下:
命名空间 | 用途 |
---|---|
aop | 为声明切面以及将@AspectJ注解的类代理为spring切面提供了配置元素 |
beans | 支持声明bean和装配bean,是sprig最核心也是最原始的命名空间 |
context | 为配置spring应用上下文提供了配置元素,包括自动检测和自动装备bean、注入非spring直接管理的对象 |
jee | 提供了与Java EE API的集成,例如JNDI和EJB |
jms | 为声明消息驱动的POJO提供了配置元素 |
lang | 支持配置由Groovy、JRuby或BeanShell等脚本实现的bean |
mvc | 启用spring mvc的能力,例如面向注释的控制器、视图控制器和拦截器 |
oxm | 支持spring的对象到xml映射配置 |
tx | 提供声明式失误配置 |
util | 提供各种各样的工具类元素,包括把元素配置为bean、支持属性占位符元素 |
2 声明一个简单bean
声明一个杂技师类Juggler,代码如下:package com.springinaction.springidol; public class Juggler implements Performer { private int beanBags = 3; public Juggler() { } public Juggler(int beanBags) { this.beanBags = beanBags; } public void perform() throws PerformanceException { System.out.println("JUGGLING " + beanBags + " BEANBAGS"); } }
Juggler类默认可以同时抛3个豆袋子,但是也可以通过构造器设置豆袋子的个数。
声明一个bean:
<bean id="duke" class="com.springinaction.springidol.Juggler" />
当spring加载该bean时,spring将使用默认的构造器来实例化duke bean。实际上,duke会使用如下代码来创建:
new com.springinaction.springidol.Juggler();
为了给duke一个排练机会,可以使用如下代码加载spring上下文:
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-idol.xml"); Performer performer = (Performer)ctx.getBean("duke"); performer.perform();
其中,spring-idol.xml文件放置于resources目录下。
3 通过构造器注入
下面的xml声明了duke成为一个可以同时抛15个豆袋子的杂技师:<bean id="duke" class="com.springinaction.springidol.Juggler"> <constructor-arg value="15" /> </bean>
通过构造器注入对象引用
一个会朗诵诗歌的杂技师:
package com.springinaction.springidol; public class PoeticJuggler extends Juggler { private Poem poem; public PoeticJuggler(Poem poem) { this.poem = poem; } public PoeticJuggler(int beanBags, Poem poem) { super(beanBags); this.poem = poem; } public void perform() throws PerformanceException { super.perform(); System.out.println("While reciting..."); poem.recite(); } }
朗诵诗歌接口如下:
package com.springinaction.springidol; public interface Poem { void recite(); }
Sonnet29实现了Poem接口:
package com.springinaction.springidol; public class Sonnet29 implements Poem { private static String[] LINES = { "line1: --------", "line2: --------", "line3: --------", "line4: --------", "line5: --------", }; public Sonnet29() {} public void recite() { for (int i = 0; i < LINES.length; i++) { System.out.println(LINES[i]); } } }
可以使用如下配置将Sonnet29声明为一个spring bean:
<bean id="sonnet29" class="com.springinaction.springidol.Sonnet29" />
有了poem之后要做的就是将poem赋予duke,将duke的声明如下:
<bean id="poeticDuke" class="com.springinaction.springidol.PoeticJuggler"> <constructor-arg value="25" /> <constructor-arg ref="sonnet29" /> </bean>
对于不是简单类型的参数,不能使用value属性进行赋值,而需要使用来传递bean引用。
如果想声明的bean没有一个公开的构造函数,则可以通过装配通过工厂方法创建的bean。
通过工厂方法创建bean
有时候静态工厂方法是实例化对象的唯一方法,spring支持通过
<bean>元素的factory-method属性来装配工厂创建的bean。
Stage类是一个典型的单例类:
package com.springinaction.springidol; public class Stage { private Stage() {} private static class StageSingletonHolder{ static Stage instance = new Stage(); } public static Stage getInstance() { return StageSingletonHolder.instance; } }
为了在spring上下文中将Stage配置为bean,可以像下面的配置来使用factory-method:
<bean id="theStage" class="com.springinaction.springidol.Stage" factory-method="getInstance" />
如果要装配的对象需要通过静态方法来创建,那么这种配置方式可以适用于任何场景。
4 Bean的作用域
当在spring中配置bean时,我们可以为bean声明一个作用域。为了让spring在每次请求时都为bean产生一个新的实例,我们只需要配置bean的scope属性为prototype即可。例如,把演唱会门票声明为spring bean:<bean id="ticket" class="com.springinaction.springidol.Ticket" scope="prototype" />
spring的bean作用域允许用户配置所创建的bean属于哪一种作用域,而无需在bean的实现里硬编码作用域规则。
作用域 | 定义 |
---|---|
singleton | 在每一个spring容器中,一个bean定义只有一个对象实例(默认) |
prototype | 允许bean的定义被实例化任意次(每次调用豆创建一个实例) |
request | 在一次HTTP请求中,每个bean定义对应一个实例。该作用域仅在基于web的spring上下文(例如spring mvc)中才有效 |
session | 在一个HTTP Session中,每个bean对应一个实例。该作用域仅在基于web的spring上下文(例如spring mvc)中才有效 |
global-session | 在一个全局HTTP Session中,每个bean定义一个实例。该作用域仅在Protlet上下文中才有效。 |
<bean>声明来实例化同一个Bean。
5 初始化和销毁bean
为bean定义初始化和销毁操作,只需要使用init-method和destroy-method参数来配置bean元素,init-method属性指定了在初始化bean时要调用的方法,类似的,destroy-method属性指定了bean从容器移除之前要调用的方法。例如,声明一个bean,实现在开始前关灯,在结束后关灯。
<bean id="autitorium" class="com.springinaction.springidol.Auditoriun" init-method="turnOnLights" destroy-mothod="turnOffLights" />
当我们使用这种方法配置时,auditorium bean实例化后会立即调用turnOnLights()方法,在该bean从容器移除和销毁前,会调用turnOffLights()方法将灯关闭。
为bean定义初始化和销毁的另一种可选方式是,让bean实现spring的InitalizingBean和DisposableBean接口。spring以特殊的方式对待实现这两个接口的bean,允许它们进入bean的声明周期。实现这些接口的缺点是bean与spring的API产生了耦合。唯一可能使用spring的生命周期接口的场景是,开发一个明确在spring容器内使用的bean。
默认的init-method和destroy-method
如果在上下文中定义的很多bean都拥有相同名字的初始化方法和销毁方法,可以使用
<beans>元素的default-init-method和default-destroy-method属性:
<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" default-init-method="turnOnLights" default-destroy-method="turnOffLights">
相关文章推荐
- JAVA内存区域
- java并发包
- 20145313张雪纯 《Java程序设计》第2周学习总结
- JDK安装出现1335错误
- java 包和import关键字。
- spring AOP原理
- java Script入门
- Spring依赖注入源码分析
- java 变量的作用域 面向对象的特点
- java内部类详解
- Eclipse安装Spring插件springsource-tool-suite
- 《Java程序设计》第二周学习总结
- 20145329 吉东云《Java程序设计》第二周学习总结
- java高级特性学习笔记
- spring IOC原理
- 蓝桥杯 基础练习 十六进制转八进制
- java继承与接口相关知识
- Java开发环境搭建JAVA_HOME PATH 配置
- Java——InputStreamReader&OutputStreamWriter字符流实现文本文件复制
- java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)