Spring BeanFactory和FactoryBean区别解析
BeanFactory接口:
IoC容器的顶级接口,是IoC容器的最基础实现,也是访问Spring容器的根接口,负责对bean的创建,访问等工作。
其实在容器的初始化的时候,会对BeanFactory做很多事情,如:
obtainFreshBeanFactory();获取BeanFactory;
prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置)
postProcessBeanFactory(beanFactory);BeanFactory准备工作完成后进行的后置处理工作;
invokeBeanFactoryPostProcessors(beanFactory);执行BeanFactoryPostProcessor的方法;
BeanFactoryPostProcessor:BeanFactory的后置处理器。在BeanFactory标准初始化之后执行的;
FactoryBean接口:
可以返回bean的实例的工厂bean,通过实现该接口可以对bean进行一些额外的操作,例如根据不同的配置类型返回不同类型的bean,简化xml配置等。在使用上也有些特殊,BeanFactory接口中有一个字符常量StringFACTORY_BEAN_PREFIX="&";当我们去获取BeanFactory类型的bean时,如果beanName不加&则获取到对应bean的实例;
如果beanName加上&,则获取到BeanFactory本身的实例;FactoryBean接口对应Spring框架来说占有重要的地位,Spring本身就提供了70多个FactoryBean的实现。他们隐藏了实例化一些复杂的细节,给上层应用带来了便利。从Spring3.0开始,FactoryBean开始支持泛型。
代码展示:
//创建一个Spring定义的FactoryBean publicclassColorFactoryBeanimplementsFactoryBean{ //返回一个Color对象,这个对象会添加到容器中 @Override publicColorgetObject()throwsException{ //TODOAuto-generatedmethodstub System.out.println("ColorFactoryBean...getObject..."); returnnewColor(); } @Override publicClass>getObjectType(){ //TODOAuto-generatedmethodstub returnColor.class; } //是单例? //true:这个bean是单实例,在容器中保存一份 //false:多实例,每次获取都会创建一个新的bean; @Override publicbooleanisSingleton(){ //TODOAuto-generatedmethodstub returnfalse; } }
publicclassColor{ privateCarcar; publicCargetCar(){ returncar; } publicvoidsetCar(Carcar){ this.car=car; } @Override publicStringtoString(){ return"Color[car="+car+"]"; } }
xml
测试类:
publicclassTest1{ ClassPathXmlApplicationContextxmlBeanFactory=null; @Before publicvoidinitXmlBeanFactory(){ System.out.println("\n========测试方法开始=======\n"); xmlBeanFactory=newClassPathXmlApplicationContext("spring3.xml"); } @After publicvoidafter(){ System.out.println("\n========测试方法结束=======\n"); } @Test publicvoidtest8(){ System.out.println(xmlBeanFactory.getBean("colorFactoryBean")); System.out.println("==================="); System.out.println(xmlBeanFactory.getBean("&colorFactoryBean")); } }
测试结果:
========测试方法开始======= 十二月09,20194:49:52下午org.springframework.context.support.ClassPathXmlApplicationContextprepareRefresh 信息:Refreshingorg.springframework.context.support.ClassPathXmlApplicationContext@2e5c649:startupdate[MonDec0916:49:52CST2019];rootofcontexthierarchy 十二月09,20194:49:52下午org.springframework.beans.factory.xml.XmlBeanDefinitionReaderloadBeanDefinitions 信息:LoadingXMLbeandefinitionsfromclasspathresource[spring3.xml] ColorFactoryBean...getObject... Color[car=null] =================== spring2.ColorFactoryBean@6ddf90b0 ========测试方法结束=======
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。