spring自定义FactoryBean

来源:互联网 发布:mac live photo 编辑 编辑:程序博客网 时间:2024/05/16 15:27

FactoryBean是spring容器提供的一种可以扩展容器对象实例化的逻辑接口,一定不要与BeanFactory搞混淆,BeanFactory是一个创建对象的工厂,主语是Factory,而FactoryBean主语是Bean,只是一个bean而已。

如何自定义bean呢?分以下几个步骤

1 实现FactoryBean接口.该接口有三个抽象方法

   public Object getObject() throws Exception 用于返回产生的对象

   public Class getObjectType() 返回产生对象的类型

   public boolean isSingleton() 所要生产的对象是singleton形式存在容器中。


package com.sxt.domain;import java.util.*;import org.springframework.beans.factory.FactoryBean;public class NextDayDateFactoryBean implements FactoryBean {public Object getObject() throws Exception {      return new Date();}public Class getObjectType() { return Date.class;}public boolean isSingleton() {  return true;}}

package com.sxt.domain;import java.util.*;public class Bean {private String name;private Date date;public Bean( ) {  }public Bean(String name) { this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}}


2 配置xml文件

 <bean id="nextDayDateFactoryBean" class="com.sxt.domain.NextDayDateFactoryBean" >         </bean>                <bean id="bean" class="com.sxt.domain.Bean"   >           <property name="date" ref="nextDayDateFactoryBean"></property>     </bean> 

会发现在以上Bean类中 date属性是一个Date类型,但是所引用的nextDayDateFactoryBean却是一 个com.sxt.domain.NextDayDateFactoryBean类型,这说明通过id引用返回的并不是一个自身的类型,而是FactoryBean所产生对象的类型,就是getObjectType方法产生的类型


3 测试  

  

Bean bean=(Bean)factory.getBean("bean");System.out.println(bean.getDate());
打印出:Mon Aug 04 13:22:00 GMT 2014

 

 Date date=(Date)factory.getBean("nextDayDateFactoryBean");
以上打印出:Mon Aug 04 13:22:00 GMT 2014

咦,通过这个id返回的是Date类型的对象,也就是getObject所产生的对象,那么我们如何来求的本身的对象呢,

这时我们可以通过添加&前缀来获取NextDayDateFactoryBean类型的对象 


 NextDayDateFactoryBean nextDayDateFactoryBean=(NextDayDateFactoryBean)factory.getBean("&nextDayDateFactoryBean"); System.out.println(nextDayDateFactoryBean.getObject().getClass());
这时才打印出 class java.util.Date


spring很多地方使用了FactoryBean,如

SqlMapClientFactoryBean

TransactionProxyFactoryBean

是不是有点眼熟呢,对,在集成持久层框架就用到了它们。



0 0
原创粉丝点击