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>