使用Spring的FactoryBean创建和获取Bean对象方式

 更新时间:2025年03月26日 10:56:38   作者:catoop  
这篇文章主要介绍了使用Spring的FactoryBean创建和获取Bean对象方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Spring的FactoryBean创建和获取Bean对象

在Spring框架中,FactoryBean接口提供了一种强大的机制来创建复杂的bean实例。

本文将基于提供的代码示例,详细介绍如何通过FactoryBean创建bean对象,并展示如何获取这些bean实例以及它们所属的FactoryBean实例。

示例代码类

  1. 定义 MyBean 接口。

首先,我们定义一个简单的接口MyBean,它包含一个show方法:

public interface MyBean {
    /**
     * 显示信息
     */
    void show();
}
  1. 实现 MyFactoryBean 类。

我们实现FactoryBean接口来创建MyBean类型的实例。

在这个例子中,MyFactoryBean负责创建并返回实现了MyBean接口的对象:

@Component
public class MyFactoryBean implements FactoryBean<MyBean> {

    // 这个 myBean 成员变量,在本文中可以忽略,我自己用作其他用途使用的
    private MyBean myBean;

    @Override
    public MyBean getObject() throws Exception {
        System.err.println("getObject");
        if(myBean == null) {
            myBean = new MyBean() {
                @Override
                public void show() {
                    System.err.println("MyFactoryBean.show");
                }
            };
        }
        return myBean;
    }

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

这里,MyFactoryBean使用了匿名内部类的方式实现了MyBean接口,并重写了show方法。其中定义了一个 myBean 成员变量,这个可以忽略,我自己用作其他用途使用的。

从Spring容器中获取实例对象

为了从Spring容器中获取MyFactoryBean生成的bean实例或MyFactoryBean本身,我们需要先获取 ApplicationContext 实例本身,下面代码中的 SpringContextHolder.getApplicationContext() 是我自己定义好的工具类,假设通过它获取到 ApplicationContext 对象。

以下是获取工厂类自身实例 和 工厂类产生的具体 Bean实例的具体方法:

1、获取由FactoryBean创建的具体bean实例:

// 通过工厂类的名称获取
MyBean myBean = (MyBean) SpringContextHolder.getApplicationContext().getBean("myFactoryBean");
// 通过Bean类型获取(如果你有多个工厂,都生产MyBean,请不要使用MyBean.class获取,它会同时执行你的多个工厂类)
MyBean myBean = SpringContextHolder.getApplicationContext().getBean(MyBean.class);

2、获取产生Bean实例的具体工厂类FactoryBean自身的实例:

如果你想直接操作FactoryBean(例如,进行一些配置调整),你可以通过在bean名称前加上&作为前缀来获取FactoryBean的实例,这是 Spring 内置的命名规则:

// 通过工厂类的名称和&符号获取
MyFactoryBean factoryBean = (MyFactoryBean) SpringContextHolder.getApplicationContext().getBean("&myFactoryBean");
// 通过工厂类class
MyFactoryBean factoryBean = SpringContextHolder.getApplicationContext().getBean(MyFactoryBean.class);

单例和多实例

通过重写方法 isSingleton() 控制返回值来决定该工厂类每次都返回一个实例,还是每次都返回单例的bean(默认值是 true,单实例模式)。

注意:工厂类自身还是单例的,我们一般我们不会为工厂类设置 prototype,只是在需要的时候重写 isSingleton() 方法返回 false 来实现多例。

总结

通过上述步骤,我们不仅能够轻松地从Spring容器中获取由FactoryBean创建的bean实例,还能获取到这个FactoryBean的实例本身。这种灵活性使得FactoryBean成为了处理复杂bean创建逻辑的强大工具。无论你是需要定制化bean的创建过程,还是希望对bean的生命周期有更精细的控制,FactoryBean都能满足你的需求。

通过这种方式,开发者可以更加灵活地管理和操作Spring中的bean实例,提高代码的可维护性和扩展性。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Springboot+WebSocket+Netty实现在线聊天/群聊系统

    Springboot+WebSocket+Netty实现在线聊天/群聊系统

    这篇文章主要实现在好友添加、建群、聊天对话、群聊功能,使用Java作为后端语言进行支持,界面友好,开发简单,文章中有详细的代码示例供大家参考,需要的朋友可以参考下
    2023-08-08
  • Spring Security 中的 AuthenticationManager配置及使用

    Spring Security 中的 AuthenticationManager配置及使用

    本文我们将探讨 AuthenticationManager 在 Spring Security 中的作用,并指导您完成其配置和实际应用,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • Spring Aop组成部分及实现步骤

    Spring Aop组成部分及实现步骤

    面向切面编程,是对面向对象编程的一种补充,是一种编程思想,是对某一类的事情的集中处理,这篇文章主要介绍了Spring Aop组成部分及实现步骤,需要的朋友可以参考下
    2023-08-08
  • Spring Boot Web 开发注解篇

    Spring Boot Web 开发注解篇

    在 Spring Boot 快速入门中,只要在 pom.xml 加入了 spring-boot-starter-web 依赖,即可快速开发 web 应用。下文给大家详细介绍了spring boot web 开发注解,感兴趣的朋友参考下吧
    2017-08-08
  • Java中forward转发与redirect重定向的区别

    Java中forward转发与redirect重定向的区别

    转发和重定向都是常用的页面跳转方式,但在实现上有一些区别,本文主要介绍了Java中forward转发与redirect重定向的区别,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Java日常练习题,每天进步一点点(54)

    Java日常练习题,每天进步一点点(54)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-08-08
  • 浅谈Java设置PPT幻灯片背景——纯色、渐变、图片背景

    浅谈Java设置PPT幻灯片背景——纯色、渐变、图片背景

    这篇文章主要介绍了Java设置PPT幻灯片背景——纯色、渐变、图片背景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 分布式锁实例教程之防止重复提交

    分布式锁实例教程之防止重复提交

    订单重复问题已经是老生常谈的问题了,下面这篇文章主要给大家介绍了关于分布式锁实例教程之防止重复提交的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2021-11-11
  • springboot2.0整合dubbo的示例代码

    springboot2.0整合dubbo的示例代码

    这篇文章主要介绍了springboot2.0整合dubbo的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Java线程安全与非线程安全解析

    Java线程安全与非线程安全解析

    这篇文章主要介绍了Java线程安全与非线程安全解析,涉及非线程安全现象模拟以及线程安全的实现等相关内容,需要的朋友可以参考,一起交流学习。
    2017-10-10

最新评论