Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean。工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象。
使用场景:1、通过外部对类是否是单例进行控制,该类自己无法感知 2、对类的创建之前进行初始化的操作,在afterPropertiesSet()中完成。
实例一:
基础类:Student.java
工厂类:StuFactory.java
注入到配置文件中:
测试:
测试结果:
studentclassinitialized.true
【注意】
1、返回的是getObject()中说明的类型,而不是创建工厂的类型,与普通的javabean不一样
2、创建出来的对象是否属于单例由isSingleton中的返回决定。
实例二:
FactoryBeanDemo.java
配置文件:
测试:
由此可见,虚拟主机,网站空间,通过使用FactoryBean,我们可以得到不同类型的对象实例。这也就是我们在AOP中通过设置calss为ProxyFactoryBean可以返回不同类型的业务对象的原理。在实际应用中若能灵活使用FactoryBean,则可以给应用程序增加很多的魔幻功能。
测试结果:
一个小窍门:FactoryBean还藏有一个技巧,也就是在我们实际需要返回FactoryBean实例时,应该怎么办。也就是我们在应用程序中需要通过容器得到一个FactoryBean。此时,免备案空间,需要使用特殊的方式,即在bean的名称前加上一个特殊符号“&”即可。即:System.out.println(factory.getBean("&myFactoryBean").getClass());
心有多大,舞台就有多大