FactoryBean接口的使用

BeanFactory

Spring Ioc 容器是一个管理 Bean 的容器, 它要求所有的 Ioc 容器都需要实现接口 BeanFactory, 它是一个顶级的容器接口:

image-20220101223618808

上面的变量主要用来获取 Factory_Bean 的实例 Factory_Bean 作用是用户使用可使用一套比较复杂的逻辑进生成 Bean, 实现了这个接口之后, Spring 在初始时, 会把实现了该接口的 Bean 取出来, 使用 getObject 方法来生产我们想要 Bean。

BeanFactory 和 FactoryBean 的区别

  • BeanFactory:是提供了 IOC 容器最基本的形式操作的接口,给具体的 IOC 容器的实现提供了规范,BeanFactory,以 Factory 结尾,表示它是一个工厂类(接口),它负责生产和管理 bean 的一个工厂。在 Spring 中,BeanFactory 是 IOC 容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象以及建立这些对象间的依赖。BeanFactory 只是个接口,并不是 IOC 容器的具体实现,但是 Spring 容器给出了很多种实现,如 DefaultListableBeanFactoryXmlBeanFactoryApplicationContext 等,其中 XmlBeanFactory 就是常用的一个,该实现将以 XML 方式描述组成应用的对象及对象间的依赖关系。BeanFactoryApplicationContext 就是 Spring 框架的两个 IOC 容器,现在一般使用 ApplicationnContext,其不但包含了 BeanFactory 的作用,同时还进行了更多的扩展。BeanFacotry 是 Spring 中比较原始的 Factory。原始的 BeanFactory 无法支持 Spring 的许多插件,如 AOP 功能、Web 应用等。ApplicationContext 接口, 它由 BeanFactory 接口派生而来,ApplicationContext 包含 BeanFactory 的所有功能。
  • FactoryBean:一般情况下,Spring 通过反射机制利用 <bean>class 属性指定实现类实例化 Bean,在某些情况下,实例化 Bean 过程比较复杂,如果按照传统的方式,则需要在 <bean> 中提供大量的配置信息。配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。Spring 为此提供了一个 org.springframework.bean.factory.FactoryBean 的工厂类接口,用户可以通过实现该接口定制实例化 Bean 的逻辑。

使用 FactoryBean

在 factory 包当中创建 StudentFactoryBean.java:

/**
 * @author BNTang
 * @version V1.0
 * @project spring
 * @date Created in 2022/1/1 /001 22:56
 * @description
 **/
public class StudentFactoryBean implements FactoryBean<Student> {
   /**
    * 得到自定义对象
    *
    * @return {@link Student}
    * @throws Exception 异常
    */
   @Override
   public Student getObject() throws Exception {
      return new Student();
   }

   /**
    * 得到对象类型
    *
    * @return {@link Class}<{@link ?}>
    */
   @Override
   public Class<?> getObjectType() {
      return Student.class;
   }
}

在配置文件当中进行配置 StudentFactoryBean:

<bean id="studentFactoryBean" class="top.it6666.factory.StudentFactoryBean"/>

直接使用获取的是 Student 的实例:

image-20220101230156344

public static void main(String[] args) {
   ApplicationContext applicationContext = new FileSystemXmlApplicationContext("classpath:spring-config.xml");
   System.out.println(applicationContext.getBean("studentFactoryBean"));
}

使用 & 符号获得的是 FactoryBean 实例:

image-20220101230318123

public static void main(String[] args) {
   ApplicationContext applicationContext = new FileSystemXmlApplicationContext("classpath:spring-config.xml");
   System.out.println(applicationContext.getBean("&studentFactoryBean"));
}
posted @   BNTang  阅读(333)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示