【Spring】01 Bean 介绍

文章目录

      • 1. 定义
      • 2. 特性
        • 1)可重用性
        • 2)可配置性
        • 3)可管理性
      • 3. 生命周期
        • 1)实例化
        • 2)属性设置
        • 3)初始化
        • 4)使用
        • 5)销毁
      • 4. 配置方式
        • 1)XML配置
        • 2)注解配置
        • 3) Java 配置
      • 5. 作用域
      • 6. 依赖注入
        • 1)构造函数注入
        • 2)Setter方法注入
        • 3)接口注入
      • 结语

对于 Spring 框架而言,一切 Java 对象皆是 Bean。

在 Java 开发中,Spring 框架是一个广泛使用的轻量级、全面的应用开发框架。而在 Spring 的世界里,Bean 是一个核心概念,贯穿了整个应用的构建和管理。

1. 定义

在 Spring 框架中,Bean 是指由 Spring IoC 容器管理的对象。它可以是 Java 类的实例,也可以是一些由 Spring 提供的特殊对象。Bean 由 IoC 容器实例化、组装和管理,使得应用的开发者可以专注于业务逻辑而不必关心对象的创建和管理

2. 特性

Bean 的特性有很多,下面我们主要从三个方面去说明一下。

在这里插入图片描述

1)可重用性

Bean 是可重用的组件,可以在应用的不同部分或者不同应用中被引用。这种重用性大大简化了代码的开发和维护。

2)可配置性

通过 IoC 容器,我们可以对 Bean 进行配置,包括属性注入、依赖注入等。这使得 Bean 的行为可以在不修改源代码的情况下进行调整。

3)可管理性

IoC 容器负责 Bean 的生命周期管理,包括实例化、初始化、使用和销毁。这简化了对象的生命周期管理,避免了手动进行繁琐的对象创建和销毁工作。

3. 生命周期

在这里插入图片描述

1)实例化

在实例化阶段,IoC 容器负责创建 Bean 的实例。这通常涉及到调用 Bean 的构造函数。

2)属性设置

在实例化后,IoC 容器会注入 Bean 的属性。这包括基本数据类型、其他 Bean 引用等。

3)初始化

在属性设置后,IoC 容器会调用 Bean 的初始化方法。开发者可以通过配置指定初始化方法,也可以通过实现InitializingBean 接口来定义初始化逻辑。

4)使用

在初始化后,Bean 进入使用阶段。在这个阶段,Bean 被注入到其他对象中,参与应用的业务逻辑。

5)销毁

在应用关闭或者需要释放资源时,IoC 容器会负责调用 Bean 的销毁方法。开发者可以通过配置指定销毁方法,也可以通过实现 DisposableBean 接口来定义销毁逻辑。

4. 配置方式

1)XML配置

在 XML 配置文件中,我们可以使用 元素定义 Bean 的配置信息,包括类名、属性值、依赖关系等。

上一节 【Spring】00 入门指南 中,我们使用的就是这一种方式

<bean id="springDemo" class="org.example.cheney.SpringDemo">
</bean>
2)注解配置

通过在 Java 类上使用注解(如:@Component),我们可以将一个普通的 Java 类声明为一个 Bean。这种方式更加简洁,提高了代码的可读性。

@Component
public class SpringDemo {
    public void hello() {
        System.out.println("Hello World");
    }
}
3) Java 配置

除了 XML 和注解配置外,Spring 还支持通过 Java 类进行配置(@Configuration + @Bean)。通过 Java 配置类,我们可以以编程的方式定义Bean 及其依赖关系。

@Configuration
public class AppConfig {
    @Bean
    public SpringDemo springDemo() {
        return new SpringDemo();
    }
}

5. 作用域

Bean 的作用域定义了 Bean 在 IoC 容器中的生命周期和可见范围。Spring 支持以下几种常见的作用域:

在这里插入图片描述

  • singleton(默认): 在容器中仅存在一个实例,所有对该 Bean 的请求都返回同一个实例
  • prototype: 每次请求都会创建一个新的实例,适用于状态无关的 Bean
  • request: 每次 HTTP 请求都会创建一个新的实例,仅在 Web 应用中有效
  • session: 每个 HTTP Session 都会创建一个新的实例,同样仅在 Web 应用中有效

6. 依赖注入

Bean 之间的依赖关系可以通过依赖注入来实现,包括构造函数注入、Setter方法注入、接口注入等。这种方式降低了对象之间的耦合度,使得系统更加灵活和可维护。

例如:

我们想向 SpringDemo 类 注入了一个 TestService 的类

1)构造函数注入

通过构造函数向 Bean 注入依赖。

public class SpringDemo {
    private final TestService testService;

    public SpringDemo(TestService testService) {
        this.testService = testService;
    }
}
2)Setter方法注入

通过 Setter 方法向 Bean 注入依赖。

public class SpringDemo {
    private TestService testService;

    public void setTestService(TestService testService) {
        this.testService = testService;
    }
}
3)接口注入

通过实现特定接口来获取依赖。

public class SpringDemo implements ApplicationContextAware {
    private TestService testService;

    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        this.testService = context.getBean(TestService.class);
    }
}

结语

我们知道对于 Spring 框架而言,一切 Java 对象皆是 Bean。这里我们讲解了 Spring 中的 Bean 概念、特性、生命周期、配置方式、作用域以及依赖注入。Bean 作为 Spring 框架的核心,不仅提供了组件化和可维护性,还通过IoC 容器实现了对象的自动化管理,因此我们应该好好去理解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker-compose Install gitea

gitea 前言 Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来…

【揭秘】企业自建社群商城:小程序自主经营的成功秘诀!

在当今这个数字化的时代&#xff0c;社群电商已经成为了商业领域的一个重要趋势。社群电商是指通过社交媒体平台&#xff0c;将具有共同兴趣、需求或价值观的人们聚集在一起&#xff0c;形成一个社群&#xff0c;然后通过提供产品或服务来满足这些人的需求。这种商业模式不仅可…

脚本测试postman快速导出python接口测试过程示例

Postman的脚本可以导出多种语言的脚本&#xff0c;方便二次维护开发。 Python的requests库&#xff0c;支持python2和python3&#xff0c;用于发送http/https请求 使用unittest进行接口自动化测试 01、环境准备 1、安装python&#xff08;使用python2或3都可以&#xff09;…

自学编程推荐一个容易学的中文编程工具,构件箱之单选框组简介

一、前言&#xff1a; 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家分享一款中文编程工具&#xff0c;零基础轻…

dialog 在xml文件进行了自适应宽,但是失效了

如下图 讲述了为什么已经设置好了dialog的宽高 到了显示的时候就会失效的原因 解决方式 &#xff1a; 在自定的dialog中的onstart()方法中进行重新设置宽高 Window window getWindow();WindowManager.LayoutParams lp window.getAttributes();lp.height LinearLayout.La…

springboot使用EasyExcel导入数据

springboot使用EasyExcel导入数据 1. 引入依赖 <!-- Easy Excel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version> </dependency>2. 建立对应实体类 假如…

Visual Studio使用Web Deploy发布.NET Web应用到指定服务器的IIS中

前言 今天要讲的是在Window 2008 R2版本的服务器下如何配置Web Deploy&#xff0c;和Visual Studio使用Web Deploy发布.NET Web应用到指定服务器的IIS中。 因为历史原因项目只能使用这个版本的服务器&#xff0c;当然使用其他服务器版本配置流程也是一样的。 Web Deploy介绍 …

Oracle数据库对SAP的支持

其实有时候&#xff0c;很多信息都已经整理好了&#xff0c;你只需要知道他在哪里就好&#xff0c;无需自己整理。 Oracle数据库对SAP的支持&#xff0c;可以从这个网页快速了解。 看前面的概述&#xff1a; Oracle 数据库是全球 SAP 客户中排名第一的数据库&#xff0c;拥有…

插入算法(C语言)

#include<cstdio> #include<iostream> #define N 9 using namespace std; int main() {int arr[N1] { 1,4,7,13,16,19,22,25,280 }; int in,i,j;//要插入的数字//打印要插入数字的数组所有元素printf("插入前的数组: ");for ( i 0; i <N; i){print…

设计模式——单例模式(创建型)

引言 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 问题 单例模式同时解决了两个问题&#xff0c; 所以违反了单一职责原则&#xff1a; 保证一个类只有一个实例。 为什么会有人想要控制一个类所…

回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 (多指标,多图)

回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 &#xff08;多指标&#xff0c;多图&#xff09;效果…

YOLOv8改进 | 2023主干篇 | EfficientViT替换Backbone(高效的视觉变换网络)

一、本文介绍 本文给大家带来的改进机制是EfficientViT&#xff08;高效的视觉变换网络&#xff09;&#xff0c;EfficientViT的核心是一种轻量级的多尺度线性注意力模块&#xff0c;能够在只使用硬件高效操作的情况下实现全局感受野和多尺度学习。本文带来是2023年的最新版本…

是谁,在参与数十亿美元的量子市场?

量子技术是最不为人们所了解、但却最有希望在未来几年颠覆商业和产业的进步技术之一。 很少有像量子信息科学市场这样小的市场能引起如此热烈的讨论。上周&#xff0c;根据Hyperion Research在圣克拉拉举行的Q2B硅谷会议上发布的年度量子计算&#xff08;QC&#xff09;市场更新…

【开源软件】最好的开源软件-2023-第23名 Apache Druid

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

Git使用——IDEA中git branch显示乱码 后面提示standard input 如何解决

问题描述&#xff1a; idea中的terminal中输入git branch显示乱码 解决方案 在idea的file里面&#xff0c;进行设置 选择安装的git下面的bash 参考博客&#xff1a; https://blog.csdn.net/weixin_39925939/article/details/122410453

使用 Timm 库替换 YOLOv8 主干网络 | 1000+ 主干融合YOLOv8

文章目录 前言版本差异说明替换方法parse_moedl( ) 方法_predict_once( ) 方法修改 yaml ,加载主干论文引用timm 是一个包含最先进计算机视觉模型、层、工具、优化器、调度器、数据加载器、数据增强和训练/评估脚本的库。 该库内置了 700 多个预训练模型,并且设计灵活易用。…

算法基础之树的重心

树的重心 无向图: 边没有方向 有向图:边有方向 只能单向询问 无向图建立双向的边 要求输出每种情况连通块个数最大值的最小值**(最小的最大值)** #include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace s…

开发案例:使用canvas实现图表系列之折线图

一、功能结构 实现一个公共组件的时候&#xff0c;首先分析一下大概的实现结构以及开发思路&#xff0c;方便我们少走弯路&#xff0c;也可以使组件更加容易拓展&#xff0c;维护性更强。然后我会把功能逐个拆开来讲&#xff0c;这样大家才能学习到更详细的内容。下面简单阐述…

一个Redis实例最多能存放多少keys

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

【Qt QML入门】Image

Image类型显示一个图像。 使用source属性将图像的源指定为URL。图像可以以Qt支持的任何标准图像格式提供&#xff0c;包括位图格式&#xff0c;如PNG和JPEG&#xff0c;以及矢量图形格式&#xff0c;如SVG。 如果没有指定宽度和高度属性&#xff0c;图像将自动使用加载图像的大…