Spring工厂方式实现实例化bean有哪些方式?

news2024/11/7 17:09:25

在Spring框架中,实例化Bean的方式有多种,其中通过工厂方法(Factory Method)来创建Bean是一种常见的方式。这种方式允许你通过自定义的工厂类或静态方法来生成Bean实例,从而提供了更灵活和复杂的实例化逻辑。

以下是Spring中通过工厂方法实例化Bean的几种方式及其代码实现:

1. 使用静态工厂方法

你可以通过指定一个包含静态方法的类,以及该方法来创建Bean。在Spring的配置文件(XML)或Java配置类中,你需要使用<bean>元素的factory-method属性来指定静态工厂方法。

示例代码:

静态工厂类

public class MyBeanFactory {  
    public static MyBean createMyBean() {  
        return new MyBean();  
    }  
}

Spring XML配置

<bean id="myBean" class="com.example.MyBeanFactory" factory-method="createMyBean"/>

或者,在Java配置类中:

@Configuration  
public class AppConfig {  
    @Bean  
    public MyBean myBean() {  
        return MyBeanFactory.createMyBean();  
    }  
}
但是注意,在Java配置类中,你通常不会直接使用factory-method属性,而是直接调用静态工厂方法并返回Bean实例。

2. 使用实例工厂方法

对于非静态的工厂方法,你需要首先创建一个工厂类的实例,然后调用该实例上的方法来创建Bean。在Spring的配置文件中,你需要使用<bean>元素的factory-beanfactory-method属性来指定工厂Bean和工厂方法。

示例代码:工厂类Spring XML配置
<bean id="myBeanFactory" class="com.example.MyBeanFactory"/>  
<bean id="myBean" factory-bean="myBeanFactory" factory-method="createMyBean"/>

在Java配置类中,你可以这样做:

@Configuration  
public class AppConfig {  
    @Bean  
    public MyBeanFactory myBeanFactory() {  
        return new MyBeanFactory();  
    }  
  
    @Bean  
    public MyBean myBean(MyBeanFactory myBeanFactory) {  
        return myBeanFactory.createMyBean();  
    }  
}

但是,请注意,在Java配置类中,你通常会直接调用工厂实例的方法,而不是通过Spring的factory-beanfactory-method属性,因为这种方式更直接且易于理解。

3 实现FactoryBean接口

在Spring框架中,FactoryBean 是一个接口,它允许你自定义对象的创建过程。通过使用 FactoryBean,你可以返回一个不同类型的对象实例,而不是直接返回在 Spring 配置文件中定义的 bean 类型的实例。这在某些场景下非常有用,比如当你需要返回一个代理对象、一个复杂对象的实例、或者当你希望延迟初始化对象时。 

示例代码:
import org.springframework.beans.factory.FactoryBean;  
  
public class MyFactoryBean implements FactoryBean<MyService> {  
  
    @Override  
    public MyService getObject() throws Exception {  
        // 这里可以创建并返回 MyService 的实例  
        return new MyServiceImpl();  
    }  
  
    @Override  
    public Class<?> getObjectType() {  
        // 返回 MyService 的 Class 对象  
        return MyService.class;  
    }  
  
    @Override  
    public boolean isSingleton() {  
        // 指定返回的实例是否是单例  
        return true;  
    }  
}

在这个例子中,MyFactoryBean 创建并返回一个 MyService 类型的实例。

3.1. 配置 FactoryBean

接下来,你需要在 Spring 配置文件中注册这个 FactoryBean。你可以通过 XML 配置或 Java 配置来实现。

XML 配置

<bean id="myFactoryBean" class="com.example.MyFactoryBean"/>

Java 配置

3.2. 使用 FactoryBean 创建的 Bean

在 Spring 应用中,你可以通过 ApplicationContext 来获取由 FactoryBean 创建的 bean。

import org.springframework.context.ApplicationContext;  
import org.springframework.context.annotation.AnnotationConfigApplicationContext;  
  
public class MainApp {  
    public static void main(String[] args) {  
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);  
  
        // 通过 FactoryBean 获取 MyService 实例  
        MyService myService = (MyService) context.getBean("myFactoryBean");  
  
        // 使用 myService  
        myService.doSomething();  
    }  
}

注意,当你通过 context.getBean("myFactoryBean") 获取 bean 时,你实际上获取的是 FactoryBean 创建的对象实例,而不是 FactoryBean 本身。

3.3. 获取 FactoryBean 本身

如果你确实需要获取 FactoryBean 本身,而不是它创建的对象,你可以在 bean 名称后加上 & 符号:

MyFactoryBean myFactoryBean = (MyFactoryBean) context.getBean("&myFactoryBean");

这样,你就可以访问 FactoryBean 实例本身,而不是它创建的对象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2235155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【1个月速成Java】基于Android平台开发个人记账app学习日记——第7天,申请阿里云SMS短信服务SDK

系列专栏链接如下&#xff0c;方便跟进&#xff1a; https://blog.csdn.net/weixin_62588253/category_12821860.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12821860&sharereferPC&sharesourceweixin_62588253&sharefromfrom_link 同时篇幅…

A02、JVM性能监测调优

1、JVM内存模型 1.1、介绍 JVM 自动内存分配管理机制的好处很多&#xff0c;但实则是把双刃剑。这个机制在提升 Java 开发效率的同时&#xff0c;也容易使 Java 开发人员过度依赖于自动化&#xff0c;弱化对内存的管理能力&#xff0c;这样系统就很容易发生 JVM 的堆内存异常&…

钉钉调试微应用整理2

第一步 新建应用 钉钉开放平台](https://open-dev.dingtalk.com/) 去新增应用 第二步 配置应用信息 把本地代码运行起来&#xff0c;并设置本地地址 第三步 在本地代码添加调试命令 这里有2中添加方式 哪一种都可以 方式一&#xff1a; index.html页面中 <!DOCTYPE h…

《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列

《TCP/IP网络编程》学习笔记 | Chapter 3&#xff1a;地址族与数据序列 《TCP/IP网络编程》学习笔记 | Chapter 3&#xff1a;地址族与数据序列分配给套接字的IP地址和端口号网络地址网络地址分类和主机地址边界用于区分套接字的端口号数据传输过程示例 地址信息的表示表示IPv4…

飞牛fnOs内网穿透-使用Lucky实现ipv6动态解析+HTTPS访问NAS服务

&#x1f9ed;Lucky官方介绍 Lucky最初是作为一个小工具&#xff0c;由开发者为自己的个人使用而开发&#xff0c;用于替代socat&#xff0c;在小米路由AX6000官方系统上实现公网IPv6转内网IPv4的功能。Lucky的设计始终致力于让更多的Linux嵌入式设备运行&#xff0c;以实现或…

《安富莱嵌入式周报》第345期:开源蓝牙游戏手柄,USB3.0 HUB带电压电流测量,LCR电桥前端模拟,开源微型赛车,RF信号扫描仪,开源无线电收发器

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 本周更新一期视频教程 第5期&#xff1a;RTX5/FreeRTOS全家桶源码工程综合实战模板集成CANopen组件&#xff08;2024-1…

微服务中常用分布式锁原理及执行流程

1.什么是分布式锁 分布式锁是一种在分布式系统环境下实现的锁机制&#xff0c;它主要用于解决&#xff0c;多个分布式节点之间对共享资源的互斥访问问题&#xff0c;确保在分布式系统中&#xff0c;即使存在有多个不同节点上的进程或线程&#xff0c;同一时刻也只有一个节点可…

三:LoadBalancer负载均衡服务调用

LoadBalancer负载均衡服务调用 1.LB负载均衡(Load Balance)是什么2.loadbalancer本地负载均衡客户端 与 Nginx服务端负载均衡区别3.实现loadbalancer负载均衡实例3-1.首先应模拟启动多个服务提供者应用实例&#xff1a;3-2.在服务消费项目引入LoadBalancer3-3&#xff1a;测试用…

简单入门Git

Git作用 Git简介 作用&#xff1a;版本控制多人协作 集中式 典型代表&#xff1a;SVN 特点&#xff1a;所有的版本库都存在中央服务器&#xff0c;本地备份动作必须依赖中央服务器&#xff0c;如果一旦服务器挂掉&#xff0c;或者网络状况不好&#xff0c;没法提交版本。…

解决echarts桑基图为0时tooltip不显示的问题

关键代码 formatter: function (params) {console.log("params",params)if (params.value 0) {// 如果值为0&#xff0c;返回空字符串&#xff0c;不显示任何内容return params.name : params.value;// return ;} else {// 否则返回标准的格式化信息return par…

DevOps业务价值流:版本规划的最佳实践

初入公司&#xff0c;面对瀑布研发模式下的冗长周期与频繁返工&#xff0c;我率先尝试局部敏捷迭代&#xff0c;但成效有限。随后&#xff0c;推动全面敏捷化&#xff0c;从需求阶段即开始规划&#xff0c;虽方向正确&#xff0c;却遭遇版本规划难题。项目经理与产品经理对敏捷…

NewStar CTF 2024 misc WP

decompress 压缩包套娃&#xff0c;一直解到最后一层&#xff0c;将文件提取出来 提示给出了一个正则&#xff0c;按照正则爆破密码&#xff0c;一共五位&#xff0c;第四位是数字 ^([a-z]){3}\d[a-z]$ 一共就五位数&#xff0c;直接ARCHPR爆破&#xff0c;得到密码 xtr4m&…

2020年美国总统大选数据分析与模型预测

数据集取自&#xff1a;2020年&#x1f1fa;&#x1f1f8;&#x1f1fa;&#x1f1f8;美国大选数据集 - Heywhale.com 前言 对2020年美国总统大选数据的深入分析&#xff0c;提供各州和县层面的投票情况及选民行为的可视化展示。数据预处理阶段将涉及对异常值的处理&#xff0…

A Consistent Dual-MRC Framework for Emotion-cause Pair Extraction——论文阅读笔记

前言 这是我第一次向同学院同年级的学生和老师们汇报的第一篇论文,于2022年发表在TOIS上,属于CCF A类,主要内容是将MRC应用到情感原因对抽取中。 论文链接:用于情绪-原因对提取的一致双 MRC 框架 |信息系统上的 ACM Transactions 这里我就不放上我自己翻译的中文版还有我…

智慧公厕解决方案是未来厕所新建和改造的方向

在当今科技飞速发展的时代&#xff0c;智慧公厕解决方案正逐渐成为厕所新建和改造的主流方向&#xff0c;为人们带来更便捷、卫生、高效的使用体验。 一、智能化体验提升便捷性 智慧公厕配备了一系列智能设施&#xff0c;极大地提升了使用的便捷性。比如&#xff0c;智能环保取…

python爬取m3u8视频(思路到实现全讲解!!!)

文章目录 抓取m3u8视频1、思路分析2、实现分析index.m3u8 3、代码实现3.1 获取最后一个m3u8的url地址3.2 多线程下载ts文件与视频合并3.3 合并获取上面俩个代码段的代码 4、注意事项4.1 说明4.2 使用代码进行处理4.3 完整代码 5、解密处理 处理m3u8文件中的url问题 抓取m3u8视频…

“方块兽神仙猿点石成金”游戏搭建开发

“方块兽神仙猿点石成金”是一款结合了策略和运气的休闲游戏。玩家需在规定时间内向不同的山头投入矿石&#xff0c;等待神仙猿降临并随机选择一座山进行“点石成金”。根据神仙猿的选择&#xff0c;玩家将获得不同的奖励。 游戏核心机制 矿石投入&#xff1a;玩家在游戏开始…

Centos Linux 7 搭建邮件服务器(postfix + dovecot)

准备工作 1. 一台公网服务器&#xff08;需要不被服务商限制发件收件的&#xff0c;也就是端口25、110、143、465、587、993、995不被限制&#xff09;&#xff0c;如有防火墙或安全组需要把这些端口开放 2. 一个域名&#xff0c;最好是com cn org的一级域名 3. 域名备案&am…

二级列表联动

介绍 本示例主要介绍了List组件实现二级联动&#xff08;Cascading List&#xff09;的场景。 该场景多用于商品种类的选择、照片不同类型选择等场景。 效果图 使用说明&#xff1a; 滑动二级列表侧控件&#xff08;点击没用&#xff09;&#xff0c;一级列表随之滚动。&…

简易三步骤教程:轻松在本地搭建并运行大型模型!

在当前的技术环境下&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已经成为人工智能领域的一个重要里程碑。这些模型能够在各种任务上展现出人类水平的性能&#xff0c;包括但不限于文本生成、语言理解和问题解答。随着开源项目的发展&#xff0c;个人开发者现在有机会…