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 TestFactoryBea荏鱿胫协n { @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就是其中之一:@Overridepublic CacheManager getObject() { return this.cacheManager;}@Overridepublic Class<? extends CacheManager> getObjectType() { return (this.cacheManager != null ? this.cacheManager.getClass() : CacheManager.class);}@Overridepublic boolean isSingleton() { return true;}