Javadream

A long way and a dream.

Spring 2 学习笔记(一)

Posted on 2007-08-08 11:47 oxl 阅读(291) 评论(0)  编辑  收藏 所属分类: 技术感语

一,FactoryBean
   实现FactoryBean接口的bean类,在获取bean时并不是得到这个bean类的实例,而是通过这个FactoryBean的getObject方法得到实例,具体的类型由getObjectType方法返回。这种FactoryBean会被Spring自动检测并进行判断,而申明时像平时的bean那样申明,不过在定义property等属性时,则是对FactoryBean实例进行设置,而不是对生成的bean设置,认清这一点很重要。比如说常用的Spring DataSource就是一个FactoryBean。
下面是一个实例:

package com.sanlea.study.spring2.ch03;

import org.springframework.beans.factory.FactoryBean;

public class UserFactoryBean implements FactoryBean {
    
private String name;
    
private String email;

    
public void setName(String name) {
        
this.name = name;
    }

    
public void setEmail(String email) {
        
this.email = email;
    }

    @Override
    
public Object getObject() throws Exception {
        User user 
= new User();
        user.setName(name 
+ "+");
        user.setEmail(email 
+ "+");
        
return user;
    }

    @SuppressWarnings(
"unchecked")
    @Override
    
public Class getObjectType() {
        
return User.class;
    }

    @Override
    
public boolean isSingleton() {
        
return true;
    }

}

<!-- 定义一个FactoryBean(实现Spring接口的Bean,比如Spring中就有一些关于DataSource的FactoryBean) -->
    
<bean id="fbUserInstance"
        class
="com.sanlea.study.spring2.ch03.UserFactoryBean">
        
<!-- 这里设置的属性设置的是UserFactoryBean实例的属性,而不是UserFactoryBean实例生成的bean的属性 -->
        
<property name="name" value="mm" />
        
<property name="email" value="mm@yinsha.com" />
    
</bean>

二、工厂方法创建bean
   这是利用类的工厂方法创建实例的方法,主要是兼容旧有的代码,还有一些则是必须由一个类生成另一个类的实例的方法。比如说我要实例一个JDBC Connection类,那就要进行很多的步聚,如注册驱动,设置连接相关参数等等,这些并不能直接一个new就搞定,必须要有一定的步骤才能完成,所以就能用方法进行实例化了,在Spring也支持这种方式,主要是指定factory-method属性,如果工厂是一个bean的话就要指定factory-bean了。
下面是一个实例:
package com.sanlea.study.spring2.ch03;

public class StaticFactoryBean {
    
private String name;
    
private String comment;

    
public void setComment(String comment) {
        
this.comment = comment;
    }
    
    
public void print() {
        System.out.println(
"name: " + name);
        System.out.println(
"comment: " + comment);
    }
    
    
private StaticFactoryBean(String name) {
        
this.name = name;
    }
    
    
public static StaticFactoryBean getInstance(String name) {
        
return new StaticFactoryBean(name);
    }
}

<!-- 静态工厂方法创建Bean -->
    
<bean id="staticFactoryBean"
        class
="com.sanlea.study.spring2.ch03.StaticFactoryBean"
        factory-method
="getInstance">
        
<constructor-arg value="juggler" />
        
<property name="comment" value="a good man, but so sad" />
    
</bean>