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();}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人机的激光雷达避障系统阐述!

一、材料 激光二极管基底材料&#xff1a;激光二极管是激光雷达的核心组件之一&#xff0c;其基底材料通常采用硅或砷化镓。硅材料成本低、易于加工&#xff0c;但发光效率相对较低&#xff1b;而砷化镓材料发光效率高&#xff0c;但成本较高。 光学镜片材料&#xff1a;激光…

一篇快速上手 Axios,一个基于 Promise 的网络请求库(涉及原理实现)

Axios 1. 介绍1.1 什么是 Axios&#xff1f;1.2 axios 和 ajax 的区别 2. 安装使用3. Axios 基本使用3.1 Axios 发送请求3.2 其他方式发送请求3.3 响应结构3.4 Request Config3.5 默认配置3.6 创建实例对象发送请求 3.7 拦截器3.8 取消请求 4. 模拟 Axios4.1 axios 对象创建过程…

Three.js 相机控制器Controls

在 3D 场景中&#xff0c;摄像机的控制尤为重要&#xff0c;因为它决定了用户如何观察和与场景互动。Three.js 提供了多种相机控制器&#xff0c;最常用的有 OrbitControls、TrackballControls、FlyControls 和 FirstPersonControls。OrbitControls 适合用于查看和检查 3D 模型…

【新人系列】Python 入门(十一):控制结构

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12801353.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Python 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…

SELinux

一、简介 SELinux : 安全强化的Linux&#xff1b;在开启后,会对进程本身部署安全上下文&#xff1b;会对文件部署安全上下文&#xff1b;对法务使用端口进行限制&#xff1b;对程序本身的不安全功能做限制 二、工作原理 1、工作方式 通过MAC的方式来控制管理进程&#xff0…

C++小白实习日记——Day 5 gitee怎么删文件,测试文件怎么写循环

昨晚一直内耗&#xff0c;一个程序写了三天写不出来&#xff0c;主要是耗时太多了&#xff0c;老板一直不满意。想在VScode上跑一下&#xff0c;昨晚一直报错。今天来公司重新搞了一下&#xff0c; 主要工作有&#xff1a; 1&#xff0c;读取当前时间用tscns 2&#xff0c;输…

Apache Paimon】-- 6 -- 清理过期数据

目录 1、简要介绍 2、操作方式和步骤 2.1、调整快照文件过期时间 2.2、设置分区过期时间 2.2.1、举例1 2.2.2、举例2 2.3、清理废弃文件 3、参考 1、简要介绍 清理 paimon &#xff08;表&#xff09;过期数据可以释放存储空间&#xff0c;优化资源利用并提升系统运行效…

阿里云IIS虚拟主机部署ssl证书

宝塔配置SSL证书用起来是很方便的&#xff0c;只需要在站点里就可以配置好&#xff0c;但是云虚拟主机在管理的时候是没有这个权限的&#xff0c;只提供了简单的域名管理等信息。 此处记录下阿里云&#xff08;原万网&#xff09;的IIS虚拟主机如何配置部署SSL证书。 进入虚拟…

BOM的详细讲解

BOM概述 BOM简介 BOM&#xff08;browser Object&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是window。 BOM由一系列的对象构成&#xff0c;并且每个对象都提供了很多方法与属性 BOM缺乏标准&#xff…

湘潭大学软件工程算法设计与分析考试复习笔记(四)

回顾 湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;一&#xff09;湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;二&#xff09;湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;三&#xff09; 前言 现在是晚上十一点&#xff0c;我平时是十…

STM32单片机ADC数模转换器

由于最近忘记了&#xff0c;自用。 转换模式 单次转换&#xff0c;非扫描模式 在非扫描模式下&#xff0c;列表中就只有序列1的位置有效&#xff0c;此时可以在序列1的位置指定我们想要转换的通道&#xff0c;然后ADC就会对这个通道进行模数转换。等待一段时间&#xff0c;转…

android 使用MediaPlayer实现音乐播放--获取音乐数据

前面已经添加了权限&#xff0c;有权限后可以去数据库读取音乐文件&#xff0c;一般可以获取全部音乐、专辑、歌手、流派等。 1. 获取全部音乐数据 class MusicHelper {companion object {SuppressLint("Range")fun getMusic(context: Context): MutableList<Mu…

Spring Boot中使用AOP和反射机制设计一个的幂等注解(两种持久化模式),简单易懂教程

该帖子介绍如何设计利用AOP设计幂等注解&#xff0c;且可设置两种持久化模式 1、普通模式&#xff1a;基于redis的幂等注解&#xff0c;持久化程度较低 2、增强模式&#xff1a;基于数据库&#xff08;MySQL&#xff09;的幂等注解&#xff0c;持久化程度高 如果只需要具有re…

VSCode+ESP-IDF开发ESP32-S3-DevKitC-1(1)开发环境搭建

VSCodeESP-IDF开发ESP32-S3-DevKitC-1&#xff08;1&#xff09;开发环境搭建 1.开发环境搭建&#xff08;安装ESP-IDF&#xff09;2.开发环境搭建&#xff08;安装VS Code&#xff09;3.开发环境搭建&#xff08;VSCode中安装ESP-IDF插件及配置&#xff09; 1.开发环境搭建&am…

论文分享 | FuzzLLM:一种用于发现大语言模型中越狱漏洞的通用模糊测试框架

大语言模型是当前人工智能领域的前沿研究方向&#xff0c;在安全性方面大语言模型存在一些挑战和问题。分享一篇发表于2024年ICASSP会议的论文FuzzLLM&#xff0c;它设计了一种模糊测试框架&#xff0c;利用模型的能力去测试模型对越狱攻击的防护水平。 论文摘要 大语言模型中…

opencv(c++)----图像的读取以及显示

opencv(c)----图像的读取以及显示 imread: 作用&#xff1a;读取图像文件并将其加载到 Mat 对象中。参数&#xff1a; 第一个参数是文件路径&#xff0c;可以是相对路径或绝对路径。第二个参数是读取标志&#xff0c;比如 IMREAD_COLOR 表示以彩色模式读取图像。 返回值&#x…

用源码编译虚幻引擎,并打包到安卓平台

用源码编译虚幻引擎&#xff0c;并打包到安卓平台 前往我的博客,获取更优的阅读体验 作业内容: 源码编译UE5.4构建C项目&#xff0c;简单设置打包到安卓平台 编译虚幻 5 前置内容 这里需要将 Epic 账号和 Github 账号绑定&#xff0c;然后加入 Epic 邀请的组织&#xff0c…

OpenAI震撼发布:桌面版ChatGPT,Windows macOS双平台AI编程体验!

【雪球导读】 「OpenAI推出ChatGPT桌面端」 OpenAI重磅推出ChatGPT桌面端&#xff0c;全面支持Windows和macOS系统&#xff01;这款新工具为用户在日常生活和工作中提供了前所未有的无缝交互体验。对于那些依赖桌面端进行开发工作的专业人士来说&#xff0c;这一更新带来了令人…

【AIGC】破解ChatGPT!如何使用高价值提示词Prompt提升响应质量

文章目录 为什么高价值提示词如此重要&#xff1f;&#x1f50d;1.1 提升响应的相关性和准确性1.2 节省时间与资源1.3 增强用户体验 了解ChatGPT的工作原理&#x1f9e0;2.1 语言模型的训练过程2.2 上下文理解与生成2.3 限制与挑战 高价值提示词的核心要素✍️3.1 清晰明确的指…

07架构面试题

目录 一、关于合生元的面试题的架构分析的问题 1. 陈述两种方案的优劣 2. 在那些条件下&#xff0c;会选择哪一个方案 3. 你倾向那一种&#xff1f; 4. 如果要实施方案二的&#xff0c;准备步骤和流程 一、关于合生元的面试题的架构分析的问题 1. 陈述两种方案的优劣 方案…