SpringBoot中的对象

BeanFactory

是 Spring 框架的核心接口之一,用于管理和创建 Bean。它提供了一种机制,通过配置文件或注解来定义和实例化 Java 对象,并将这些对象存储在一个容器中,以便在应用程序的其他部分进行使用。

主要功能

  • 管理 Bean 的生命周期:负责创建、初始化、销毁 Bean。
  • 依赖注入:将 Bean 之间的依赖关系自动注入到需要的地方。
  • 提供获取 Bean 的方法:可以通过名称或类型从容器中获取 Bean 的实例。

使用方式

通常在 Spring 应用程序的配置类中使用@Bean注解或 XML 配置文件来定义 Bean,并由 Spring 容器自动管理这些 Bean 的创建和生命周期。

     @Configurationpublic class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}}

在应用程序的其他部分,可以通过@Autowired注解或BeanFactory的getBean()方法来获取 Bean 的实例。

     @Servicepublic class MyComponent {@Autowiredprivate MyService myService;}

应用场景

  • 适用于大多数常规的 Bean 管理场景,尤其是当 Bean 的创建和配置比较简单直接时。

  • 例如,创建一个普通的服务类、数据访问对象(DAO)等。

使用到的设计模式

BeanFactory使用了工厂模式和单例模式等设计模式。

工厂模式

  1. 体现方式:

    • BeanFactory作为一个工厂,负责创建和管理各种不同类型的 Bean(对象)。它根据配置信息或者特定的规则,实例化所需的对象,并将其提供给应用程序使用。

    • 例如,当应用程序需要一个特定类型的服务对象时,它不会直接实例化该对象,而是向BeanFactory请求。BeanFactory根据配置查找对应的 Bean 定义,并创建该类型的对象实例返回给应用程序。

  2. 优势:

    • 解耦对象的创建和使用:应用程序不需要知道对象的具体创建过程,只需要依赖BeanFactory提供所需的对象。这样可以降低应用程序各个模块之间的耦合度,提高代码的可维护性和可扩展性。

    • 集中管理对象的创建:所有对象的创建都由BeanFactory统一管理,可以更好地控制对象的生命周期和配置。例如,可以在BeanFactory中实现对象的单例模式、原型模式等不同的创建策略。

单例模式

  1. 体现方式:

    • 在 Spring 中,BeanFactory通常被实现为单例模式。这意味着在整个应用程序中,只有一个BeanFactory实例存在。

    • 例如,在 Spring Boot 应用中,当应用启动时,Spring 容器会创建一个BeanFactory实例,并在整个应用程序的生命周期中使用这个实例来管理 Bean。

  2. 优势:

    • 资源共享:由于只有一个BeanFactory实例,所有的 Bean 定义和配置信息都可以在这个实例中共享。这样可以避免重复加载配置信息,提高应用程序的性能。
    • 方便管理:单例模式使得对BeanFactory的管理更加方便。可以在任何地方通过获取这个唯一的实例来访问和操作 Bean,而不需要担心多个实例之间的状态不一致问题。

此外,BeanFactory还可能使用了其他设计模式,如依赖注入模式等,以实现更加灵活和可扩展的对象管理功能。

FactoryBean

是一个特殊的 Bean,它的作用是创建其他 Bean 的实例。它实现了FactoryBean接口,该接口定义了三个方法:getObject()、getObjectType()和isSingleton()。

主要功能

  • 自定义 Bean 的创建过程:可以通过实现FactoryBean接口来定制 Bean 的创建逻辑,例如从外部资源加载对象、创建复杂的对象关系等。

  • 提供对创建的 Bean 的类型和单例状态的控制:通过getObjectType()方法返回创建的 Bean 的类型,通过isSingleton()方法控制创建的 Bean 是否为单例。

使用方式

实现FactoryBean接口,并在实现类中定义创建 Bean 的逻辑。

     public class MyFactoryBean implements FactoryBean<MyObject> {@Overridepublic MyObject getObject() throws Exception {return new MyObject();}@Overridepublic Class<?> getObjectType() {return MyObject.class;}@Overridepublic boolean isSingleton() {return true;}}

在 Spring 配置中,将FactoryBean注册为一个 Bean。

     @Configurationpublic class AppConfig {@Beanpublic MyFactoryBean myFactoryBean() {return new MyFactoryBean();}}

获取由FactoryBean创建的 Bean 时,可以通过类型进行自动注入或使用BeanFactory的getBean()方法,并指定 Bean 的名称加上&前缀来获取FactoryBean本身。

     @Servicepublic class MyComponent {@Autowiredprivate MyObject myObject;}

应用场景

  • 当需要复杂的 Bean 创建逻辑时非常有用。
  • 例如:
    • 从外部资源加载对象:如从数据库、文件系统或网络获取对象实例。
    • 创建具有特定初始化逻辑的对象:在对象创建过程中执行一些复杂的初始化操作。
    • 创建代理对象:可以使用FactoryBean来创建 AOP 代理对象,实现面向切面编程。

SpringApplication

SpringApplication是 Spring Boot 中用于启动 Spring 应用程序的主要入口点。

主要功能

  1. 应用程序上下文创建

    • SpringApplication负责创建和初始化 Spring 应用程序上下文(通常是AnnotationConfigApplicationContext或ServletWebServerApplicationContext等)。这个上下文是 Spring 管理 Bean 的容器,它包含了应用程序中所有的 Bean 定义和配置信息。

    • 根据应用程序的类型(例如独立应用程序、Web 应用程序等),SpringApplication会自动选择合适的上下文类型,并加载相应的配置。例如,对于一个 Web 应用程序,SpringApplication会创建一个支持 Servlet 的上下文,并加载 Web 相关的配置。

  2. 环境配置

    • SpringApplication能够读取和处理应用程序的运行环境配置。它可以从多种来源获取配置信息,包括命令行参数、环境变量、配置文件等。

    • 通过SpringApplication,可以轻松地设置应用程序的各种属性,如数据库连接信息、服务器端口号、日志级别等。例如,可以在application.properties或application.yml文件中配置数据库连接 URL、用户名和密码,SpringApplication会自动读取这些配置信息,并将其注入到相应的 Bean 中。

  3. 启动流程管理

    • SpringApplication管理应用程序的启动流程,包括加载 Bean 定义、初始化 Bean、启动内置服务器(如果是 Web 应用程序)等。

    • 在启动过程中,SpringApplication会执行一系列的回调方法,允许开发者在特定的阶段插入自定义的逻辑。例如,可以通过实现ApplicationListener接口来监听应用程序的启动事件,并在启动过程中执行一些特定的任务,如初始化数据库连接、加载数据等。

  4. 日志管理

    • SpringApplication自动配置日志系统,使得应用程序在启动和运行过程中能够输出有意义的日志信息。它默认使用 Logback 作为日志实现,但也可以轻松地切换到其他日志框架。

    • SpringApplication会根据应用程序的运行环境和配置自动调整日志级别,以便在开发和生产环境中提供合适的日志输出。例如,在开发环境中,可以设置日志级别为 DEBUG,以便查看详细的调试信息;在生产环境中,可以设置日志级别为 INFO 或 WARN,以减少日志输出量,提高性能。

使用方法

创建和启动应用程序
通常,创建一个SpringApplication实例并调用其run()方法来启动应用程序。例如:

public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}}

在这个例子中,SpringApplication.run()方法接受应用程序的主类(MyApplication.class)和命令行参数(args)作为参数,并启动应用程序。

  1. 自定义配置

    • 可以通过多种方式自定义SpringApplication的行为。例如,可以设置应用程序的名称、配置文件路径、启动标志等。

    • 以下是一些自定义SpringApplication的方法:

 SpringApplication app = new SpringApplication(MyApplication.class);app.setBannerMode(Banner.Mode.OFF); // 关闭启动 Bannerapp.setWebApplicationType(WebApplicationType.SERVLET); // 设置应用程序类型为 Servlet Web 应用程序app.run(args);

应用场景

  1. 独立应用程序

    • 对于独立的 Java 应用程序,可以使用SpringApplication来启动一个基于 Spring 的应用程序。这种应用程序通常不需要部署到 Web 容器中,可以直接在命令行中运行。

    • 例如,一个数据处理工具、批处理任务、桌面应用程序等可以使用SpringApplication来管理其依赖关系、配置和启动流程。

  2. Web 应用程序

    • 在 Web 应用程序中,SpringApplication可以启动一个内置的 Servlet 容器(如 Tomcat、Jetty 等),并部署应用程序。

    • 这种方式使得开发和部署 Web 应用程序变得更加简单和快捷,无需手动配置和部署 Web 容器。

    • 例如,一个基于 Spring MVC 或 Spring WebFlux 的 Web 应用程序可以使用SpringApplication来启动和运行。

  3. 测试环境

    • 在单元测试和集成测试中,可以使用SpringApplication来启动一个测试用的 Spring 应用程序上下文,以便测试应用程序的各个组件。

    • 例如,可以使用@SpringBootTest注解结合SpringApplication来启动一个测试环境,然后在测试方法中注入需要测试的 Bean,并进行各种测试操作。

何念把宜家相亲角称作自己的社会学堂,他每周二来到这里观察。何念笑眯眯地分享自己的心得,“我觉得年纪大的老人,男人就想找一个免费的保姆,女的还像十八岁时想的一样,不仅是情绪价值,还有生活的各个方面,反正和你们小年轻想的一样!”

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

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

相关文章

UNION 联合查询

1.UNION ALL联合查询 同样为了演示方便&#xff0c;先向 teacher 表插入多条测试数据&#xff1a; INSERT INTO teacher (name,age,id_number,email) VALUES (姓名一,17,42011720200604077X,NULL), (姓名二,18,42011720200604099X,123qq.com), (姓名三,19,42011720200604020X…

007、链表的回文结构

0、题目描述 链表回文结构 1、法1 一个复杂的问题可以拆解成几个简单的问题&#xff0c;找中间节点和逆置链表&#xff08;翻转链表&#xff09;之前都做过。 class PalindromeList { public://1、找中间节点ListNode* FindMid(ListNode* A){if (A nullptr || A->next …

ConcurrentHashMap 存储机制(源码解析)

源码系列开更啦 &#x1f970;&#x1f970; 目录 1. 初始化 1.1. 无参 1.2. 带参 2. 存储操作 2.1. 计算下标 2.2. 初始化数组 2.3. 将数据插入到数组中 2.4. 协作扩容 2.5. 将数据插入到链表 2.6. 将数据插入到红黑树 2.7. 链表树化操作 1. 初始化 1.1. 无参 如…

【ROS2】订阅手柄数据,发布运动命令

1、相关消息 sensor_msgs::msg::Joy:用来描述手柄控制器数据 geometry_msgs::msg::Twist :用来描述物体运动时的线速度和角速度 参见博客: 【ROS2】geometry_msgs::msg::Twist和sensor_msgs::msg::Joy 2、订阅和发布 2.1 定义、创建订阅者和发布者 订阅手柄的按键、摇杆…

流程图 LogicFlow

流程图 LogicFlow 官方文档&#xff1a;https://site.logic-flow.cn/tutorial/get-started <script setup> import { onMounted, ref } from vue import { forEach, map, has } from lodash-es import LogicFlow, { ElementState, LogicFlowUtil } from logicflow/core …

前端学习---(2)CSS基础

CSS 用来干什么&#xff1f; CSS 是用来指定文档如何展示给用户的一门语言——如网页的样式、布局、等等。 css语法: 选择器{ 属性名: 属性值; 属性名: 属性值; } h1 {color: red;font-size: 5em; }h1: 选择器 color: 属性 冒号之前是属性&#xff0c;冒号之后是值。 font-size…

Jmeter监控服务器性能

目录 ServerAgent 安装 打开Jmeter ServerAgent 在Jmeter上监控服务器的性能比如CPU&#xff0c;内存等我们需要用到ServerAgent&#xff0c;这里可以下载我分享 ServerAgent-2.2.3.zip 链接: https://pan.baidu.com/s/1oZKsJGnrZx3iyt15DP1IYA?pwdedhs 提取码: edhs 安装…

[云] Project Analysis

项目要求分析&#xff1a; 开放性选题&#xff1a; 主题范围&#xff1a;任何与云计算系统相关的主题。项目类型&#xff1a;可以是技术、商业或研究项目。团队规模&#xff1a;最多可组成三人小组。 示例主题&#xff1a; 分析公共云数据&#xff1a;例如&#xff0c;AWS公共数…

System.Text.Json类库进行json转化时ValueKind:Object问题

当你的使用的Json库是System.Text.Json&#xff0c;而不是Newtonsoft.Json库的时候&#xff0c;你可能遇到以下问题及其解决办法。通常的解决办法是进行一些对应的配置。此外就需要根据情况使用自定义转换器实现你的需求。以下是通常遇到的使用自定义转换器解决的例子: Q1.当遇…

FPGA图像处理之均值滤波

文章目录 一、什么是图像滤波&#xff1f;1.1 噪声类型1.2 滤波类型 二、均值滤波原理2.1 3*3窗口滑动过程2.2 图像扩展 三、Matlab实现均值滤波四、FPGA实现均值滤波4.1 生成 3*3 矩阵4.2 仿真3*3矩阵4.3 计算均值4.4 仿真均值滤波 一、什么是图像滤波&#xff1f; 图像滤波是…

调整Android板子的分辨率

Android板子通过HDMI连接外屏发现很模糊&#xff0c;先用以下命令查询下板子的分辨率&#xff1a; adb shell wm size 发现板子目前的分辨率是&#xff1a; Physical size: 800x480 调整分辨率命令行&#xff1a; adb shell wm size 1920x1080 注意&#xff1a;系统是roo…

得物App3D创新应用引关注,世界设计之都大会启幕

近日&#xff0c;2024世界设计之都大会&#xff08;WDCC&#xff09;在上海盛大启幕。此次大会以“设计无界 新质生长”为主题&#xff0c;汇聚了全球设计领域的精英与前沿成果&#xff0c;展现了设计作为新质生产力的巨大潜力。主场展览占据了整整3个楼面&#xff0c;总面积达…

Python字符串格式化方法format()

字符串.format(变量1, 变量2, ...)使用大括号{}作为占位符,格式化的两种方法&#xff0c;参数序号法和关键字法&#xff0c;即在大括号中填入关键字还是序号&#xff0c;代码举例 # 参数序号法 print("姓名{0}&#xff0c;班级{1}&#xff0c;年龄{2}".format(张三,…

C#学习笔记(十)

C#学习笔记&#xff08;十&#xff09; 第七章 对象的构造方法与实例方法一、对象的构造方法1. 构造方法初识2. 构造方法的创建3. this关键字4. 构造方法的规范和重载4.1 构造方法的规范 5. 对象初始化器5.1 对象初始化器和构造方法的区别 二、对象的实例方法1. 简单应用2.实例…

代码随想录算法训练营第二天(补) | 滑动窗口、模拟、前缀和

目录 3.4 长度最小的子数组 3.5螺旋矩阵II 3.6 区间和 文章讲解&#xff1a;[58. 区间和 | 代码随想录 3.4 长度最小的子数组 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;拿下滑动窗口&#xff…

Linux历史

Linux 于 1991 年由芬兰学生 Linus Torvalds 作为个人项目开始&#xff0c;旨在创建一个新的免费操作系统内核。在其历史发展中&#xff0c;Linux 内核经历了持续的增长。自 1991 年首次发布源代码以来&#xff0c;Linux 内核从少量的 C 语言文件&#xff0c;且受限于禁止商业发…

机器视觉基础系列四—简单了解背景建模算法

机器视觉基础系列四—简单了解背景建模算法 首先我们应该了解的是背景建模的定义是什么&#xff1f;又有哪些应用场景呢&#xff1f; 背景建模是指通过分析视频序列中的像素值变化情况&#xff0c;从中提取出静态背景部分&#xff0c;并将其用于目标检测、运动跟踪等计算机视觉…

高效地理位置数据处理:Redis Geospatial Indexes详解

在现代应用中&#xff0c;地理位置数据处理变得越来越重要。无论是共享单车、外卖配送还是社交应用&#xff0c;地理位置服务都扮演着关键角色。Redis提供了Geospatial Indexes数据结构&#xff0c;能够高效地存储和查询地理位置数据。本文将介绍Redis的Geospatial Indexes的基…

渗透测试导论

渗透测试的定义和目的 渗透测试&#xff08;Penetration Testing&#xff09;是一项安全演习&#xff0c;网络安全专家尝试查找和利用计算机系统中的漏洞。 模拟攻击的目的是识别攻击者可以利用的系统防御中的薄弱环节。 这就像银行雇用别人假装盗匪&#xff0c;让他们试图闯…

信创服务器下连接kingbase并执行SQL的脚本

信创服务器下连接kingbase并执行SQL的脚本 .bash_profile Get the aliases and functions if [ -f ~/.bashrc ]; then. ~/.bashrc fiUser specific environment and startup programs PATH$PATH:/home/kingbase/Server/bin export PATH export LD_LIBRARY_PATH/home/kingba…