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

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

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

(0)

相关推荐

  • 深入了解Spring中的FactoryBean

    FactoryBean和BeanFactory由于在命名上极其相似,一直以来困扰了不少的开发者. BeanFactory,耳熟能详的Spring核心接口,提供IoC容器的最基本功能.但要解释FactoryBean一句话可能就说不清楚了.我们将从下面的例子逐步说明,FactoryBean是什么,它提供了什么样的能力. /** * 布料 * 包含颜色属性 * Created by OKevin On 2019/9/3 **/ public class Cloth { private Red red;

  • Spring实战之使用TransactionProxyFactoryBean实现声明式事务操作示例

    本文实例讲述了Spring实战之使用TransactionProxyFactoryBean实现声明式事务操作.分享给大家供大家参考,具体如下: 一 配置文件 <?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.

  • 简单了解Spring中BeanFactory与FactoryBean的区别

    这篇文章主要介绍了简单了解Spring中BeanFactory与FactoryBean的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在Spring中有BeanFactory和FactoryBean这2个接口,从名字来看很相似,比较容易搞混. 一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层规范,是SpringIoc容器的核心接口,它定义了getBean().containsBean()等管理Be

  • Spring基于ProxyFactoryBean创建AOP代理

    Spring 通知类型 通过前面的学习可以知道,通知(Advice)其实就是对目标切入点进行增强的内容,Spring AOP 为通知(Advice)提供了 org.aopalliance.aop.Advice 接口. Spring 通知按照在目标类方法的连接点位置,可以分为以下五种类型,如表 1 所示. 表 1 Spring 通知的 5 种类型 名称 说明 org.springframework.aop.MethodBeforeAdvice(前置通知) 在方法之前自动执行的通知称为前置通知,可以

  • spring如何通过FactoryBean配置Bean

    这篇文章主要介绍了spring如何通过FactoryBean配置Bean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Car.java package com.gong.spring.beans.factoryBean; public class Car { private String name; private double price; public String getName() { return name; } public vo

  • spring中的BeanFactory与FactoryBean的讲解

    1.BeanFactory 1.1Spring提供了IOC容器的两种实现方式 ① BeanFactory:IOC容器的基本实现,是Spring内部的基础设施,是面向Spring本身的,不是提供给开发人员使用的. ② ApplicationContext:BeanFactory的子接口,提供了更多高级特性.面向Spring的使用者,几乎所有场合都使用ApplicationContext而不是底层的BeanFactory. 1.2 ApplicationContext的主要实现类 ClassPath

  • Spring BeanFactory和FactoryBean区别解析

    BeanFactory接口: IoC容器的顶级接口,是IoC容器的最基础实现,也是访问Spring容器的根接口,负责对bean的创建,访问等工作. 其实在容器的初始化的时候,会对BeanFactory做很多事情,如: obtainFreshBeanFactory();获取BeanFactory: prepareBeanFactory(beanFactory);BeanFactory的预准备工作(BeanFactory进行一些设置) postProcessBeanFactory(beanFacto

  • Spring BeanFactory 与 FactoryBean 的区别详情

    目录 区别和联系 BeanFactory FactoryBean 总结 前言: 在 Spring 中, IOC 是很重要的概念,其本质就是 map 结构,存储容器和业务 Bean 信息.但是 BeanFactory 和 FactoryBean 的区别却是一个很重要的知识点,在本文中将结合源码进行分析讲解. 区别和联系 BeanFactory 在 Spring 中,所有的 Bean 都是由 BeanFactory (也就是 IOC 容器)来进行管理的.BeanFactory 定义了容器的基本形式,

  • BeanFactory和FactoryBean的区别示例详解

    目录 正文 BeanFactory和FactoryBean的区别 1.BeanFactory 2.FactoryBean 正文 这个之前经常会遇到别人问 但是一直不是很能理解 工作开发中我对于bean的使用比较少 就是偶尔启动出错才会出现 可能是水平有限 但是bean 也是非常核心的问题 书到用时方恨少 且看且珍惜 BeanFacotry是spring中比较原始的Factory. 如XMLBeanFactory就是一种典型的BeanFactory.原始的BeanFactory无法支持spring

  • spring中的FactoryBean代码示例

    上篇文章中我们介绍了浅谈Spring的两种配置容器,接下来我们就了解下spring中的FactoryBean的相关内容,具体如下. 从SessionFactory说起: 在使用SSH集成开发的时候,我们有时候会在applicationContext.xml中配置Hibernate的信息,下面是配置SessionFactory的一段示例代码: <bean id="sessionFactory" class="org.springframework.orm.hibernat

  • Spring Boot启动过程完全解析(二)

    上篇给大家介绍了Spring Boot启动过程完全解析(一),大家可以点击参考下 该说refreshContext(context)了,首先是判断context是否是AbstractApplicationContext派生类的实例,之后调用了强转为AbstractApplicationContext类型并调用它的refresh方法.由于AnnotationConfigEmbeddedWebApplicationContext继承自EmbeddedWebApplicationContext,所以会

  • spring springMVC中常用注解解析

    一,使用注解: 在spring的配置文件applicationContext.xml中,加入注解扫描.配置项就配置了对指定的包进行扫描,以实现依赖注入. <?xml version="1.0" encoding="UTF-8"?> <span style="font-size:18px;"><beans xmlns="http://www.springframework.org/schema/beans&q

  • Spring Cloud Feign组件实例解析

    这篇文章主要介绍了Spring Cloud Feign组件实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 采用Spring Cloud微服务框架后,经常会涉及到服务间调用,服务间调用采用了Feign组件. 由于之前有使用dubbo经验.dubbo的负载均衡策略(轮训.最小连接数.随机轮训.加权轮训),dubbo失败策略(快速失败.失败重试等等), 所以Feign负载均衡策略的是什么? 失败后是否会重试,重试策略又是什么?带这个疑问,查了

  • Spring Bean实例化实现过程解析

    这篇文章主要介绍了Spring Bean实例化实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Bean的实例化 1.构造器实例化:Spring容器通过Bean对应类中默认的无参构造方法来实例化Bean package com.itheima.instance.constructor; public class Bean1 { } <?xml version="1.0" encoding="UTF-8&quo

  • iOS开发中#import、#include和@class的区别解析

    1. 一般来说,导入objective c的头文件时用#import,包含c/c++头文件时用#include. 2. #import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题.<标记> 所以,#import比起#include的好处就是不会引起交叉编译. #import && #class: 1. import会包含这个类的所有信息,包括实体变量和方法(.h文件中),而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,后面会再告

随机推荐