编织Spring魔法:解读核心容器中的Beans机制【beans 一】

欢迎来到我的博客,代码的世界里,每一行都是一个故事


在这里插入图片描述

编织Spring魔法:解读核心容器中的Beans机制【beans 一】

    • 前言
    • 什么是Spring核心容器
    • Beans的生命周期管理:
      • 初始化和销毁方法:
      • 各种作用域:
    • beans的配置方式
      • 1. XML配置:
      • 2. Java注解配置:
      • 3. JavaConfig方式:
    • 依赖注入的实现
      • 1. 构造器注入:
      • 2. Setter 方法注入:
      • 3. 接口注入:
    • 循环依赖
    • beans的AOP支持

前言

在现代软件开发领域,Spring框架已经成为构建强大、灵活、可维护应用程序的不二选择。而Spring的核心容器是这一框架的心脏,Beans则是其中最为关键的组成部分。本文将带您深入探索这个令人着迷的世界,解锁Beans的神秘面纱,让您更深刻地理解Spring的精髓。

什么是Spring核心容器

Spring核心容器是Spring框架的核心部分,它提供了一种管理和组织应用组件的方式。核心容器包括以下四个模块:

  1. Beans(Bean模块): 这是Spring框架的基础,负责创建、管理和装配Java对象(称为Beans)。Beans是由Spring容器管理的应用组件,这些组件在Spring应用程序中相互协作。

  2. Core(核心模块): 提供了Spring框架的核心功能,包括IoC容器的基本功能。这部分包括IoC(控制反转)和DI(依赖注入)的实现。

  3. Context(上下文模块): 构建于Core模块之上,为应用程序对象定义了一种访问方式。它为开发者提供了更广泛的功能,如国际化、事件传播、应用程序层面的配置等。

  4. Expression Language(表达式语言模块): 允许在运行时查询和操作对象图,通常用于查询和操作Spring Beans。

容器的角色和功能:

  • 实例化: 容器负责实例化应用程序中的对象(Beans)。这意味着开发者不再需要直接使用new关键字来创建对象。

  • 配置: 容器允许开发者通过配置文件或注解来描述组件之间的关系和如何创建这些组件。

  • 组装: 容器负责将不同组件组装在一起,形成一个完整的应用程序。

  • 管理生命周期: 容器管理Beans的生命周期,包括创建、初始化、使用、销毁等阶段。

IoC和DI的基本概念:

  • IoC(控制反转): 是一种设计模式,它将传统的程序控制流反转过来,由容器控制应用程序的流程。在Spring中,IoC由容器负责实例化、装配和管理Beans。

  • DI(依赖注入): 是IoC的一种实现方式,它指的是通过容器将依赖关系注入到对象中,而不是在对象内部创建它们。这样做的好处是提高了组件的可重用性和松耦合性。

总体而言,Spring核心容器通过IoC和DI的实现,提供了一种灵活、可维护和可扩展的方式来组织和管理Java应用程序的组件。

在Spring框架中,Beans的生命周期由Spring容器管理,包括初始化和销毁阶段。同时,Spring提供了不同的作用域,其中最常见的是singleton和prototype。

Beans的生命周期管理:

  1. 实例化: 当Spring容器启动时,它会通过反射或工厂方法等方式创建Bean的实例。

  2. 属性设置: 容器通过依赖注入将配置的属性值或引用设置到Bean中。

  3. BeanPostProcessor的前置处理(可选): 如果配置了BeanPostProcessor,它将在Bean的初始化前后执行自定义的处理逻辑。

  4. 初始化: 如果Bean实现了InitializingBean接口,或者在配置中通过init-method指定了初始化方法,容器将调用该方法来完成初始化。

  5. 使用: Bean可以被应用程序正常使用。

  6. BeanPostProcessor的后置处理(可选): 如果配置了BeanPostProcessor,它将在Bean的初始化前后执行自定义的处理逻辑。

  7. 销毁: 如果Bean实现了DisposableBean接口,或者在配置中通过destroy-method指定了销毁方法,容器将在Bean被销毁时调用该方法。

初始化和销毁方法:

在配置Bean时,可以通过以下两种方式指定初始化和销毁方法:

  • 通过接口: 实现InitializingBean接口来定义初始化逻辑,实现DisposableBean接口来定义销毁逻辑。

    public class MyBean implements InitializingBean, DisposableBean {
        // 初始化逻辑
        @Override
        public void afterPropertiesSet() throws Exception {
            // ...
        }
    
        // 销毁逻辑
        @Override
        public void destroy() throws Exception {
            // ...
        }
    }
    
  • 通过配置: 在XML或Java配置中,使用init-methoddestroy-method属性来指定初始化和销毁方法的名称。

    <bean id="myBean" class="com.example.MyBean" init-method="init" destroy-method="cleanup"/>
    

各种作用域:

  1. Singleton(单例): 在整个Spring容器中,只存在一个Bean的实例。默认情况下,所有的Bean都是单例的。

    <bean id="mySingletonBean" class="com.example.MyBean" scope="singleton"/>
    
  2. Prototype(原型): 每次通过容器获取Bean时,都会创建一个新的实例。

    <bean id="myPrototypeBean" class="com.example.MyBean" scope="prototype"/>
    
  3. Request(请求): 在每个HTTP请求中,容器会为Bean创建一个新的实例。

  4. Session(会话): 在每个用户会话中,容器会为Bean创建一个新的实例。

  5. Global Session: 类似于Session作用域,但用于Portlet应用。

选择适当的作用域取决于应用程序的需求和Bean的性质。

beans的配置方式

在Spring框架中,有多种方式可以配置Beans,包括XML配置、Java注解配置和JavaConfig方式。下面是每种配置方式的简要介绍:

1. XML配置:

使用XML配置是Spring最传统和最常见的方式之一。在XML配置中,开发者可以定义Beans及其属性、依赖关系等。以下是一个简单的XML配置示例:

<!-- 配置一个名为 "myBean" 的Bean -->
<bean id="myBean" class="com.example.MyBean">
    <property name="property1" value="someValue"/>
    <property name="property2" ref="anotherBean"/>
</bean>

<!-- 配置另一个Bean -->
<bean id="anotherBean" class="com.example.AnotherBean"/>

2. Java注解配置:

使用Java注解配置,开发者可以通过在Java类上添加注解来描述Beans。常用的注解包括@Component@Service@Repository等,用于标识不同类型的组件。以下是一个简单的Java注解配置示例:

@Component
public class MyBean {
    private String property1;
    private AnotherBean property2;

    // 省略构造函数和其他方法

    @Value("someValue")
    public void setProperty1(String property1) {
        this.property1 = property1;
    }

    @Autowired
    public void setProperty2(AnotherBean property2) {
        this.property2 = property2;
    }
}

3. JavaConfig方式:

JavaConfig方式允许开发者使用Java类来配置Spring应用程序,而不需要XML文件。通过创建一个带有@Configuration注解的类,并在其中使用@Bean注解来定义Beans,可以实现JavaConfig。以下是一个简单的JavaConfig配置示例:

@Configuration
public class AppConfig {

    @Bean
    public MyBean myBean() {
        MyBean bean = new MyBean();
        bean.setProperty1("someValue");
        bean.setProperty2(anotherBean());
        return bean;
    }

    @Bean
    public AnotherBean anotherBean() {
        return new AnotherBean();
    }
}

在上述示例中,AppConfig类通过@Configuration注解表示它是一个配置类,@Bean注解用于定义Beans。然后,可以通过将这个配置类传递给AnnotationConfigApplicationContext来加载配置。

每种配置方式都有其适用的场景和优势,开发者可以根据项目需求和个人偏好选择合适的配置方式。通常,大型项目可能会结合使用这些配置方式,以便更好地组织和管理应用程序的组件。

依赖注入的实现

依赖注入(Dependency Injection,DI)是Spring框架的核心特征之一,它通过不同的方式实现将依赖对象注入到目标对象中。以下是三种常见的依赖注入方式的实现:

1. 构造器注入:

构造器注入是通过目标对象的构造方法来注入依赖的方式。在Spring中,通过在类的构造方法上添加 @Autowired 注解来实现构造器注入。

public class MyClass {

    private MyDependency myDependency;

    @Autowired
    public MyClass(MyDependency myDependency) {
        this.myDependency = myDependency;
    }
}

2. Setter 方法注入:

Setter 方法注入是通过目标对象的 setter 方法来注入依赖的方式。在Spring中,通过在对应的 setter 方法上添加 @Autowired 注解来实现Setter方法注入。

public class MyClass {

    private MyDependency myDependency;

    @Autowired
    public void setMyDependency(MyDependency myDependency) {
        this.myDependency = myDependency;
    }
}

3. 接口注入:

接口注入是通过目标对象实现一个接口,在接口中定义依赖的属性,然后Spring通过接口来注入依赖。

public interface MyDependencySetter {
    void setMyDependency(MyDependency myDependency);
}

public class MyClass implements MyDependencySetter {

    private MyDependency myDependency;

    @Override
    public void setMyDependency(MyDependency myDependency) {
        this.myDependency = myDependency;
    }
}

这三种注入方式在Spring框架中都能够很好地工作,选择使用哪一种取决于具体的需求和设计偏好。通常而言,构造器注入在对象创建时一次性注入所有依赖,Setter 方法注入提供了更灵活的注入方式,而接口注入可以用于实现一些特定的接口,定义自己的注入规范。

循环依赖

spring的三级缓存,以及循环依赖的形成和解决(详细)

beans的AOP支持

解锁Spring Boot AOP的魔力:优雅地管理交叉关注点

深入理解Spring Boot AOP:CGLIB代理与JDK动态代理的完全指南

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

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

相关文章

值得推荐的 5 个前端性能测试工具

前言 PageSpeed Insights 谷歌开发的一个免费的网页分析工具&#xff0c;在地址栏中输入被分析的网站url地址&#xff0c;点击分析&#xff0c; 可模拟移动设备访问页面结果分析 桌面设备访问页面结果分析 前端开发工程师&#xff0c;可以根据这个报告进行页面优化 Lighthous…

7-验证码识别

文章目录 验证码识别1、验证码的用途和分类验证码的作用验证身份验证行为 验证码的类型静态验证码&#xff1a;图片验证码问答式验证码问答式验证码行为式验证码&#xff1a;点击行为式验证码&#xff1a;拖动间接式验证码&#xff1a;短信、邮件、语音电话无感验证码 2、验证码…

微信小程序封装vant 下拉框select 多选组件

老规矩先上效果图&#xff1a; 本组件主要由小程序vant ui组件&#xff0c;vant 小程序ui网址&#xff1a;vant-weapp 主要代码如下: 先封装子组件&#xff1a; select-checkbox 放在 components 文件夹里面 select-checkbox.wxml: <view><van-field label"{…

1月3日代码随想录反转二叉树

226翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,…

HarmonyOS调研分享

经过十多年的发展&#xff0c;传统移动互联网的增长红利已渐见顶。万物互联时代正在开启&#xff0c;应用的设备底座将从几十亿手机扩展到数百亿 IoT 设备。GSMA 预测到 2025 年&#xff0c;全球物联网终端连接数量将达 246 亿个&#xff0c;其中消费物联网终端连接数量将达 11…

Kaggle:数据科学竞赛的殿堂与个人成长的舞台

一、产品简介&#xff1a; 它是一个举办数据科学竞赛、托管数据库、编写和分享代码的在线平台。这个数据集就像一个超级大的信息库&#xff0c;包含了我们日常生活中的各种事情&#xff0c;比如电子游戏的销量啊&#xff0c;还有空气质量如何受到污染等等。这些信息都是现实中…

中学生适宜用什么样的台灯?分享适合中学生的护眼台灯

现在的学生都面临着很大的学习压力&#xff0c;每天长时间的用眼&#xff0c;加上缺少户外运动&#xff0c;这也导致国内大多数青少年学生都存在近视的现象。所以保护眼睛、保护孩子视力健康这件事是刻不容缓的&#xff0c;而我们能为孩子做的就是监督孩子养成良好的用眼习惯&a…

javascript 常见工具函数(三)

21.克隆数组的几种方法&#xff1a; &#xff08;1&#xff09;slice方法&#xff1a; let arr [1,2,3,4] let arr1 arr.slice() //或者是 let arr1 arr.slice(0) arr[0] 6 console.log(arr) // [6, 2, 3, 4] console.log(arr1) // [1, 2, 3, 4] &#xff08;2&…

docker安装esrally教程

本来用源码安装&#xff0c;首先要安装git,python,jdk&#xff0c;还要配环境特别繁琐&#xff0c;好不容易安装好后运行报如下错误&#xff0c;在官网和github搜不到解决方案&#xff0c;无奈之下只能用docker安装。 [ERROR] Cannot race. Error in load generator [0]Cannot…

MS5148T荣获2023电子信息半导体行业年度卓越产品

MS5148T是一款适合高精度、低成本测量应用的24bit模数转换器。内部集成了低噪声可编程增益放大器、高精度Δ-Σ模数转换器和内部振荡器、低温漂基准和两路匹配的可编程电流源&#xff0c;以及传感器检测Burnout电流源和偏置电压产生器&#xff0c;支持四路差分输入。 主要特点…

设计模式之建造者模式【创造者模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…

rime中州韵小狼毫 inputShow lua Filter 输入字符透传滤镜

在 rime中州韵小狼毫 inputShow lua Translator 一文中&#xff0c;我们通过 inputShow.lua 定制了 inputShow_translator&#xff0c;这使得我们的输入方案可以将用户输入的字符透传到候选列表中来。如下&#x1f447;&#xff1a; &#x1f446;上图中我们在候选列表中看到了…

excel需要把一个表格的信息放到另一个表格中,但是两个表格列的顺序不同,用VLOOKUP函数

情景再现&#xff1a; 图1 图2 任务&#xff1a;图1中信息不全&#xff0c;需要把图2中的身份证号和手机号填到图1中&#xff0c;且需保持图1人员顺序不变。 困难之处&#xff1a;1.目前人员较少&#xff0c;尚且可以搜索着一个个输入&#xff0c;但如果好几百好几千人呢&am…

学习Vue及项目工程化

学习Vue及项目工程化 Vue快速上手插值表达式 Vue基本命令v-htmlv-showv-if 和 v-else 和 v-else-ifv-on和click函数调用v-bindv-for案例--书架 v-model功能总结 综合案例-小黑记事本列表渲染删除功能添加功能底部统计清空 项目工程化更换npm镜像方式一&#xff1a;在网页是去创…

RKE安装k8s及部署高可用rancher之证书在外面的7层LB(nginx中) 7层负载均衡

一 了解 Rancher 1 推荐架构 安装 Rancher 的方式有两种&#xff1a;单节点安装和高可用集群安装。因为单节点安装只适用于测试和 demo 环境&#xff0c;而且单节点安装和高可用集群安装之间不能进行数据迁移&#xff0c;所以推荐从一开始就使用高可用集群安装的方式安装 Ran…

初学者快速入门学习日语,PDF文档音频教学资料合集

一、资料描述 本套学习资料是很全面的&#xff0c;共有734份文件&#xff0c;包括PDF&#xff0c;PPT&#xff0c;表格&#xff0c;图片&#xff0c;音频等多种格式&#xff0c;可以作为初级日语的学习教材&#xff0c;也是非常适合初学者入门的&#xff0c;可以帮助大家快速的…

在macOS中搭建.NET MAUI开发环境

文章目录 准备安装扩展安装 .NET安装工作负载安装 Xcode 命令行工具调试安卓应用安装 JDK安装 Android SDK 安装 Android 模拟器安装模拟器安装镜像创建虚拟机 同意许可条款创建 MAUI 项目调试 MAUI 应用切换调试目标 参考资料 准备 一台 macOS Monterey 以上的电脑安装 XCode…

Android14之audit2allow自动生成Selinux规则(一百七十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

软考网络工程师教程第五版(2018最新版)

软考网络工程师教程第五版(2018最新版) 内容简介 本书是全国计算机技术与软件专业技术资格(水平)考试指定用书。作者在前4版的基础上,根据网络工程师新版大纲的要求,针对考试的重点内容做了较大篇幅的修订,书中主要内容包括数据通信、广域通信网、局域网、城域网、因特网…

Vue实现JSON字符串格式化编辑器组件

相信很多同学都用过网上的在线JSON格式化工具来将杂乱的JSON数据转换成易于我们阅读和编辑的格式。那么&#xff0c;你有没有想过自己动手实现一个这样的工具呢&#xff1f;今天&#xff0c;我将介绍如何使用Vue.js来构建一个简单的JSON格式化工具。 功能简述 支持格式化JSON字…