Spring(一篇就懂)

Spring框架简介

  • Spring 是一个开源的Java企业级应用开发框架。

  • 特点

    1. 控制反转(IoC):通过依赖注入(DI)减少组件间的耦合,由Spring容器负责对象的创建和绑定。

    2. 面向切面编程(AOP):允许开发者分离应用程序的业务逻辑与系统服务(如事务管理和安全性)。

    3. 容器:提供用于配置和管理对象生命周期的容器,可通过XML、注解或Java代码配置。

    4. 抽象:为多种编程模型和协议(如JDBC、JMS、JPA等)提供抽象层,简化使用。

    5. 声明式事务管理:支持声明式事务管理,简化事务操作并分离业务代码。

    6. 社区和生态系统:拥有庞大的开发者社区及相关项目(如Spring Boot、Spring Cloud、Spring Data等)。

使用Spring完成第一个案例的步骤

  1. 创建Maven项目。

  2. pom.xml中导入Spring的JAR包:

     <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.9.RELEASE</version></dependency>

  3. 配置Bean对象的XML文件。

  4. 编写Spring测试代码:

     
    public class MainApp {public static void main(String[] args) {ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");HelloWorld helloWorld = (HelloWorld) app.getBean("helloWorld");String message = helloWorld.getMessage();System.out.println(message);}}

BeanFactory和IOC容器

  • BeanFactory:Spring中最基础的核心接口,提供IOC功能,负责实例化、配置和组装Bean。

  • ApplicationContext:BeanFactory的子接口,提供更多企业级支持功能,如国际化、事件传播、AOP等。

IOC和DI

  • IOC(控制反转):将对象的创建和管理控制权从程序代码转移到外部容器或框架。

  • DI(依赖注入):实现IOC的具体技术,通过动态注入依赖关系到组件中,降低组件间耦合度。

Bean实例化对象的基本流程

  1. 资源定位:通过资源定位机制找到配置文件。

  2. Bean定义读取:使用Bean定义读取器读取配置文件中的信息。

  3. 创建BeanDefinition对象:为每个Bean创建一个BeanDefinition对象。

  4. 注册BeanDefinition:将BeanDefinition对象注册到BeanDefinitionRegistry

  5. BeanDefinitionMap存储:存储在BeanFactoryBeanDefinitionMap中。

  6. 请求Bean实例:应用程序请求容器中的Bean时,查找BeanDefinitionMap

  7. 实例化Bean:根据BeanDefinition信息创建Bean实例。

  8. 依赖注入:通过构造器注入或设值注入为Bean实例注入依赖。

  9. Bean生命周期处理:调用Bean的生命周期回调方法。

  10. 存储到singletonObjects:单例Bean实例存储在容器的singletonObjects缓存中。

  11. 使用Bean:Bean实例准备好,可供应用程序使用。

  12. 容器关闭:调用单例Bean的销毁方法。

XML方式配置Bean

  • bean标签常用属性

    • id:Bean的唯一标识。

    • name:Bean的别名。

    • class:定义类的全限定名。

    • singleton:定义Bean是否为单例。

    • depends-on:指定当前Bean的依赖Bean。

    • init-method:指定Bean的初始化方法。

    • destroy-method:指定Bean的销毁方法。

    • lazy-init:指定Bean的初始化时间。

    • autowire:指定Bean的自动注入方式。

    • scope:Bean的作用范围。

    • dependency-check:指定Bean的依赖检查模式。

  • autowire:有五个值(no, byName, byType, constructor, autodetect, default)。

  • scope:有五个值(singleton, prototype, request, session, globalSession)。

  • dependency-check:有四个值(simple, object, all, none)。

  • property标签

    • name:指定属性的名称。

    • value:指定属性的值。

    • ref:指定引用对象类型的值。

Spring实例化对象的几种方式

  1. 通过构造器实例化。

    • Spring容器启动时读取XML配置文件。

    • 根据配置文件中的<bean>标签,使用反射机制创建ExampleBean类的实例。

    • 如果有属性注入,Spring会在创建实例后填充这些属性。

  2. 通过FactoryBean接口进行实例化。

    • 建一个类实现FactoryBean接口。

    • 实现getObject()方法,该方法返回实际要创建的Bean实例。

    • 在Spring配置中定义这个FactoryBean。
       

  3. 通过静态工厂。

  4. 通过实例工厂。


  5. 通过注解。

    • 在类上添加@Component或其衍生注解(如@Service、@Repository)。

    • 配置Spring的组件扫描,指定要扫描的包。

    • 启动Spring容器,它会扫描指定的包并查找标记了注解的类。

    • Spring容器会自动实例化这些类。

Spring依赖注入的几种方式

  1. set方式注入。

  2. 构造器方式注入。

    还是以set方式注入的代码为例;使用构造器方式注入的话只需要改变两个地方即可: 一:把set方法改成带参的构造方法; 二:把bean.xml里面的<property>标签换成<constructor-arg>标签 详解如图所示:

  3. 自动装配(byName, byType)

    • autowire='byName'

      在前面set方式注入的基础代码上,使用自动装配后就不需要我们手动在bean.xml文件里面用标签去配置,而是使用autowire属性指明。看图说明:

    • autowire='byType'

      如果自动装配时选择byType作为值,那么名字一不一致就无所谓了,但是要求注入的Type只能是一个,如果有多个则发生报错。看图:

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

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

相关文章

企业高性能web服务器(nginx)

目录 Web服务器基础介绍 正常情况下的单次web服务器访问流程 Apache 经典的 Web服务端 Apache prefork 模型 Apache work模型 Apache event模型 服务端的I/O流程 服务器的I/O 磁盘I/O 网络I/O 网络I/O处理过程 I/O模型 I/O模型相关概念 同步/异步 阻塞/非阻塞 网…

面向对象06:super关键字详解

本节内容视频链接&#xff1a;面向对象10&#xff1a;Super详解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p69&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的‌super关键字是一个特殊的引用&#xff0c;‌用于指代父类对象‌。‌在子…

鸿蒙HarmonyOS实战:IPC与RPC设备内进程通信

基本 IPC&#xff08;Inter-Process Communication&#xff09;与RPC&#xff08;Remote Procedure Call&#xff09;用于实现跨进程通信&#xff0c;不同的是前者使用Binder驱动&#xff0c;用于设备内的跨进程通信&#xff0c;后者使用软总线驱动&#xff0c;用于跨设备跨进…

学习yolo+Java+opencv简单案例(三)

主要内容&#xff1a;车牌检测识别&#xff08;什么颜色的车牌&#xff0c;车牌号&#xff09; 模型作用&#xff1a;车牌检测&#xff0c;车牌识别 文章的最后附上我的源码地址。 学习还可以参考我前两篇博客&#xff1a; 学习yoloJavaopencv简单案例&#xff08;一&#xff0…

Datawhale X 李宏毅苹果书 AI夏令营-深度学习入门班-task2

一开始假设的模型是ybw1&#xff0c;但在可视化预测值和真实值后&#xff0c;发现数据具有规律性&#xff0c;因此换成7天 额&#xff0c;不知道为什么要在这里这样引入sigmoid函数&#xff0c;有点怪怪的&#xff0c;但确实用无限多的分段函数就能拟合很多曲线 所以这里的意…

5步实现猫眼电影爬虫与k-means算法可视化分析

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

框架——特殊符号处理,模糊查询

1.特殊符号处理 在 mybatis 中的 xml 文件中&#xff0c;存在一些特殊的符号&#xff0c;比如&#xff1a;<、>、"、&、<>等&#xff0c;正常书写mybatis 会报错&#xff0c;需要对这些符号进行转义。具体转义如下所示&#xff1a; 特殊字符 转义字符 &…

【GNSS射频前端】MA2769初识

MAX2769 芯片概述&#xff1a; MAX2769是一款单芯片多系统GNSS接收器&#xff0c;采用Maxim的低功耗SiGe BiCMOS工艺技术。集成了包括双输入低噪声放大器&#xff08;LNA&#xff09;、混频器、图像拒绝滤波器、可编程增益放大器&#xff08;PGA&#xff09;、压控振荡器&#…

微信小游戏授权问题

微信小程序获取用户相关信息的接口&#xff0c;如wx.getUserCloudStorage&#xff0c;报错&#xff1a;please go to mp to announce your privacy usage。 需要在微信公众平台设置用户隐私保护。

(论文解读)Domain Adaptation via Prompt Learning

摘要 无监督域适应( UDA )旨在将从带有标签的源域数据中学习到的模型适应到未标注的目标域数据集。现有的UDA方法通过对齐源域和目标域特征空间来学习领域不变特征。这种对齐是通过约束实现的&#xff0c;例如统计差异最小化或对抗学习。 然而&#xff0c;这些约束会导致语义…

AudioNotes -将音频内容转 markdown

文章目录 一、关于 AudioNotes效果展示音视频识别和整理与音视频内容对话 二、使用方法1、安装 Ollama2、拉取模型3、部署服务3.1 Docker部署&#xff08;推荐&#xff09;&#x1f433;3.2 本地部署 &#x1f4e6; 一、关于 AudioNotes AudioNotes 能够快速提取音视频的内容&…

【C# 】使用List<实体类>

1. 使用List<实体类> 要在C#中使用List<EntityTemp>并实现查找数据输出&#xff0c;首先需要定义EntityTemp类&#xff0c;并创建一个List<EntityTemp>类型的列表。然后&#xff0c;你可以使用LINQ或其他方法来查找和输出数据。 假设EntityTemp类具有一个…

Kafka快速入门:Kafka驱动JavaApi的使用

生产者和消费者是Kafka的核心概念之一&#xff0c;它们在客户端被创建和使用&#xff0c;并且包含了许多与Kafka性能和机制相关的配置。虽然Kafka提供的命令行工具能够执行许多基本操作&#xff0c;但它无法实现所有可能的性能优化。相比之下&#xff0c;使用Java API可以充分利…

zigbee笔记、十五、组播通信原理

一、zigbee四种通讯 1、单播&#xff08;略&#xff09; 2、广播&#xff08;略&#xff09; 3、组播&#xff1a;在zigbee网络中&#xff0c;模块可以用分组来标记&#xff0c;发送的模块如果发送的组号和网络里面标记接收模块的组号相对应&#xff0c;那么这些模块就可以拿到…

C#/.NET/.NET Core技术前沿周刊 | 第 1 期(2024年8.12-8.18)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿&#xff0c;推荐…

innodb_buffer_pool_size在线缩小操作

一、背景 测试数据库内存32G&#xff0c;只有MySQL数据库&#xff0c;但是innodb_buffer_pool_size设置了24G&#xff0c;导致经常出现lack of memory问题、lack of swap问题。 因为使用了MySQL5.7.36版本&#xff0c;利用innodb_buffer_pool_size参数值可在线调整的新特性&…

C++函数调用栈从何而来

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 个人主页&#xff1a; rainInSunny | 个人专栏&#xff1a; C那些事儿、 Qt那些事儿 文章目录 写在前面原理综述x86架构函数调用栈分析如何获取rbp寄存器的值总结 写在前面 程序员对函数调用栈是再熟悉不过了&#xff0c;无论是使用IDE…

基于cubemx的STM32的freertos的串口通信

1、任务描述 使用freertos系统实现电脑调试助手和正点原子开发板STM32F103ZET6的串口通信。 2、cubemx设置 3、程序代码 &#xff08;1&#xff09;添加usart1.c #include "usart1.h"#include "usart.h"/**********重定义函数**********/struct __FILE …

阵列信号处理2_阵列信号最优处理常用准则(CSDN_20240825)

目录 最小均方误差&#xff08;Minimum Square Error&#xff0c;MSE&#xff09;准则 最大信噪比&#xff08;Maximum Signal Noise Ratio&#xff0c;MSNR&#xff09;准则 极大似然&#xff08;Maximum Likehood, ML&#xff09;准则 最小方差无损响应&#xff08;Minim…

速通教程:如何使用Coze+剪映,捏一个爆款悟空视频

程哥最近做了一个和黑神话悟空有关的视频&#xff0c;没想到就火了&#xff0c;视频主打一个玉石风格&#xff0c;就是下面这个视频。 视频请移步飞书观看&#xff1a;黑神话悟空玉石版 制作过程不算很复杂&#xff0c;全程只需要用到Coze智能体和剪映这两个工具。 智能体用…