当前位置: 首页 > 编程笔记 >

Spring BeanFactory和FactoryBean区别解析

司徒钱青
2023-03-14
本文向大家介绍Spring BeanFactory和FactoryBean区别解析,包括了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加上&,则获取到BeanFactory本身的实例;FactoryBean接口对应Spring框架来说占有重要的地位,Spring本身就提供了70多个FactoryBean的实现。他们隐藏了实例化一些复杂的细节,给上层应用带来了便利。从Spring3.0开始,FactoryBean开始支持泛型。

代码展示:

//创建一个Spring定义的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {

  //返回一个Color对象,这个对象会添加到容器中
  @Override
  public Color getObject() throws Exception {
    // TODO Auto-generated method stub
    System.out.println("ColorFactoryBean...getObject...");
    return new Color();
  }
  @Override
  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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

  <bean id="colorFactoryBean" class="spring2.ColorFactoryBean"></bean>

</beans>

测试类:

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍简单了解Spring中BeanFactory与FactoryBean的区别,包括了简单了解Spring中BeanFactory与FactoryBean的区别的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了简单了解Spring中BeanFactory与FactoryBean的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考

  • 本文向大家介绍ipython和python区别详解,包括了ipython和python区别详解的使用技巧和注意事项,需要的朋友参考一下 ipython介绍 IPython 是一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell命令,内置了许多很有用的功能和函数。 IPython 是基于BSD 开源的。 IPyt

  • 本文向大家介绍详解Spring中的FactoryBean,包括了详解Spring中的FactoryBean的使用技巧和注意事项,需要的朋友参考一下 spring  FactoryBean 是创建 复杂的bean,一般的bean 直接用xml配置即可,如果一个bean的创建过程中涉及到很多其他的bean 和复杂的逻辑,用xml配置比较困难,这时可以考虑用FactoryBean 例子如下: 1:创建一

  • 本文向大家介绍AngularJS constant和value区别详解,包括了AngularJS constant和value区别详解的使用技巧和注意事项,需要的朋友参考一下 angularJS可以通过constant(name,value)和value(name,value)对于创建服务也是很重要的。 相同点是:都可以接受两个参数,name和value。 区别: 1.constant(name,

  • 本文向大家介绍iOS atomatic nonatomic区别和理解相关面试题,主要包含被问及iOS atomatic nonatomic区别和理解时的应答技巧和注意事项,需要的朋友参考一下 在平时创建对象的时候,我们会有用到跟,但两者的区别在哪里 atomic 是默认的 对同一对象的set和get的操作是顺序执行的 速度不快,因为要保证操作整体完成 线程安全,需要消耗大量系统资源来为属性加锁 n