[Spring] 声明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上下文中才有效。

注意:spring有关单例的概念限于spring上下文的范围内,不像真正的单例,在每个类加载器中保证只有一个实例。spring的单例只能保证在每个应用上下文中只有一个bean的实例。没有人能够阻止你使用传统的方式实话同一个bean,甚至你可以定义几个<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">

转载:http://blog.csdn.net/foreverling/article/details/50878599

时间: 2024-10-26 04:02:47

[Spring] 声明Bean的相关文章

spring之Bean的生命周期

Bean的生命周期: Bean的定义--Bean的初始化--Bean的使用--Bean的销毁 Bean的定义 Bean 是 Spring 装配的组件模型,一切实体类都可以配置成一个 Bean ,进而就可以在任何其他的 Bean 中使用,一个 Bean 也可以不是指定的实体类,这就是抽象 Bean . Bean的初始化 Spring中bean的初始化回调有两种方法 一种是在配置文件中声明init-method="init",然后在一个实体类中用init()方法来初始化 另一种是实现Ini

spring中bean配置和bean注入

1 bean与spring容器的关系 Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建立Bean定义注册表,然后根据注册表加载.实例化Bean,并建立Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应用程序进行调用. 1 bean配置 bean配置有三种方法: 基于xml配置Bean 使用注解定义Bean 基于java类提供Bean定义信息 1.1 基于xml配置Bean  对于基于XML的配置,

【Spring实战】—— 4 Spring中bean的init和destroy方法讲解

本篇文章主要介绍了在spring中通过配置init-method和destroy-method方法来实现Bean的初始化和销毁时附加的操作. 在java中,我们并不需要去管理内存或者变量,而在C或C++中,可以通过new和delete等方式来创建和删除变量或者对象.在Spring中,如果想要对一个bean进行初始化和结束附加一定的操作,则可以使用上述的两个方法来实现. 在介绍这两个方法前,读者需要了解Spring中bean的生命周期,最常使用的两种生命周期是:singleton和prototyp

Spring中bean的基本xml配置

xml   在spring容器内拼凑bean叫作装配.装配bean的时候,你是在告诉容器,需要哪些bean,以及容器如何使用依赖注入将它们配合在一起.    理论上,bean装配可以从任何资源获得,包括属性文件,关系数据库等,但xml是最常见的spring 应用系统配置源.Spring中的几种容器都支持使用xml装配bean,包括:    XmlBeanFactory ,    ClassPathXmlApplicationContext ,    FileSystemXmlApplicatio

spring入门(4) spring中Bean的生命周期总结

Spring中Bean的生命周期,在学习spring的过程中bean的生命周期理解对学习spring有很大的帮助,下面我就分别介绍在 ApplicationContext和BeanFactory中Bean的生命周期. 1.在ApplicationContext中Bean的生命周期 生命周 期执行的过程如下: 1.需找所有的bean根据bean定义的信息来实例化bean 2.使用依赖注入,spring按bean 定义信息配置bean的所有属性 3.若bean实现了BeanNameAware接口,工

从spring的IOC说起(二)——spring的Bean的基础配置

上次简单的说了下spring的IOC,也说到了spring的IOC强大在于有一系列可 以维护Bean不同关系的维护类的存在,而这样的维护也是基于高度可配置的 spring配置文件而言的.这次就是结合我的使用spring的IOC来讲讲我在使用中 的体会,当然,这里涉及的内容不会很高深,但是也必须读者能够读懂简单的 Bean配置才可以. 我们这里只讲spring的IOC,AOP不在这范围之内,虽然AOP也是基于IOC之上 的,至于那些集合啊什么的配置也不是这里的重点.我们这里说spring的Bean

java spring注入bean生成一个类实例,请问这个类实例是单体类吗?全局唯一吗。

问题描述 java spring注入bean生成一个类实例,请问这个类实例是单体类吗?全局唯一吗. 小弟刚从C++转JAVA不久,遇到这样一个问题,求高人帮忙解答. 我现在大体理解了注入的实现方式,例如在一个标注有@configuration 的类里面,如果一个方法 上面有@bean,那么这个方法的返回的类对象会被实例化. 我的疑问是这样的,这个实例化的对象是全局唯一的吗,或者说 是一个单体类吗? 因为我要在我的程序里不同地方使用调用这个bean的方法,我担心如果是单体类的话, 是否存在数据同步

activiti任务监听TaskListener的实现类里想注入spring的bean要怎么做?

问题描述 activiti任务监听TaskListener的实现类里想注入spring的bean要怎么做? 1C 请教大家个activiti问题,我在任务监听TaskListener的实现类里想注入spring的bean要怎么做?我@Autowired注入都是null,请大师指点.感谢?

spring配置bean如何忽略通过注解引入的bean

问题描述 spring配置bean如何忽略通过注解引入的bean 我只想创建一个A类的对象,因为B中依赖A,但是A中通过注解又依赖于C,我只想创建一个A的对象给B,实际上B中我用不着A,只是测试时调用B中的部分方法,怎么定义才能实现这个呢? 解决方案 Spring中bean三种注解方式.Bean 基于注解的配置[Spring]IOC之基于注解的配置bean(上)