Spring之【详解FactoryBean】

目录

FactoryBean接口

通过FactoryBean创建Bean对象

如何获取FactoryBean中getObject方法创建的Bean

如何获取FactoryBean本身

源码分析

beanDefinitionMap

singletonObjects

factoryBeanObjectCache

FACTORY_BEAN_PREFIX

BeanFactory

BeanFactoryUtils#isFactoryDereference

看看Spring自己是怎么获取FactoryBean对象


FactoryBean接口

提供了三个方法

  • 方法一:返回由工厂管理的Bean实例对象
  • 方法二:返回Bean实例对象的类型
  • 方法三:Bean是否为单例,默认为单例

通过FactoryBean创建Bean对象

  • 定义一个普通的Java类
java 复制代码
package spring.demo;

public class Cat {
}
  • 定义一个组件实现FactoryBean接口
java 复制代码
package spring.demo;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

@Component
public class CatFactoryBean implements FactoryBean<Cat> {
    @Override
    public Cat getObject() throws Exception {
        return new Cat();
    }

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

    @Override
    public boolean isSingleton() {
        return true;
    }
}

如何获取FactoryBean中getObject方法创建的Bean

通过beanName获取

java 复制代码
package spring.demo;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AppMain {
    public static void main(String[] args) {
        // 容器启动
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
        // 通过beanName获取
        Object bean = applicationContext.getBean("catFactoryBean");
        System.out.println(bean);
    }
}

如何获取FactoryBean本身

通过&+beanName获取

java 复制代码
package spring.demo;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AppMain {
    public static void main(String[] args) {
        // 容器启动
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
        // 通过&+beanName获取
        Object bean = applicationContext.getBean("&catFactoryBean");
        System.out.println(bean);
    }
}

源码分析

beanDefinitionMap

singletonObjects

factoryBeanObjectCache

FACTORY_BEAN_PREFIX

BeanFactory

BeanFactoryUtils#isFactoryDereference

看看Spring自己是怎么获取FactoryBean对象

相关推荐
Craaaayon31 分钟前
【数据结构】二叉树-图解深度优先搜索(递归法、迭代法)
java·数据结构·后端·算法·leetcode·深度优先
梦之翼61872042 分钟前
eclipse复制项目后原项目名依然伴随值所复制的项目名
java·eclipse
缘的猿1 小时前
Kubernetes 安全管理:认证、授权与准入控制全面解析
java·安全·kubernetes
ChinaRainbowSea1 小时前
5. Prompt 提示词
java·人工智能·后端·spring·prompt·ai编程
合作小小程序员小小店1 小时前
web开发,在线%车辆管理%系统,基于Idea,html,css,vue,java,springboot,mysql
java·spring boot·vscode·html5·web app
龙茶清欢1 小时前
在 Spring Cloud Gateway 中实现跨域(CORS)的两种主要方式
java·spring boot·spring cloud·微服务·gateway
1710orange1 小时前
java设计模式:工厂方法 + 建造者模式
java·设计模式
我不是混子2 小时前
什么是Java 的 Lambda 表达式?
java·后端
小蝙蝠侠2 小时前
JMeter 执行流程
java·jmeter