一、Bean的装配
Bean的装配,即Bean对象的创建。容器根据代码要求创建Bean对象后再传递给代码的过程,称为Bean的装配。
1、默认装配方式
代码通过getBean()方式从容器获取指定的Bean实例,容器首先会调用Bean类的无参构造器,创建空值的实例对象。
<bean id="helloWorld" class="com.HelloWorld">
2、动态工厂Bean
有些时候,项目中需要通过工厂类来创建Bean实例,而不能像前面例子中似的,直接由Spring容器来装配Bean实例。使用工厂模式创建Bean实例,就会使工厂类与要创建的Bean类耦合到一起。
(1)将动态工厂Bean作为普通Bean使用
将动态工厂Bean作为普通Bean来使用是指,在配置文件中注册过动态工厂Bean后,测试类直接通过getBean()获取到工厂对象,再由工厂对象调用其相应方法创建相应的目标对象。配置文件中无需注册目标对象的Bean。因为目标对象的创建不由Spring容器来管理。
但,这样做的缺点是,不仅工厂类与目标类耦合到了一起,测试类与工厂类也耦合到了一起。
(2)使用Spring的动态工厂Bean
Spring对于使用动态工厂来创建的Bean,有专门的属性定义。factory-bean指定相应的工厂Bean,由factory-method指定创建所用方法。此时配置文件中至少会有两个Bean的定义:工厂类的Bean,与工厂类所要创建的目标类Bean。而测试类中不再需要获取工厂Bean对象了,可以直接获取目标Bean对象。实现测试类与工厂类间的解耦。
3、静态工厂Bean
使用工厂模式中的静态工厂来创建实例Bean。
此时需要注意,静态工厂无需工厂实例,所以不再需要定义静态工厂<bean/>。
而对于工厂所要创建的Bean,其不是由自己的类创建的,所以无需指定自己的类。但其是由工厂类创建的,所以需要指定所用工厂类。故class属性指定的是工厂类而非自己的类。当然,还需要通过factory-method属性指定工厂方法。
4、容器中Bean的作用域
当通过Spring容器创建一个Bean实例时,不仅可以完成Bean的实例化,还可以通过scope属性,为Bean指定特定的作用域。Spring支持5种作用域。
(1)singleton:单态模式。即在整个Spring容器中,使用singleton定义的Bean将是单例的,只有一个实例。默认为单态的。
(2)prototype:原型模式。即每次使用getBean方法获取的同一个<bean />的实例都是一个新的实例。
(3)request:对于每次HTTP请求,都将会产生一个不同的Bean实例。
(4)session:对于每个不同的HTTP session,都将产生一个不同的Bean实例。
(5)global session:每个全局的HTTP session对应一个Bean实例。典型情况下,仅在使用portlet 集群时有效,多个Web应用共享一个session。一般应用中,global-session与session是等同的。
注意:
(1)对于scope的值request、session与global session,只有在Web应用中使用Spring时,该作用域才有效。
(2)对于scope为singleton的单例模式,该Bean是在容器被创建时即被装配好了。
(3)对于scope为prototype的原型模式,Bean实例是在代码中使用该Bean实例时才进行装配的。