Spring源码从入门到精通---FactoryBean接口(六)

简介: Spring源码从入门到精通---FactoryBean接口(六)

上篇文章介绍了如何吧bean注入容器:

1、@ComponentScan+注解(@Controller,@Service,@Repository,@Component)

2、@Bean+@Configuration(适用于第三方导入组件的注入)

3、@Import,import分为直接导入,也可以实现importSelector接口返回类全名注册组件,也可以实现ImportBeanDefinitionRegister接口自定义id名称,手动注册bean。


Spring源码从入门到精通---@Import(五)

这篇文章主要介绍第四种注册bean到ioc容器的方法:


4、spring提供的FactoryBean。


老规矩,先贴上项目目录。。

image.png


一、FactoryBean接口


自定义类实现FactoryBean,代码入下。


1)默认返回的重写方法getObject返回的类型

2)根据BeanFactory源码可以看到,里面有个&,当在getBean的时候,在容器里的id前面加个&就会获取到工厂本身的类型。

public class ColorFactoryBean implements FactoryBean<Color> {
    public Color getObject() throws Exception {
        System.out.println("get Object ...");
        return new Color();
    }
    public Class<?> getObjectType() {
        return Color.class;
    }
    /**
     *
     * @return true 单例
     *          false 多例
     */
    public boolean isSingleton() {
        return false;
    }
}
@Configuration
public class BeanConfig2 {
    @Bean
    public ColorFactoryBean getColorFactoryBean(){
        return new ColorFactoryBean();
    }
}
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
        BeanConfig2.class);
    /**
     * @Import
     */
    @org.junit.Test
    public void testImport() {
        getDefinitionNames(annotationConfigApplicationContext);
        //放入容器后,从容器中获取
        Blue blue = annotationConfigApplicationContext.getBean(Blue.class);
        System.out.println("获取成功的组件:" + blue);
        System.out.println("获取容器中getColorFactoryBean:");
        Object colorFactoryBeanObject = annotationConfigApplicationContext.getBean("getColorFactoryBean");
        Object colorFactoryBeanObject2 = annotationConfigApplicationContext.getBean("getColorFactoryBean");
        System.out.println("getObject方法获取的类型:" + colorFactoryBeanObject.getClass());
        System.out.println("Bean:" + colorFactoryBeanObject);
        System.out.println("多实例情况下:" + (colorFactoryBeanObject2 == colorFactoryBeanObject));
        Object factoryBeanObject = annotationConfigApplicationContext.getBean("&getColorFactoryBean");
        System.out.println("获取工厂本身的类型:" + factoryBeanObject.getClass());
    }


打印结果如下,从结果可以知道,当指定多实例的时候,两个对象比较会返回false,并且每次获取对象的时候都会创建一个对象,默认的情况下,获取的是getObject()返回的类。


image.png

相关文章
|
8天前
|
XML Java 数据格式
探索Spring之利剑:ApplicationContext接口
本文深入介绍了Spring框架中的核心接口ApplicationContext,解释了其作为应用容器的功能,包括事件发布、国际化支持等,并通过基于XML和注解的配置示例展示了如何使用ApplicationContext管理Bean实例。
38 6
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
71 2
|
1月前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
19天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
16天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
38 2
|
16天前
|
Java 数据库连接 数据库
从入门到精通---深入剖析Spring DAO
在Java企业级开发中,Spring框架以其强大的功能和灵活性,成为众多开发者的首选。Spring DAO(Data Access Object)作为Spring框架中处理数据访问的重要模块,对JDBC进行了抽象封装,极大地简化了数据访问异常的处理,并能统一管理JDBC事务。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring DAO,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
21 1
|
20天前
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
38 5
|
1月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
63 9
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
223 2
下一篇
DataWorks