如何使用spring的FactoryBean
1、在开始定义我们自己的工厂bean之前,先介绍下FactoryBean这个接口类有哪些方法:
T getObject():返回实际工厂bean创建的bean实例,如果是单实例,会放到spring的缓存池中
boolean isSingleton():返回bean实例的作用域是singleton还是prototype。
Class<T> getObjectType():返回工厂创建的bean类型。

2、首先创建一个简单书本对象类
/**
* Created by shaowei on 2017/7/13.
* 书本
*/
public class Book {
/**
* 名字
*/
private String name;
/**
* 价格
*/
private double price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
3、创建BookFactoryBean类,实现FactoryBean接口
/**
* Created by shaowei on 2017/7/13.
* 书本工厂bean
*/
public class BookFactoryBean implements FactoryBean<Book> {
@Override
public Book getObject() throws Exception {
Book book = new Book();
book.setName("spring");
book.setPrice(80.0);
return book;
}
@Override
public Class<?> getObjectType() {
return Book.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
4、创建测试工厂bean测试类
/**
* Created by shaowei on 2017/7/13.
* spring工厂bean测试类
*/
public class TestFactoryBean {
@Test
public void testGetBean(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-test.xml");
System.out.println(context.getBean("book"));
System.out.println(context.getBean("&book"));
}
}
5、可以选中一个测试方法,右键运行testGetBean测试类方法,如果不选中,默认是运行本测试类所有case方法

6、运行完成之后,可以从打印的结果中看到getBean("book")获取的是Book类的实例,getBean("&book")获取的则是BookFactoryBean工厂bean的实例

7、以上就是自定义方式使用spring的FactoryBean。我们也可以看看spring类库里已有的FactoryBean的实现例子,EhCacheManagerFactoryBean就是其中之一:
@Override
public CacheManager getObject() {
return this.cacheManager;
}
@Override
public Class<? extends CacheManager> getObjectType() {
return (this.cacheManager != null ? this.cacheManager.getClass() : CacheManager.class);
}
@Override
public boolean isSingleton() {
return true;
}
