框架学习01-Spring

一、Spring框架概述

Spring是一个开源的轻量级Java开发框架,它的主要目的是为了简化企业级应用程序的开发。它提供了一系列的功能,包括控制反转(IOC)、注入(DI)、面向切面编程(AOP)、数据访问抽象、事务管理等诸多方面。

  1. 历史背景
    Spring的出现提供了一种更简单、更灵活的替代方案,使得Java开发者能够更高效地构建企业应用。
  2. 核心优势
    • 轻量级:与传统的企业级框架(如EJB)相比,Spring框架本身的代码库相对较小,对应用程序的资源占用较少。
    • 松耦合:通过依赖注入等机制,Spring可以有效地降低组件之间的耦合度
    • 可扩展性:Spring提供了丰富的扩展点。开发者可以很方便地集成第三方库,或者根据自己的需求对Spring进行定制。

二、Spring框架的主要模块

  1. 核心容器(Core Container)

    • Bean Factory:这是Spring框架最核心的部分,它负责管理对象的创建、配置和生命周期。Bean Factory就像是一个对象工厂,它根据配置信息来创建和管理各种Java对象(在Spring中称为Bean)。例如,在一个简单的Spring应用中,我们可以通过XML配置文件或者Java注解来告诉Bean Factory如何创建一个用户服务(UserService)对象。在这里插入图片描述

    • ApplicationContext:它是Bean Factory的扩展,提供了更多高级的功能,如国际化支持、事件发布和订阅等。它是一个完整的应用上下文环境,在实际开发中应用更为广泛。比如,在一个Web应用中,我们可以通过WebApplicationContext来获取整个Web应用相关的Bean和配置信息。

    • 在这里插入图片描述

  2. AOP(Aspect - Oriented Programming)模块

    • AOP主要用于处理横切关注点(Cross - Cutting Concerns)。例如,日志记录、事务管理等功能往往会横跨多个业务逻辑组件。在没有AOP的情况下,我们需要在每个业务方法中重复编写日志记录或者事务管理的代码。而通过Spring AOP,我们可以将这些横切关注点抽象成独立的切面(Aspect)。比如,我们可以定义一个日志切面,通过切点(Pointcut)来指定在哪些业务方法执行前后进行日志记录,从而避免了代码的重复。
  3. 数据访问与集成(Data Access/Integration)模块

    • JDBC抽象层:Spring对JDBC进行了抽象,提供了更简单、更方便的API来进行数据库访问。它隐藏了JDBC的一些复杂的细节,如数据库连接的获取、释放,SQL语句的执行等。例如,通过Spring的JdbcTemplate,我们可以用更少的代码来执行一个查询操作,并且可以方便地处理查询结果。
    • ORM(Object - Relational Mapping)支持:Spring支持多种ORM框架,如Hibernate、MyBatis等。它可以很好地集成这些ORM框架,使得开发者可以根据自己的喜好和项目的具体需求选择合适的ORM工具。例如,在使用Spring和Hibernate集成时,Spring可以帮助管理Hibernate的SessionFactory,并且可以通过依赖注入将Hibernate相关的服务注入到业务逻辑组件中。
  4. Web模块

    • Spring MVC:这是Spring用于构建Web应用的MVC(Model - View - Controller)框架。它将Web应用分为模型(Model)、视图(View)和控制器(Controller)三个部分。例如,在一个简单的用户注册功能中,Controller负责接收用户提交的注册信息,Model用于处理业务逻辑(如验证用户信息、保存用户数据到数据库等),View则负责将处理后的结果展示给用户(如返回一个注册成功或失败的页面)。

三、依赖注入(Dependency Injection)在Spring中的实现

  1. 构造函数注入(Constructor Injection)
    • 这是一种通过构造函数来注入依赖的方式(手动注入)。例如,假设我们有一个UserService类,它依赖于一个UserRepository类来进行数据访问。我们可以通过在UserService的构造函数中接收UserRepository的实例来实现注入。
    • 代码示例:
    public class UserService {private final UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}// 其他业务方法
    }
    
    • 在Spring配置文件(可以是XML或者通过Java配置类)中,我们可以配置Spring来创建UserService和UserRepository的实例,并将UserRepository的实例注入到UserService的构造函数中。
  2. Setter注入(Setter Injection)
    • 通过Set方法来注入依赖(手动注入)。例如,我们可以在UserService类中定义一个setUserRepository方法。
    • 代码示例:
    public class UserService {private UserRepository userRepository;public void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}// 其他业务方法
    }
    
    • 在Spring配置中,我们可以通过调用这个setter方法来注入UserRepository的实例。
  3. 注解注入(Annotation Injection)
    • Spring支持多种注解来实现注入(自动注入),如@Autowired@Resource。例如,使用@Autowired注解,我们可以在UserService类中直接在UserRepository的成员变量上添加注解。
    • 代码示例:
    public class UserService {@Autowiredprivate UserRepository userRepository;// 其他业务方法
    }
    
    • Spring会自动扫描带有@Autowired注解的成员变量,并将合适的实例注入进去。

四、Spring框架的应用场景

  1. 企业级应用开发
    • 在大型企业级应用中,Spring可以用于构建多层架构的应用。例如,在一个典型的三层架构(dao层、service层、controller层)的应用中,Spring可以很好地管理各个层次之间的依赖关系,并且通过AOP来处理横切关注点,如日志记录、安全验证等。
  2. Web应用开发
    • Spring MVC是一个非常流行的Web框架,用于开发高效、灵活的Web应用。它可以与各种视图技术(如Thymeleaf、JSP等)结合使用,并且可以方便地进行RESTful API的开发。例如,我们可以使用Spring MVC来开发一个电商网站的后端API,用于处理商品信息的查询、添加、修改等操作。
  3. 微服务架构
    • 在微服务架构中,Spring Boot(基于Spring框架构建的快速开发框架)被广泛应用。Spring Boot简化了微服务的开发和部署过程,通过自动配置等功能,使得开发者可以快速地创建和启动微服务。例如,一个简单的用户认证微服务可以使用Spring Boot来快速搭建,并且可以通过Spring Cloud等相关技术来实现微服务之间的通信和协调。

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

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

相关文章

十年码农的编程心得分享

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【网络安全】|nessus使用

1、扫描结果分析: Sev:漏洞的严重性级别 CVSS:量化漏洞严重性的标准,通过计算得出一个分数,分数越高表示漏洞越严重。 VPR:基于风险的评分系统,帮助组织优先处理风险最高的漏洞。 EPSS&#xf…

为什么越来越多人开始用云电脑?网友道出了真相

近期,3A游戏大作《黑神话:悟空》的横空出世,成功激起大多数人对国产游戏的兴趣。然而,没有一台高配置的电脑,就无法在《黑神话:悟空》中获得震撼的游戏体验。想要配齐处理器、显卡、内存等硬件,…

W6100-EVB-Pico2评估板介绍

目录 1 简介 2 硬件资源 2.1 硬件规格 2.2 引脚定义 2.3 工作条件 3 参考资料 3.1 RP2350 数据表 3.2 W6100 数据表 3.3 原理图 原理图 & 物料清单 & Gerber 文件 3.3 尺寸图(尺寸:mm) 3.4 参考例程 认证 CE FCC 4 硬…

VUE2升级成VUE3的优化与区别

大家好,我是小编阿贤。欢迎各位大神关注《全栈技术圈》,让技术更加简单易懂。 1. vue2和vue3实例区别 1.1 创建一个vue2实例 在vue2里面的Vue是一个构造函数,通过该构造函数创建一个Vue实例,data选项可以是对象,也可以…

ProLightsfx新的出发–从CSDN到WordPress

原文链接:ProLightsfx新的出发--从CSDN到WordPress_ProLightsfx的技术分享 (https://www.prolightsfxjh.com/article/article-new-start/) 大概有差不多2年时间没有在csdn发布文章了。可能主要是最近几年工作有些疲惫、精神有些懈怠&#xff…

「Mac畅玩鸿蒙与硬件19」鸿蒙UI组件篇9 - 自定义动画实现

自定义动画让开发者可以设计更加个性化和复杂的动画效果,适合表现独特的界面元素。鸿蒙提供了丰富的工具,支持通过自定义路径和时间控制来创建复杂的动画运动。本篇将带你学习如何通过自定义动画实现更多样化的效果。 关键词 自定义动画动画路径贝塞尔曲…

GPIO子系统中Controller驱动源码分析

往期内容 本专栏往期内容: Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析inctrl子系统中Pincontroller构造过程驱动分析:imx_pinctrl_soc_info结构体Pinctrl子系统中c…

【Linux系统编程】第四十二弹---多线程编程全攻略:涵盖线程创建、异常处理、用途、进程对比及线程控制

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、线程创建 2、线程异常 3、线程用途 4、进程 VS 线程 5、线程控制 5.1、创建和等待线程 1、线程创建 线程能看到进程的大…

Qt入门基础分享

文章目录 学习 Qt 语言之前的基本知识1. 编程基础语法:面向对象编程(OOP):基本数据结构:了解数组、链表、栈、队列、树(如二叉树、平衡树)、图(如邻接矩阵、邻接表)等。算法:熟悉常见的排序算法(如快速排序、归并排序、冒泡排序)和查找算法(如线性查找、二分查找)…

超萌!HTMLCSS:超萌卡通熊猫头

效果演示 创建了一个卡通风格的熊猫头 HTML <div class"box"><div class"head"><div class"head-copy"></div><div class"ears-left"></div><div class"ears-right"></di…

使用 AMD GPU 的 ChatGLM-6B 双语语言模型

Using the ChatGLM-6B bilingual language model with AMD GPUs — ROCm Blogs 2024 年 4 月 4 日&#xff0c;作者&#xff1a; Phillip Dang. ChatGLM-6B 是一个开源的中英双语语言模型&#xff0c;拥有 62 亿参数。它基于通用语言模型 (GLM) 架构&#xff0c;针对中文对话进…

计算并联电阻的阻值

计算并联电阻的阻值 C语言代码C代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 对于阻值为r1和r2的电阻&#xff0c;其并联电阻阻值公式计算如下&#xff1a; R1/(1/r11/r2) 输入 两个电阻阻抗大小&#xff0c;浮…

创建线程时传递参数给线程

在C中&#xff0c;可以使用 std::thread 来创建和管理线程&#xff0c;同时可以通过几种方式将参数传递给线程函数。这些方法包括使用值传递、引用传递和指针传递。下面将对这些方法进行详细讲解并给出相应的代码示例。 1. 值传递参数 当你创建线程并希望传递参数时&#xff…

AAA 数据库事务隔离级别及死锁

目录 一、事务的四大特性&#xff08;ACID&#xff09; 1. 原子性(atomicity)&#xff1a; 2. 一致性(consistency)&#xff1a; 3. 隔离性(isolation)&#xff1a; 4. 持久性(durability)&#xff1a; 二、死锁的产生及解决方法 三、事务的四种隔离级别 0 .封锁协议 …

数字后端零基础入门系列 | Innovus零基础LAB学习Day9

Module 16 Wire Editing 这个章节的学习目标是学习如何在innovus中手工画线&#xff0c;切断一根线&#xff0c;换孔&#xff0c;更改一条net shape的layer和width等等。这个技能是每个数字IC后端工程师必须具备的。因为项目后期都需要这些技能来修复DRC和做一些手工custom走线…

前后端交互通用排序策略

目录 排序场景 排序实现思路 1. 静态代码排序实现 2.数据库驱动排序实现 3. 基于Java反射的动态排序实现 通用排序工具 SortListUtil 结语 排序场景 在面向前端数据展示的应用场景中&#xff0c;我们旨在实现一个更加灵活的排序机制&#xff0c;该机制能够支持对从后端传递…

前端入门一之CSS知识详解

前言 CSS是前端三件套之一&#xff0c;在MarkDown中也完美兼容这些语法&#xff1b;这篇文章是本人大一学习前端的笔记&#xff1b;欢迎点赞 收藏 关注&#xff0c;本人将会持续更新。 文章目录 Emmet语法&#xff1a;CSS基本语法&#xff1a;css语法结构只有3种&#xff1a…

leetcode | 88. 合并两个有序数组

题目描述 88. 合并两个有序数组 分析 题目不允许更改nums1的长度&#xff0c;要求原地更改。 题目其实不难&#xff0c;如果记住可以从后往前合并的解法&#xff0c;但是正向遍历的问题是什么呢&#xff1f; ——元素覆盖。那为什么负向遍历就不会有这个问题呢&#xff1f;…

跳蚤市场之商品发布功能

一 商品类别和小类的联动 以下是一个示例代码&#xff0c;展示了如何实现商品类别中大类和小类的联动。 商品大类选择框、小类选择框 的设计 html部分 <form id"category-form"><label for"major-category">大类&#xff1a;</label&g…