首页 > 其他分享 >Spring 中 BeanFactory 和 FactoryBean

Spring 中 BeanFactory 和 FactoryBean

时间:2024-03-16 16:00:13浏览次数:19  
标签:String BeanFactory Spring Bean FactoryBean throws name

在Spring中,有两个很容易混淆的类:BeanFactory和FactoryBean。前者是Factory也就是IOC容器或对象工厂,后者是Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对于FactoryBean而言,这个Bean不是普通的Bean,而是一个能产生或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。

两者其实都是Spring提供的接口,如下:


public interface FactoryBean<T> {
  T getObject() throws Exception;
  Class<?> getObjectType();
  boolean isSingleton();
}

public interface BeanFactory {
  String FACTORY_BEAN_PREFIX = "&";
  Object getBean(String name) throws BeansException;
  <T> T getBean(String name, Class<T> requiredType) throws BeansException;
  <T> T getBean(Class<T> requiredType) throws BeansException;
  Object getBean(String name, Object... args) throws BeansException;
  <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
  boolean containsBean(String name);
  boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
  boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
  boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
  boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
  Class<?> getType(String name) throws NoSuchBeanDefinitionException;
  String[] getAliases(String name);
}

BeanFactory 就是我们常说的Spring容器,其内包含着大量的Bean,我们可以从BeanFactory 获取到想要的Bean,或者查询Bean的一些信息。

而FactoryBean则是众多Bean里的一种,只不过这种Bean是一种辅助Bean或者说中间人,它的作用是为你提供另一个或者一些Bean。

FactoryBean

先来看一下FactoryBean的基础用法,简而言之就是实现FactoryBean接口,然后重写其中的getObject方法,如下:


public class ConfigLoaderFactoryBean implements FactoryBean<ConfigLoader> {
    private String configLocation;

    public void setConfigLocation(String configLocation) {
        this.configLocation = configLocation;
    }

    @Override
    public ConfigLoader getObject() throws Exception {
        if (configLocation.startsWith("file:")) {
            LocalConfigLoader configLoader = new LocalConfigLoader();
            configLoader.setFilePath(configLocation.substring(5));
            return configLoader;
        } else if (configLocation.startsWith("http:")) {
            RemoteConfigLoader configLoader = new RemoteConfigLoader();
            configLoader.setServerUrl(configLocation);
            return configLoader;
        } else {
            throw new IllegalArgumentException("Unsupported config location: " + configLocation);
        }
    }

    @Override
    public Class<?> getObjectType() {
        return ConfigLoader.class;
    }
}

然后把这个factoryBean放入容器中,可以采用xml或者@Bean等形式注入。


<bean id="configLoader" class="com.example.ConfigLoaderFactoryBean">
    <property name="configLocation" value="http://example.com/config.json"/>
</bean

FactoryBean的必要性

FactoryBean其实相当于一个中间人,我们获取它,往往不是需要它本身,而是希望通过它获得另一个Bean,自然的我们会产生疑问,为什么要多此一举?如果我们通过它是为了获得另一个Bean,那么为什么不直接实例化另一个Bean然后放入Spring容器呢?比如在方法上使用@Bean注解。

 factoryBean接口的诞生更早,所以早期很多的结构采用了这种方式。后续有了@Bean注解以后,在方法上使用@Bean注解也能实现复杂Bean的创建了。

那是不是所有情况都能使用@Bean来替代factoryBean呢?比如我们想每次获取的Bean都是实时的,又比如我们需要一个计时器Bean,但你注入的Bean都被固定了,只有通过工厂,才能每次获取都能得到一个实时的新Bean。同样的,使用factoryBean还有一个懒加载的作用,对于某些复杂的Bean能在获取时再进行实例化。

BeanFactory

BeanFactory与ApplicationContext

提及BeanFactory,首先我们会想到Spring的重要特性IOC,IOC要求有一个能管理所有Bean的管家,而管家需要一个盛放这些Bean的容器,这个容器就是BeanFactory。

尽管我们在日常项目中,使用的容器是具有更全功能的ApplicationContext,但ApplicationContext也是BeanFactory的子接口,其除了单纯的容器功能外,还有配置元信息,应用事件机制,资源管理等功能,所以我们可以说ApplicationContext是BeanFactory的增强版本。

BeanFactory的使用

在早期的spring项目中,经常会在代码中指定使用某种BeanFactory ,并且使用下面的方式去加载资源。

 //读取核心的配置文件
ClassPathResource resource = new ClassPathResource("MyContext.xml");
BeanFactory BeanFactory = new XmlBeanFactory(resource);

顾名思义XmlBeanFactory就是能够读取并解析xml资源,解析出各种Bean后存入自身,而在后期,springboot的大规模使用后,其内置的工厂可以解析xml、properties以及注解等多种配置来源。

当然,其实Spring本身就有相当的自动化程度,比如当我们在启动类上使用。

@ImportResource(location = {"classpath:MyContext.xml"})

它也能导入内容,并根据资源后缀是否为".groovy"判断是使用GroovyBeanDefinitionReader.class 还是 XmlBeanDefinitionReader.class,对资源解析完成后,把Bean定义注册进BeanFactory中。

总结

可以发现:BeanFactory 和 FactoryBean 除了名字相似、都能包含一些Bean实例之外,其实没有什么相同的地方。前者是SpringIOC的核心,是存放一切Bean的容器;后者只不过是对复杂Bean的一种包装,比如我们常用的myBatis组件,针对各个mapper级接口生成的Bean实例,就是以FactoryBean的形式存在Spring容器中的。

 

标签:String,BeanFactory,Spring,Bean,FactoryBean,throws,name
From: https://blog.csdn.net/m0_68642284/article/details/136761704

相关文章

  • Spring-Boot整合Redis
    Spring-boot整合Redis导入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>配置redis在application.yml下增加redis的相关配置sprin......
  • 基于springboot的房屋租赁系统
    基于springboot的房屋租赁系统文章目录基于springboot的房屋租赁系统引言功能演示视频开发环境系统功能介绍功能对照表功能截图编程框架SpringBoot框架SSM框架vue框架示例代码数据库操作示例源码获取引言博主介绍:✌专注于Java技术领域和学生毕业项目实战,欢......
  • SpringBoot - [00] 注解大全
      @SpringBootApplication这个注解用于标识一个SpringBoot应用的主类。它整合了@Configuration,@EnableAutoConfiguration,@ComponentScan。@SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.......
  • 快速创建一个spring-boot-starter
    可以使用springspi和import两种方法1.导入starter依赖1.1.maven管理工具<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>1.2.gradle管理工......
  • 基于Spring Boot+Vue的校园二手交易平台
    目录一、绪论1.1开发背景1.2系统开发平台1.3系统开发环境二、需求分析2.1问题分析2.2系统可行性分析2.2.1技术可行性2.2.2操作可行性2.3系统需求分析2.3.1学生功能需求2.3.2管理员功能需求2.3.3游客功能需求三、系统设计3.1功能结构图3.2E-R模型3.3数......
  • Spring Schedule定时任务进阶篇(调度器)
    SpringSchedule背后支持多种任务调度方案,如JDKTimer、concurrent包下的ScheduledExecutorService以及Quartz等。Spring通过封装这些底层实现,为开发者提供了统一的接口和配置方式来处理定时任务。接下来通过SpringBoot+数据库来实现根据数据库数据来动态管理我们的定时任务,我这......
  • springboot/java/php/node/python农产品销售系统小程序【计算机毕设】
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着互联网技术的迅猛发展,传统农产品销售模式正逐步向线上转移。小程序作为移动互联网的一种轻量级应用,因其开发成本低、传播快、使用方便等特点,成为连接......
  • Spring Bean的生命周期流程
    前言Java中的公共类称之为JavaBean,而Spring中的Bean指的是将对象的生命周期,交给SpringIoC容器来管理的对象。所以Spring中的Bean对象在使用时,无需通过new来创建对象,只需要通过DI(依赖注入),从Spring中取出要使用的对象即可。在Spring框架中单实例Bean的初始化......
  • Spring框架与其他框架(如Struts、Hibernate等)相比有何独特之处?Spring框架的主要优点有
    Spring框架与其他框架(如Struts、Hibernate等)相比有何独特之处?在Spring框架的面试中,可能会被问到的问题涵盖多个方面,包括但不限于以下几个方面:Spring框架的基本理解:请简述一下你对Spring框架的理解。Spring框架的主要优点有哪些?Spring框架与其他框架(如Struts、Hibernate......
  • 解释一下Spring中的IoC(控制反转)和DI(依赖注入)是什么,它们之间有何关系?Spring的Bean的生
    解释一下Spring中的IoC(控制反转)和DI(依赖注入)是什么,它们之间有何关系?在Spring框架中,IoC(控制反转)和DI(依赖注入)是两个核心概念,它们对于实现松耦合和高度可配置的应用程序至关重要。IoC(控制反转):IoC,即控制反转,是一种设计思想,其核心思想是将原本由代码直接操控的对象的调用权交......