spring中有俩种bean,一种是普通的bean、一种是工厂bean;既是FactoryBean。先看FactoryBean接口定义
<textarea cols="50" rows="15" name="code" class="java">package org.springframework.beans.factory; public interface FactoryBean { Object getObject() throws Exception; Class getObjectType(); boolean isSingleton(); } </textarea>
工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个对象实例,而是该工厂Bean的getObject方法所返回的对象。在Spring框架内部,AOP相关的功能及事务处理中,很多地方使用到工厂Bean,本文简单YY工厂Bean的用法。 eg:
package com.moretry.morethink.test;
public class FactoryBeanTest implements FactoryBean {
private String flag;
public void setFlag(String flag)
{
this.flag=flag;
}
public Object getObject() throws Exception {
if("date".equals(flag))return new Date();
else return new String("这是一个String");
}
public Class getObjectType() {
return "date".equals(flag)?Date.class:String.class;
}
public boolean isSingleton() {
return false;
}
}
工厂bean的配置文件 textBeanFactory.xml
<bean name="testFactoryBean" class="springroad.deomo.chap4.FactoryBeanTest"/>
<bean name="testFactoryBean1" class="springroad.deomo.chap4.FactoryBeanTest"><property name="flag" value="date"/></bean>
测试代码:
Resource res=new ClassPathResource("stextBeanFactory.xml");
BeanFactory factory=new XmlBeanFactory(res);
System.out.println(factory.getBean("testFactoryBean").getClass());
System.out.println(factory.getBean("testFactoryBean1").getClass());
运行结果:
class java.lang.String
class java.util.Date
很显然结果是根据FactoryBeanTest 的getObject()返回值来执行的。
但是如果我们需要返回FactoryBean的实例,而非是getObject()返回值呢?该如何处理?
很简单,bean的名称前加上一个特殊符号“&”即可得到该工厂bean的实例了。如下:
System.out.println(factory.getBean("&testFactoryBean").getClass());
System.out.println(factory.getBean("&testFactoryBean1").getClass());
运行结果如下:
com.moretry.morethink.test.FactoryBeanTest
ccom.moretry.morethink.test.FactoryBeanTest
就写到这里了。