当前位置: 首页 > news >正文

Spring 框架中哪些接口可以创建对象

Spring 框架中哪些接口可以创建对象

在 Spring 框架中,向 IOC 容器中添加 Bean 主要有以下几种接口和方式。Spring 提供了不同的手段来实现对象的创建和管理,涵盖了不同的需求和场景。以下是几种常用的接口和方式:

1. BeanFactory 接口

BeanFactory 是 Spring 框架中最基本的容器接口,它用于管理和提供 Bean 的实例。在早期版本的 Spring 中,BeanFactory 是容器的核心接口。通过 BeanFactory,你可以获取已注册的 Bean 实例。

常用的实现类:

  • DefaultListableBeanFactory(用于注册 Bean 定义)
示例:
// 基于 XML 配置的 BeanFactory 示例
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class BeanFactoryExample {public static void main(String[] args) {// 加载 Spring 配置文件BeanFactory factory = new ClassPathXmlApplicationContext("beans.xml");// 获取并使用 BeanMyBean myBean = (MyBean) factory.getBean("myBean");myBean.sayHello();}
}

xml文件:

<beans><bean id="myBean" class="com.demo.MyBean" />
</beans>

2. ApplicationContext 接口

ApplicationContextBeanFactory 的子接口,除了继承了 BeanFactory 的功能外,还提供了更多的功能,如事件传播、国际化支持、AOP 支持等。ApplicationContext 是实际应用中更常用的接口。

常用的实现类:

  • ClassPathXmlApplicationContext(基于 XML 配置文件的上下文)
  • AnnotationConfigApplicationContext(基于注解配置的上下文)
  • GenericWebApplicationContext(Web 环境的上下文)

ApplicationContext 提供了更多的功能,通常用于大多数 Spring 应用中。

示例:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class ApplicationContextExample {public static void main(String[] args) {// 加载 Spring 配置文件ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");// 获取并使用 BeanMyBean myBean = (MyBean) context.getBean("myBean");myBean.sayHello();}
}

xml文件:

<beans><bean id="myBean" class="com.demo.MyBean" />
</beans>

3. ConfigurableApplicationContext 接口

ConfigurableApplicationContextApplicationContext 的子接口,它提供了更强大的功能,包括关闭容器、刷新容器、启动和停止等操作。在大多数情况下,ApplicationContext 的实现类如 ClassPathXmlApplicationContextAnnotationConfigApplicationContext 都实现了这个接口。

常用的实现类:

  • GenericWebApplicationContext(Web 环境)
  • AnnotationConfigApplicationContext(基于注解配置)
示例:
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class ConfigurableApplicationContextExample {public static void main(String[] args) {// 加载 Spring 配置文件ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");// 获取并使用 BeanMyBean myBean = (MyBean) context.getBean("myBean");myBean.sayHello();// 关闭容器context.close();}
}

4. BeanDefinitionRegistry 接口

BeanDefinitionRegistry 是一个注册 Bean 定义的接口。它用于向 Spring 容器动态注册 Bean 定义。当你希望在运行时动态地向容器添加 Bean 时,BeanDefinitionRegistry 提供了注册功能。

常用的实现类:

  • DefaultListableBeanFactory(通常与 ApplicationContext 一起使用)
  • GenericWebApplicationContext(Web 环境)
示例:
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class BeanDefinitionRegistryExample {public static void main(String[] args) {// 创建一个 BeanFactoryDefaultListableBeanFactory factory = new DefaultListableBeanFactory();// 动态注册 Bean 定义factory.registerBeanDefinition("myBean", BeanDefinitionBuilder.genericBeanDefinition(MyBean.class).getBeanDefinition());// 创建应用上下文AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.setBeanFactory(factory);// 获取并使用 BeanMyBean myBean = (MyBean) context.getBean("myBean");myBean.sayHello();}
}

5. BeanFactoryPostProcessor 接口

BeanFactoryPostProcessor 是 Spring 容器启动时,容器创建所有 Bean 实例之前,用来修改 Bean 定义的接口。通过这个接口,你可以访问和修改容器中所有的 Bean 定义,并且可以动态地向容器中添加 Bean 定义。

示例:
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(org.springframework.beans.factory.config.ConfigurableListableBeanFactory beanFactory) {// 动态注册一个新的 Bean 定义if (beanFactory instanceof BeanDefinitionRegistry) {BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;registry.registerBeanDefinition("myBean", new org.springframework.beans.factory.support.GenericBeanDefinition(MyBean.class));}}public static void main(String[] args) {// 创建应用上下文并添加 BeanFactoryPostProcessorAnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.addBeanFactoryPostProcessor(new CustomBeanFactoryPostProcessor());context.refresh();  // 刷新容器// 获取并使用 BeanMyBean myBean = (MyBean) context.getBean("myBean");myBean.sayHello();// 关闭容器context.close();}
}

6. ApplicationContextAware 接口

ApplicationContextAware 接口允许类访问 ApplicationContext,可以在对象初始化时获取当前的容器上下文。对于需要动态注册 Bean 或者根据应用上下文执行某些操作的场景非常有用。

示例:
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class MyBean implements ApplicationContextAware {private ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext context) {this.context = context;}public void sayHello() {System.out.println("Hello from MyBean!");// 你可以在这里动态访问容器,或者做其他操作}public static void main(String[] args) {// 创建应用上下文AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.register(MyBean.class);context.refresh();// 获取并使用 BeanMyBean myBean = (MyBean) context.getBean(MyBean.class);myBean.sayHello();// 关闭容器context.close();}
}

相关文章:

Spring 框架中哪些接口可以创建对象

Spring 框架中哪些接口可以创建对象 在 Spring 框架中&#xff0c;向 IOC 容器中添加 Bean 主要有以下几种接口和方式。Spring 提供了不同的手段来实现对象的创建和管理&#xff0c;涵盖了不同的需求和场景。以下是几种常用的接口和方式&#xff1a; 1. BeanFactory 接口 Be…...

豆瓣书摘 | 爬虫 | Python

获取豆瓣书摘&#xff0c;存入MongoDB中。 import logging import timeimport requests from bs4 import BeautifulSoup from pymongo import MongoClientheaders {accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,image/webp,image/apng,*/*;q0.8,…...

Oracle数据库物理存储结构管理

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 安装和配置Oracle数据库是一个涉及多个步骤的任务&#xff0c;通常包括环境准备、软件安装、数据库创建和基本配置等。以下是详细的安装与配置流程。 一、环境准备 1. 系统要求 操作系统&#xff1a;Wind…...

java——Map接口

Java的Map接口是一种键值对的数据结构&#xff0c;用于存储和操作键值对的集合。它是Java集合框架中的一部分&#xff0c;提供了一种以键值对形式组织数据的方法。 Map接口有多个实现类&#xff0c;常用的有HashMap、TreeMap和LinkedHashMap。每种实现类都有不同的特点和适用场…...

量子计算机全面解析:技术、应用与未来

标题&#xff1a;量子计算机全面解析&#xff1a;技术、应用与未来 一、什么是量子计算机&#xff1f; 量子计算机是一种利用量子力学原理&#xff08;如叠加、纠缠和干涉&#xff09;进行计算的新型计算设备。与传统计算机基于比特&#xff08;0 和 1&#xff09;的运算方式不…...

IDEA相关(包括但不限于快捷键,使用技巧)成长笔记

1.IDEA创建及命名规范 IDEA创建是&#xff1a;项目、模块、包、类 命名规范&#xff1a; 1.项目名全部小写 2.包名全部小写 3.类名首字母大写&#xff0c;一般都是使用驼峰式命名。 如&#xff1a;public class MyFirstClass{} 4.同上&#xff1a; 变量名、方法名首字母小…...

【再谈设计模式】适配器模式 ~接口兼容的桥梁

一、引言 在软件开发的复杂世界里&#xff0c;不同的组件、类或者系统往往有着各自独立的设计和接口定义。当需要将这些原本不兼容的部分整合在一起协同工作时&#xff0c;就像尝试将方形的榫头插入圆形的卯眼一样困难。适配器设计模式就如同一位神奇的工匠&#xff0c;能够巧妙…...

使用Cursor和Claude AI打造你的第一个App

大家好&#xff0c;使用Cursor和Claude AI打造应用程序是一个结合智能代码辅助和人工智能对话的创新过程。Cursor是一个编程辅助工具&#xff0c;它通过智能代码补全、聊天式AI对话和代码生成等功能&#xff0c;帮助开发者提高编程效率。Claude AI则是一个强大的人工智能平台&a…...

粗读Apache Paimon 的基本概念及其组成结构

文章目录 一、Paimon的基本概念&#xff08;一&#xff09;快照&#xff08;二&#xff09;分区&#xff08;三&#xff09;分桶&#xff08;四&#xff09;一致性保证 二、Paimon的组成结构&#xff08;一&#xff09;文件布局&#xff08;二&#xff09;存储结构&#xff08;…...

c++调用 c# dll 通过 P/Invoke (详细避坑)

项目场景&#xff1a; VS2022 .NET8 &#xff0c; 项目应用的库需要支持AOT&#xff0c;不支持AOT的库看这里 我的c项目很奇怪&#xff0c;如果使用 clr 调用c# dll,会有很多报错&#xff0c;所以使用 P/Invoke方法&#xff0c;这个方法不会有任何奇怪的报错 解决方案 示例…...

李春葆《数据结构》——图相关代码

邻接矩阵结构体&#xff1a; #define MAX<最大结点个数> #define INF 32765 //定义无穷 typedef struct{int no;//顶点的编号&#xff1b;InfoType info;//顶点的其他信息 }vertexType;//顶点的类型 typedef struct{int edges[MAX][Max];//邻接矩阵数组 int vertexTy…...

Linux驱动开发第2步_“物理内存”和“虚拟内存”的映射

“新字符设备的GPIO驱动”和“设备树下的GPIO驱动”都要用到寄存器地址&#xff0c;使用“物理内存”和“虚拟内存”映射时&#xff0c;非常不方便&#xff0c;而pinctrl和gpio子系统的GPIO驱动&#xff0c;非常简化。因此&#xff0c;要重点学习pinctrl和gpio子系统下的GPIO驱…...

告别多品牌乱战,吉利开始觉醒

科技新知 原创作者丨思原 编辑丨蕨影 2007年&#xff0c;是国内自主品牌汽车萌芽的一年&#xff0c;当时行业普遍奉行“多生孩子好打架”战略&#xff0c;吉利也是在这样的背景下发布了《宁波宣言》&#xff0c;奠定了之后十多年的发展主导思想。 然而&#xff0c;新能源的快…...

Target-absent Human Attention

Abstract 预测人类注视行为对于构建能够预测用户注意力的人机交互系统非常重要。已经开发出计算机视觉模型来预测人们在搜索目标物体时的注视点。但当目标不存在于图像中时,又该如何处理呢?同样重要的是要了解当人们找不到目标时,他们如何进行搜索,以及何时停止搜索。在本文…...

<QNAP 453D QTS-5.x> 日志记录:在 Docker 中运行的 Flask 应用安装 自签名 SSL 证书 解决 Chrome 等浏览器证书安全

原因&#xff1a;Chrome 不信任 ssc 证书 使启用了 HTTPS&#xff0c;即使有使用 自签名证书 (self-signed certificate 非由可信的证书颁发机构 【CA&#xff0c;Certificate Authority】签发的&#xff09;。浏览器 Chrome 默认不信任自签名证书&#xff0c;也会报 NET::ERR_…...

通过huggingface-cli下载Hugging Face上的公开数据集或模型至本地

1. 获取 Access Tokens 在使用huggingface-cli命令下载之前需要先去官网获取 Access Tokens&#xff1a; 获取tokens的官网链接&#xff1a;https://huggingface.co/settings/tokens点击新增 token&#xff1a; 然后选择 write 权限&#xff1a; 最后&#xff0c;这个 Access…...

论文阅读——Intrusion detection systems using longshort‑term memory (LSTM)

一.基本信息 论文名称&#xff1a;Intrusion detection systems using longshort‑term memory (LSTM) 中文翻译&#xff1a;基于长短期记忆(LSTM)的入侵检测系统 DOI&#xff1a;10.1186/s40537-021-00448-4 作者&#xff1a;FatimaEzzahra Laghrissi1* , Samira Douzi2*, Kha…...

SparkSQL的执行过程:从源码角度解析逻辑计划、优化计划和物理计划

SparkSQL的执行过程可以分为以下几个阶段&#xff1a;从用户的SQL语句到最终生成的RDD执行&#xff0c;涵盖逻辑计划、优化计划和物理计划。以下是详细的源码角度解析&#xff1a; 1. 解析阶段&#xff08;Parsing&#xff09; SQL语句解析&#xff1a;Spark 使用 Catalyst 引…...

Leetcode打卡:新增道路查询后的最短距离II

执行结果&#xff1a;通过 题目&#xff1a;3244 新增道路查询后的最短距离II 给你一个整数 n 和一个二维整数数组 queries。 有 n 个城市&#xff0c;编号从 0 到 n - 1。初始时&#xff0c;每个城市 i 都有一条单向道路通往城市 i 1&#xff08; 0 < i < n - 1&…...

Spring Web入门练习

加法计算器 约定前后端交互接⼝ 约定 "前后端交互接⼝" 是进⾏ Web 开发中的关键环节. 接⼝⼜叫 API&#xff08;Application Programming Interface), 我们⼀般讲到接⼝或者 API&#xff0c;指的都是同⼀个东西. 是指应⽤程序对外提供的服务的描述, ⽤于交换信息…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...