使用FactoryBean自定义实例化逻辑
Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean,这两种Bean都被容器管理,但工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该FactoryBean的getObject方法所返回的对象。在Spring框架内部,有很多地方有FactoryBean的实现类,它们在很多应用如(Spring的AOP、ORM、事务管理)及与其它第三框架(ehCache)集成时都有体现.
对象实现org.springframework.beans.factory.FactoryBean接口,则成为它本身的工厂。
FactoryBean接口是Spring IoC容器实例化逻辑的扩展点。假如初始化代码非常复杂,此时使用java编码比使用XML配置更容易表达。这种场景中,就可以自定义FactoryBean,在类中撰写复杂的初始化程序,并将其作为插件加入到容器中。
FactoryBean接口有3个方法:
Object getObject():返回本工厂创建的对象实例。此实例也许是共享的,依赖于该工厂返回的是单例或者是原型。
boolean isSingleton():如果FactoryBean返回的是单例,该方法返回值为true,否则为false
Class getObjectType():返回对象类型。对象类型是getObject()方法返回的对象的类型,如果不知道的类型则返回null。
FactoryBean概念和接口在Spring框架中大量使用。Spring内置的有超过50个实现。
当使用ApplicationContext的getBean()方法获取FactoryBean实例本身而不是它所产生的bean,则要使用&符号+id。比如,现有FactoryBean,它有id,在容器上调用getBean("myBean")将返回FactoryBean所产生的bean,调用getBean("&myBean")将返回FactoryBean它本身的实例。
package spring4;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;
/**
* Created by javajidi_com
*/
@Component("myFactoryBean")
public class MyFactoryBean implements FactoryBean<Compent> {
public Compent getObject() throws Exception {
return new Compent();//这里可以进行负责的对象创建逻辑
}
public Class<?> getObjectType() {
return Compent.class;
}
public boolean isSingleton() {
return true;//是否是单列
}
}
package spring4;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* Created by javajidi_com
*/
public class Application {
public static void main(String[] arg){
//初始化spring容器,由于使用的是注解,没有xml文件,所有不再使用ClasspathXmlApplicationContext
ApplicationContext context=new AnnotationConfigApplicationContext(Config.class);
Object o1=context.getBean("myFactoryBean");
Object o2=context.getBean("&myFactoryBean");
System.out.println(o1.getClass());
System.out.println(o2.getClass());
}
}
输出
class spring4.Compent
class spring4.MyFactoryBean
微信公众号: javajidi_com
技术交流群: 245130488