FactoryBean和BeanFactory都是spring的一个类工厂,BeanFactory只能生产一种类型的类,FactoryBean可以生产两种类型的类,一种跟BeanFactory类似,生产的是当前对象,另一种是通过getObject()返回的对象。
FactoryBean要返回当前本身的对象时,需要在getBean()时,在获取的对象前面加&,如:getBean("&daoFactoryBean")。当一个类依赖关系很复杂的时候,而我们有需要使用这个类对象时采用FactoryBean获取。如我们mybatis中经常使用的sqlSessionFactory 对象,他就是通过 SqlSessionFactoryBean实现FactoryBean,通过getObject()方法获取的。
FactoryBean通过getObject()获取对象示例如下:
@Component("daoFactoryBean") public class DaoFactoryBean implements FactoryBean { public void testBean(){ System.out.println("testBean"); } @Override public Object getObject() throws Exception { return new TempDaoFactoryBean(); } public Class<?> getObjectType() { return TempDaoFactoryBean.class; } @Override public boolean isSingleton() { return true; } }
public class TempDaoFactoryBean { public void test(){ System.out.println("FactoryBean"); } }
public class Test { public static void main(String[] args) { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(Appconfig.class); TempDaoFactoryBean temp = (TempDaoFactoryBean)ac.getBean("daoFactoryBean"); temp.test(); } } 运行结果:FactoryBean
FactoryBean获取本身对象示例:
public class Test { public static void main(String[] args) { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(Appconfig.class); DaoFactoryBean temp = (DaoFactoryBean)ac.getBean("&daoFactoryBean"); temp.testBean(); } }
运行结果:testBean