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对象

相关推荐
SteveCode.2 分钟前
SpringBoot 2.x 升 3.x 避坑指南:企业级项目的实战问题与解决方案
java·spring boot
Yang-Never12 分钟前
Kotlin -> object声明和object表达式
android·java·开发语言·kotlin·android studio
风萧萧199913 分钟前
Java 实现poi方式读取word文件内容
java·开发语言·word
喵手23 分钟前
如何实现一个简单的基于Spring Boot的用户权限管理系统?
java·spring boot·后端
C4程序员43 分钟前
北京JAVA基础面试30天打卡01
java·开发语言·面试
Aczone281 小时前
数据结构(三)双向链表
java·数据结构·链表
菜菜的后端私房菜1 小时前
Dubbo2到Dubbo3服务发现机制的优化
java·后端·dubbo
33255_40857_280591 小时前
RocketMQ实战指南:Java开发者的分布式消息中间件全解析
java·rocketmq
Seven971 小时前
剑指offer-19、顺时针打印矩阵
java
SimonKing1 小时前
PostMan不香了,IDEA因为Apipost插件这一功能轻松取代
java·后端·程序员