欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring应用手册--FactoryBean接口

程序员文章站 2022-06-24 12:54:23
戴着假发的程序员出品 抖音ID:戴着假发的程序员欢迎关注FactoryBean接口 spring应用手册(第五部分) FactoryBean是一个工厂Bean,可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程。BeanFactory是Spring容器中的一个基本类也是很重要的一个类,在BeanFactory中可以创建和管理Spring容器中的Bea...

戴着假发的程序员出品 抖音ID:戴着假发的程序员欢迎关注

FactoryBean接口

spring应用手册(第五部分)


FactoryBean是一个工厂Bean,可以生成某一个类型Bean实例,它最大的一个作用是:可以让我们自定义Bean的创建过程。BeanFactory是Spring容器中的一个基本类也是很重要的一个类,在BeanFactory中可以创建和管理Spring容器中的Bean,它对于Bean的创建有一个统一的流程。
我们来看看源码:

/*
 * Copyright 2002-2018 the original author or authors.
 */
public interface FactoryBean<T> {
   /**
    * 返回当前bean工厂创建的bean的实例
    */
   @Nullable
   T getObject() throws Exception;
   /**
    * 返回当前工程创建的bean的类型
    */
   @Nullable
   Class<?> getObjectType();
   /**
    * 判断当前类是否是单利模式
    */
   default boolean isSingleton() {
      return true;
   }
}

在spring框架的底层这个创建bean的方式使用的比较多。

我们现在自己写一个案例看看它的使用方式:

我们准备一个Bean:

/**
 * @author 戴着假发的程序员
 * @company http://www.boxuewa.com
 * @description
 */
public class Coder{
    //构造方法
    public Coder(){
        System.out.println("实例化Coder对象");
    }
}

自定一个CoderFactory实现接口FactoryBean,定义泛型为Coder。默认方法isSingleton就不实现了。

/**
 * @author 戴着假发的程序员
 * @company http://www.boxuewa.com
 * @description
 */
public class CoderFactory implements FactoryBean<Coder> {
    @Override
    public Coder getObject() throws Exception {
        //手动创建Coder并且返回
        System.out.println("CoderFactory创建对象");
        return new Coder();
    }
    @Override
    public Class<Coder> getObjectType() {
        return Coder.class;
    }
}

在配置文件中进行配置,详细说明请看代码中的注释:

<?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:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!-- 使用BeanFactory方式注册Bean-->
    <!-- 这里注意,我们配置的class不是Coder而是我们的CoderFactory -->
    <bean id="coder" class="com.st.dk.demo10.factory.CoderFactory"/>
</beans>

这里一定要注意,我们的class配置的是CoderFactory,spring在加载这个类的时候,会自动检查这个类是不是FactoryBean,如果是则通过调用其getObject方法得到实例对象。

测试:

@Test
public void testFactoryBean(){
    ApplicationContext ac =
            new ClassPathXmlApplicationContext("applicationContext-demo10.xml");
    System.out.println(ac.getBean(Coder.class));
}

Spring应用手册--FactoryBean接口
这里要注意,如果我们是使用FactoryBean的方式创建对象的,那么默认情况下spring只会创建对应的Factory对象,而不会主动调用其getObject对象进行目标对象的实例化,只有当我们从容器中获取目标对象时,spring才会调用其getObject方法创建目标对象并且返回。

本文地址:https://blog.csdn.net/q2780004063/article/details/110262836