Spring 核心概念

news2024/10/9 12:30:06
引言

在上一篇文章中,我们介绍了 Spring 框架的基本概念,并搭建了一个简单的 Spring 应用。本文将深入探讨 Spring 框架的核心概念,包括 IoC 容器、依赖注入(DI)、Bean 的生命周期、配置元数据等。通过这些概念的学习,你将能够更好地理解和使用 Spring 框架。

1. IoC 容器
1.1 什么是 IoC?

控制反转(Inversion of Control,IoC)是一种设计模式,用于降低代码间的耦合度。在传统的编程模式中,对象的创建和依赖关系的管理通常是由对象自身来完成的。而在 IoC 模式中,这些职责被交给了外部容器来管理。

IoC 的主要优点包括:

  • 降低耦合度:对象不再需要直接创建其依赖的对象,而是通过容器来注入这些依赖。
  • 提高可测试性:通过依赖注入,可以更容易地在测试环境中模拟依赖对象。
  • 提高灵活性:可以通过配置文件或注解来改变对象的行为,而不需要修改代码。
1.2 Spring IoC 容器

Spring 框架提供了两个主要的 IoC 容器:

  • BeanFactory:这是 Spring IoC 容器的最基础实现,提供了基本的依赖注入功能。BeanFactory 接口是 Spring IoC 容器的核心接口。
  • ApplicationContext:这是 BeanFactory 的扩展,提供了更多的企业级功能,如 AOP、事件传播、国际化等。ApplicationContext 接口是大多数 Spring 应用中使用的 IoC 容器。
1.2.1 BeanFactory 示例
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class BeanFactoryExample {
    public static void main(String[] args) {
        // 加载配置文件
        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));

        // 获取 Bean
        HelloWorld helloWorld = (HelloWorld) factory.getBean("helloWorld");

        // 调用方法
        helloWorld.getMessage();
    }
}
1.2.2 ApplicationContext 示例
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationContextExample {
    public static void main(String[] args) {
        // 加载配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        // 获取 Bean
        HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");

        // 调用方法
        helloWorld.getMessage();
    }
}
2. 依赖注入(DI)
2.1 什么是依赖注入?

依赖注入(Dependency Injection,DI)是 IoC 的一种具体实现方式。通过依赖注入,对象的依赖关系不再由对象自己创建和管理,而是由外部容器在对象创建时注入。

依赖注入有三种主要的方式:

  • 构造器注入:通过构造器传递依赖对象。
  • 设值注入:通过 setter 方法传递依赖对象。
  • 字段注入:通过字段直接注入依赖对象。
2.1.1 构造器注入示例
package com.example;

public class HelloWorld {
    private final String message;

    public HelloWorld(String message) {
        this.message = message;
    }

    public void getMessage() {
        System.out.println("Message : " + message);
    }
}
<bean id="helloWorld" class="com.example.HelloWorld">
    <constructor-arg value="Hello, Spring!" />
</bean>
2.1.2 设值注入示例
package com.example;

public class HelloWorld {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public void getMessage() {
        System.out.println("Message : " + message);
    }
}
<bean id="helloWorld" class="com.example.HelloWorld">
    <property name="message" value="Hello, Spring!" />
</bean>
2.1.3 字段注入示例
package com.example;

import org.springframework.beans.factory.annotation.Autowired;

public class HelloWorld {
    @Autowired
    private String message;

    public void getMessage() {
        System.out.println("Message : " + message);
    }
}
<bean id="helloWorld" class="com.example.HelloWorld" />
3. Bean 的生命周期
3.1 Bean 的生命周期阶段

Spring 容器管理 Bean 的生命周期,主要包括以下几个阶段:

  1. 实例化:Spring 容器通过反射创建 Bean 实例。
  2. 属性赋值:Spring 容器为 Bean 的属性赋值。
  3. 初始化:调用初始化方法,如 @PostConstruct 注解的方法或 init-method 属性指定的方法。
  4. 使用:Bean 被应用使用。
  5. 销毁:当容器关闭时,调用销毁方法,如 @PreDestroy 注解的方法或 destroy-method 属性指定的方法。
3.1.1 初始化和销毁方法示例
package com.example;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class HelloWorld {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public void getMessage() {
        System.out.println("Message : " + message);
    }

    @PostConstruct
    public void init() {
        System.out.println("Bean is initializing...");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("Bean is destroying...");
    }
}
<bean id="helloWorld" class="com.example.HelloWorld" init-method="init" destroy-method="destroy">
    <property name="message" value="Hello, Spring!" />
</bean>
4. 配置元数据
4.1 XML 配置

Spring 最初使用 XML 文件来配置 Bean 和依赖关系。虽然现在更推荐使用注解配置,但了解 XML 配置仍然是很有帮助的。

4.1.1 XML 配置示例
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="helloWorld" class="com.example.HelloWorld" init-method="init" destroy-method="destroy">
        <property name="message" value="Hello, Spring!" />
    </bean>

</beans>
4.2 注解配置

随着 Java 5 的推出,Spring 引入了注解配置,使得配置更加简洁和灵活。

4.2.1 注解配置示例
package com.example;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public HelloWorld helloWorld() {
        HelloWorld helloWorld = new HelloWorld();
        helloWorld.setMessage("Hello, Spring!");
        return helloWorld;
    }
}
package com.example;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AnnotationConfigExample {
    public static void main(String[] args) {
        // 加载配置类
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // 获取 Bean
        HelloWorld helloWorld = context.getBean(HelloWorld.class);

        // 调用方法
        helloWorld.getMessage();

        // 关闭上下文
        context.close();
    }
}
5. 总结

通过本文,我们深入探讨了 Spring 框架的核心概念,包括 IoC 容器、依赖注入(DI)、Bean 的生命周期和配置元数据。理解这些概念对于掌握 Spring 框架至关重要。希望本文对你有所帮助,欢迎继续关注后续文章!

6. 扩展阅读
  • 官方文档:Spring Framework Reference Documentation
  • Spring 官网:Spring Official Website
  • 书籍推荐:《Spring in Action》、《Spring Boot in Action》

如果你有任何疑问或建议,欢迎在评论区留言交流!

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

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

相关文章

服装生产管理:SpringBoot框架的创新设计

4 系统设计 4.1 系统结构设计 在结构设计过程中&#xff0c;首先对系统进行需求分析&#xff0c;然后进行系统初步设计&#xff0c;将系统功能模块细化&#xff0c;具体分析每一个功能模块具体应该首先哪些功能&#xff0c;最后将各个模块进行整合&#xff0c;实现系统结构的…

基于SSM的学生社团管理系统—计算机毕业设计源码37391

目 录 摘要 1 绪论 1.1研究背景 1.2研究目的和意义 1.3系统开发技术的特色 1.4 ssm框架介绍 1.5论文结构与章节安排 2 学生社团管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据流程 2.3.2业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能…

Authentication Lab | User Agent Strings

关注这个靶场的其它相关笔记&#xff1a;Authentication Lab —— 靶场笔记合集-CSDN博客 0x01&#xff1a;User Agent Strings 前情提要 在某些特殊的场景中&#xff0c;服务端会假定客户端可以信任&#xff0c;并根据客户端告知它的内容做出身份验证的决策。 然而&#xff…

Android开发banner效果

Android开发banner效果 banner在每个app都会有的 一、思路&#xff1a; 用viewpager也可以做。但我是引进第三方库的 二、效果图&#xff1a; 三、关键代码&#xff1a; // 联系&#xff1a;893151960 public class MainActivity extends AppCompatActivity {private Bann…

【MATLAB代码】基于RSSI原理的蓝牙定位程序(N个锚点、三维空间),源代码可直接复制

文章目录 介绍主要功能技术细节适用场景程序结构运行截图源代码详细教程:基于RSSI的蓝牙定位程序1. 准备工作2. 代码结构2.1 清理工作环境2.2 定义参数2.3 生成锚点坐标2.4 定义信号强度与距离的关系2.5 模拟未知点的位置2.6 定位函数2.7 绘图2.8 输出结果2.9 定义定位函数3. …

RDD的介绍、RDD的特点、创建RDD数据

文章目录 1. RDD介绍1.1 Spark开发方式1.1.1 交互式开发1.1.2 脚本式开发 1.2 Spark支持的开发语言1.3 RDD介绍 2. RDD特性3. 创建RDD数据3.1 Python数据转化为RDD3.2 文件数据HDFS转化为RDD3.3 RDD分区3.4 小文件数据读取 1. RDD介绍 1.1 Spark开发方式 1.1.1 交互式开发 通…

【LeetCode】动态规划—712. 两个字符串的最小ASCII删除和(附完整Python/C++代码)

动态规划—712. 两个字符串的最小ASCII删除和 前言题目描述基本思路1. 问题定义2. 理解问题和递推关系3. 解决方法3.1 动态规划方法3.2 空间优化的动态规划 4. 进一步优化5. 小总结 代码实现PythonPython3代码实现Python 代码解释 CC代码实现C 代码解释 总结: 前言 在字符串处…

【已解决】endnote只显示十条文献/licence失效/this license has been suspended

问题&#xff1a;打开endnote后弹窗显示 Were sorry,this license has been suspended due to ...... 关闭弹窗发现只剩10条文献显示了 解决方法&#xff1a; ①关闭杀毒软件 ②找到endnote源文件夹下的License.dat文件&#xff08;找不到的话直接在“此电脑”中搜索&#x…

倒计时3天!飞凌嵌入式邀您共聚第90届CMEF

10月12日~15日&#xff0c;第90届中国国际医疗器械博览会(CMEF)即将在深圳国际会展中心(宝安)隆重举行&#xff0c;4000品牌企业将携数万款产品集中亮相&#xff0c;为全球健康产业带来探析前沿、洞见未来的医疗盛宴。 飞凌嵌入式作为业界领先的嵌入式解决方案提供商&#xff…

七、InnoDB数据存储结构

文章目录 1. 数据库的存储结构:页1.1 磁盘与内存交互基本单位:页1.2 页结构概述1.3 页的大小1.4 页的上层结构2. 页的内部结构2.1 第1部分:File Header(文件头部)和 File Trailer(文件尾部)2.1.1 File Header(文件头部)2.1.2 File tRAILER(文件尾部)2.2 第2部分:Fr…

电商价格监测的创新之路

在当今数字化高速发展的时代&#xff0c;电商如汹涌的浪潮席卷了商业的每一个角落。品牌们在这片广阔的电商海洋中奋力前行&#xff0c;而价格监测则成为了他们手中至关重要的罗盘。 力维网络以其专业的价格监测服务&#xff0c;为品牌在电商之海的航行点亮了一盏明灯。然而&a…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第二十一章 makefile基本语法(下)

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

韦东山老师linux快速入门otg检测不到方案总结

我是如何解决, 第二节, otg 串口检测不到的, 开发手册链接: https://wwyz.lanzoul.com/iF1TA2c21uoh 我首先按照评论区, 老师说的, 根据完全开发手册, 搜索otg, 然后找到老师当时 烧写系统的时候, 利用usb启动, 然后otg链接, 然后 安装了两个驱动, 往后翻, 就可以翻到 然后重…

多系统数据交换与共享技术方案(医疗行业为例,Doc原件)

目录 1 方案概述 1.1 背景 1.2 参考规范 2 需求分析 2.1 交换内容 2.2 功能需求 1) 消息传输 2) 数据整合 3) 服务集成 4) 流程整合 5) 管理功能 3 总体建设方案 3.1 实现思路 3.1.1 交换方案比选 3.1.2 技术优势 3.2 总体架构 3.3 数据交换与共享基本模型 3.…

ATAM需求说明-系统架构师(七十六)

1体系结构权衡分析法ATAM(Architecture Trade Off Analyzer Method)是一种常见的结构权衡分析法&#xff0c;该框架主要关注系统的&#xff08;&#xff09;&#xff0c;针对性能、安全性、可用性和可修改性&#xff0c;在系统开发前进行分析、评价和这种。 A 需求说明 B 架构…

大型生物制药企业如何实现安全又高效地跨网域数据传输?

大型生物制药企业由于组织结构庞大、业务覆盖研发、生产及销售&#xff0c;因此内部会再细分为多个管理单位&#xff0c;包括研发部门、生产部门、质量控制部门、供应链管理部门及营销部和日常业务支撑部门等。在物理区域划分上&#xff0c;大型生物制药企业会设立实验室、研发…

Java—逻辑控制与输入输出

各位看官&#xff1a;如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论&#xff0c;感谢您的支持&#xff01;&#xff01;&#xff01; 一.顺序结构&#xff1a; 我每天起床&#xff0c;躺在床上玩手机&#xff0c;然后吃中午饭&#xff0c;睡…

[C++ 核心编程]笔记 2 栈区和堆区

栈区: 由编译器自动分配释放&#xff0c;存放函数的参数值,同部变量等 注意事项&#xff1a;不要返回局部变量的地址&#xff0c;栈区开辟的数据由编译器自动释放 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std;//栈区数据注意事项 不要…

【架构师】系统架构相关知识

本文仅做技术交流&#xff0c;转载请注明来源&#xff0c;切勿商用。 参考&#xff1a;系统架构师考纲及教材 1、系统架构的概念 架构是一种表达&#xff0c;而非可运行的软件。 1&#xff09;分析设计在满足所规定的需求方面的有效性 2&#xff09;在设计变更相对容易的阶段…

【读书笔记·VLSI电路设计方法解密】问题4:今天的设计环境中使用的主要工艺技术是什么

主流的工艺技术是互补金属氧化物半导体&#xff08;CMOS&#xff09;技术。其他技术还包括双极性、双极CMOS&#xff08;biCMOS&#xff09;、绝缘体上硅&#xff08;SOI&#xff09;和砷化镓&#xff08;GaAs&#xff09;。 在CMOS技术中&#xff0c;"互补对称"指的…