Spring BeanFactory和FactoryBean区别解析

网友投稿 247 2022-12-13


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接口中有一个字符常量String FACTORY_BEAN_PREFIX = "&"; 当我们去获取BeanFactory类型的bean时,如果beanName不加&则获取到对应bean的实例;

如果beanName加上&,则获取到BeanFactoriguALLQDDry本身的实例;FactoryBean接口对应Spring框架来说占有重要的地位,Spring本身就提供了70多个FactoryBean的实现。他们隐藏了实例化一些复杂的细节,给上层应用带来了便利。从Spring3.0开始,FactoryBean开始支持泛型。

代码展示:

//创建一个Spring定义的FactoryBean

public class ColorFactoryBean implements FactoryBean {

//返回一个Color对象,这个对象会添加到容器中

@Override

public Color getObject() throws Exception {

// TODO Auto-generated method stub

System.out.println("ColorFactoryBean...getObject...");

return new Color();

}

@Override

http://public Class> getObjectType() {

// TODO Auto-generated method stub

return Color.class;

}

//是单例?

//true:这个bean是单实例,在容器中保存一份

//false:多实例,每次获取都会创建一个新的bean;

@Override

public boolean isSingleton() {

// TODO Auto-generated method stub

return false;

}

}

public class Color {

private Car car;

public Car getCar() {

return car;

}

public void setCar(Car car) {

this.car = car;

}

@Override

public String toString() {

return "Color [car=" + car + "]";

}

}

xml

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:context="http://springframework.org/schema/context"

xsi:schemaLocation="http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/context http://springframework.org/schema/context/spring-context-4.0.xsd">

xmlns:xsi="http://w3.org/2001/XMLSchema-instance"

xmlns:context="http://springframework.org/schema/context"

xsi:schemaLocation="http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans.xsd

http://springframework.org/schema/context http://springframework.org/schema/context/spring-context-4.0.xsd">

测试类:

public class Test1 {

ClassPathXmlApplicationContext xmlBeanFactory = null;

@Before

public void initXmlBeanFactory() {

System.out.println("\n========测试方法开始=======\n");

xmlBeanFactory = new ClassPathXmlApplicationContext("spring3.xml");

}

@After

public void after() {

System.out.println("\n========测试方法结束=======\n");

}

@Test

public void test8() {

System.out.println(xmlBeanFactory.getBean("colorFactoryBean"));

System.out.println("===================");

System.out.println(xmlBeanFactory.getBean("&colorFactoryBean"));

}

}

测试结果:

========测试方法开始=======

十二月 09, 2019 4:49:52 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh

信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2e5c649: startup date [Mon Dec 09 16:49:52 CST 2019]; root of context hierarchy

十二月 09, 2019 4:49:52 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions

信息: Loading XML bean definitions from class path resource [spring3.xml]

ColorFactoryBean...getObject...

Color [car=null]

===================

spring2.ColorFactoryBean@6ddf90b0

========测试方法结束=======


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用IntelliJ IDEA查看类的继承关系图形(图文详解)
下一篇:SpringBoot整合Swagger2代码实例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~