当前位置: 首页 > 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;指的都是同⼀个东西. 是指应⽤程序对外提供的服务的描述, ⽤于交换信息…...

如何快速解锁网易云音乐NCM格式:ncmdumpGUI完整免费解决方案指南

如何快速解锁网易云音乐NCM格式&#xff1a;ncmdumpGUI完整免费解决方案指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经遇到过这样的困扰&…...

Simulink仿真报错‘积分器发散’?别慌,试试把ode45换成ode3并固定步长

Simulink仿真中积分器发散问题的深度解析与实战解决方案 当你在Simulink中进行控制系统仿真时&#xff0c;突然弹出一条令人不安的错误信息——"Derivative not finite"或"singularity"&#xff0c;这往往意味着你的仿真遇到了积分器发散问题。这种报错不…...

3步打造完美macOS菜单栏:Ice菜单栏管理终极指南

3步打造完美macOS菜单栏&#xff1a;Ice菜单栏管理终极指南 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 你是否厌倦了macOS菜单栏上杂乱无章的图标&#xff1f;想要一个整洁、高效且个性化的桌面…...

避震不是“越硬越好”:拆解阻尼、弹簧与预载的黄金三角法则

在改装领域&#xff0c;“避震越硬操控越好”几乎成了一条默认的“铁律”。不少玩家升级绞牙避震后&#xff0c;第一反应就是将阻尼旋钮拧至紧&#xff0c;以“颠”为荣&#xff0c;仿佛不如此便无法体现硬核姿态。但Cornerspeed必须指出一个被长期忽视的工程事实&#xff1a;刚…...

system24主题开发实战:创建个性化配色方案的完整指南

system24主题开发实战&#xff1a;创建个性化配色方案的完整指南 【免费下载链接】system24 a tui-style discord theme 项目地址: https://gitcode.com/gh_mirrors/sy/system24 想要为Discord打造独特的视觉体验吗&#xff1f;system24主题开发为您提供了完美的起点&am…...

基于Vagrant的Claude本地部署:自动化AI开发环境搭建指南

1. 项目概述&#xff1a;一个让Claude在本地“安家”的Vagrant包装器 如果你和我一样&#xff0c;是个喜欢在本地环境折腾各种AI工具的开发人员&#xff0c;那你肯定对Claude这个强大的语言模型不陌生。但官方提供的使用方式往往受限于网络环境、API调用成本或者隐私顾虑&…...

应对AIGC检测算法:论文初稿怎么做结构级优化?附实测工具避坑指南

写文章现在最怕什么&#xff1f;查重&#xff1f;不&#xff0c;现在的风向变了——最怕的是AI率太高。 现在越来越多学校开始严查aigc报告&#xff0c;只要被判定AI率过重&#xff0c;直接打回重写甚至影响答辩资格。很多同学为了降低ai率&#xff0c;四处寻找各种免费降ai率…...

CANN/asc-devkit向量减法ReLU函数

asc_sub_relu 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.c…...

Next.js 页面和路由

Next.js 页面与路由学习笔记 Next.js 13 的 App Router 基于文件系统路由&#xff0c;通过文件夹和文件的命名约定自动生成路由&#xff0c;无需手动配置路由表。 1. 基本路由规则 1.1 核心约定 文件作用是否必须page.tsx定义路由的 UI&#xff08;页面内容&#xff09;是&a…...

中文技能图谱:开发者如何构建系统化学习路径与能力模型

1. 项目概述&#xff1a;一份中文技能图谱的诞生作为一名在技术社区和开源领域摸爬滚打了十多年的老博主&#xff0c;我见过太多“Awesome List”&#xff08;优质资源列表&#xff09;。它们通常是某个技术栈、框架或工具的精选合集&#xff0c;是开发者快速上手的利器。但当我…...