Spring学习笔记:Day1

学习策略:

理论与实践相结合:每学完一个知识点,尝试进行小的练习或小的项目实践。

持续反馈:在学习过程中,参与社区、论坛或与同事进行讨论,及时解决遇到的问题。

实际项目驱动:在学习后期,尝试使用Spring完成一个简单的实际项目。


学习时间规划:

总计:30天


第1-3天:Spring核心容器

了解Spring的历史与背景。

掌握IoC(控制反转)与DI(依赖注入)的概念及实践。

学习Spring Bean的生命周期。

练习:创建一个简单的Spring项目,实现IoC与DI。

第4-6天:Spring AOP

掌握AOP的基本概念和作用。

学习Spring中的AOP实现方式。

练习:在Spring项目中实现一个简单的AOP功能,如日志记录。

第7-9天:Spring数据访问

学习Spring JDBC模板的使用。

了解Spring与Hibernate、MyBatis等框架的集成方式。

练习:使用Spring JDBC模板实现简单的数据库操作。

第10-12天:Spring MVC

掌握Spring MVC的工作流程。

学习如何使用@Controller、@RequestMapping等注解。

练习:创建一个简单的Web应用,实现CRUD操作。

第13-15天:Spring Security

了解基本的安全概念和Spring Security的作用。

学习如何配置Spring Security进行用户认证和授权。

练习:为之前的Web应用添加基本的认证和授权功能。

第16-18天:Spring Boot入门

了解Spring Boot的核心思想和特点。

学习如何使用Spring Boot快速创建应用。

练习:使用Spring Boot创建一个RESTful Web服务。

第19-21天:集成测试与SpringBootTest

了解集成测试的概念和重要性。

学习如何在Spring Boot中进行集成测试。

练习:为之前的RESTful Web服务编写集成测试。

第22-24天:实际项目准备

确定一个简单的实际项目需求,如一个简单的博客系统或TODO List应用。

设计数据库结构和API接口。

第25-27天:实际项目开发

使用Spring Boot和之前学到的知识完成项目的后端开发。

实现基本的CRUD操作、用户认证和其他业务逻辑。

第28-30天:总结与部署

对项目进行总结,优化代码结构。

学习如何将Spring Boot应用部署到服务器或云平台。

完成部署并测试线上环境。


今日计划:

Spring学习计划——第一天
学习主题:Spring核心容器

学习目标:

了解Spring的历史与背景。
掌握IoC(控制反转)的基本概念。
掌握DI(依赖注入)的基本概念。
学习Spring Bean的生命周期。
学习内容:

一、Spring简介与历史:阅读Spring官方文档或相关书籍,了解Spring的起源、发展和核心思想。

1. Spring起源:
Spring是一个开源的Java应用程序框架,于2004年发布了第一个正式版本。Spring框架以IoC(控制反转)和AOP(面向切面编程)为内核,提供了展现层Spring MVC和业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库。

2. 发展:

Spring的发展历程经历了多个版本的迭代和更新,不断添加新的特性和功能,如注解配置、Java配置、RESTful Web服务支持、安全性改进等。

3. 核心思想:

轻量级:Spring在大小和透明度方面绝对是轻量级的。基础的Spring框架可以用任何一个Java项目,并且不引入不必要的复杂性。
控制反转(IoC):Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
面向切面编程(AOP):Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识不到)其它的系统级关注点,如日志或事务支持。
容器:Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
框架:Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。


二、IoC(控制反转)

1.了解什么是控制反转,它与传统的程序设计有何不同。

控制反转(IoC,Inversion of Control)是一种设计原则,它将传统程序设计中由程序代码直接操控的对象调用权转交给外部容器来管理。这样做的好处是降低了代码之间的耦合度,提高了系统的可维护性和可扩展性。

2.掌握IoC容器的基本概念和工作原理。

IoC容器的基本概念是具有依赖注入功能的容器,它负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。IoC容器的工作原理是通过读取配置文件中的配置元数据,用元数据对应用中的各个对象进行实例化及装配。这些配置元数据可以是xml格式,也可以是基于注解的,或者是基于Java文件的等。Spring与配置文件完全解耦,可以使用其他任何可能的方式进行配置元数据。在Spring中,BeanFactory是IoC容器的实际代表者。

IoC容器的目的是使得应用程序无需直接在代码中new相关的对象,而是由IoC容器进行组装。这样可以降低代码之间的耦合度,提高代码的可维护性和可扩展性。

总的来说,IoC容器负责应用程序中对象的创建、配置和管理,以及对象之间的依赖关系的建立和维护。通过IoC容器,开发人员可以更加专注于业务逻辑的开发,而无需过多关注底层的对象创建和依赖管理。

3.了解依赖注入的作用和意义。

依赖注入(Dependency Injection,DI)是一种设计模式,它的主要作用和意义在于解耦组件之间的依赖关系,从而提高应用程序的可测试性和可扩展性。

在依赖注入中,对象不再负责创建或管理它所依赖的对象,而是通过一个外部容器(例如Spring容器)来管理对象之间的依赖关系。容器通过自动装配或配置,将对象所需要的依赖注入到对象中。这种方式使得对象之间的依赖关系变得松散,对象的复用性和可测试性也得到了提高。

依赖注入的意义主要体现在以下几个方面:

  1. 提高代码的可维护性:通过依赖注入,我们可以将组件之间的依赖关系外部化,使得组件之间的耦合度降低。这样,当我们需要修改或扩展某个组件时,只需要修改相关的依赖配置,而无需修改组件内部的代码。这大大降低了代码维护的难度和成本。
  2. 提高代码的可测试性:依赖注入使得我们可以轻松地替换组件的依赖项,从而方便进行单元测试。我们可以为组件注入模拟对象(Mock Object),以模拟外部依赖的行为,从而对组件进行隔离测试。
  3. 提高代码的可扩展性:通过依赖注入,我们可以将组件之间的依赖关系解耦,使得组件更加独立和可复用。这样,当我们需要添加新的功能或组件时,只需要添加新的依赖配置,而无需修改现有的组件代码。
  4. 更好的代码组织:通过依赖注入,我们可以将应用程序的不同部分(如业务逻辑、数据访问、用户界面等)划分为独立的组件,每个组件负责特定的功能。这使得代码的组织更加清晰和模块化,提高了代码的可读性和可维护性。

总之,依赖注入是一种重要的设计模式,它可以帮助我们降低代码之间的耦合度,提高代码的可维护性、可测试性和可扩展性。

4.学习Spring中的DI实现方式:构造函数注入、Setter方法注入和注解注入。

在Spring框架中,依赖注入(Dependency Injection,DI)主要有三种实现方式:构造函数注入、Setter方法注入和注解注入。

  1. 构造函数注入:

构造函数注入是通过组件的构造函数来实现依赖注入的。在Spring配置文件中,通过配置构造函数的参数来注入依赖。这种方式的好处是可以在对象创建时就完成所有的依赖注入,使得对象在创建后就已经是完整可用的。但是,如果构造函数有多个参数,可能会导致配置过于复杂

  1. Setter方法注入:

Setter方法注入是通过组件的Setter方法来实现依赖注入的。在Spring配置文件中,通过配置Setter方法的参数来注入依赖。这种方式的好处是可以更加灵活地配置依赖,因为Setter方法可以在对象创建后的任何时间被调用。但是,这种方式可能会导致对象在创建后并不是完整可用的,因为依赖可能是在对象创建后的一段时间内被注入的。

  1. 注解注入:

注解注入是通过注解来实现依赖注入的。在Spring中,可以使用@Autowired、@Resource等注解来自动装配依赖。这种方式的好处是可以简化配置,提高开发效率。Spring会自动扫描带有注解的类,并根据注解的类型和属性来自动装配依赖。这种方式需要较少的配置,但是需要对注解有一定的了解。

三种注入方式的选择应根据实际情况进行考虑。如果依赖关系比较简单,推荐使用注解注入;如果需要更加灵活的配置,推荐使用Setter方法注入;如果需要保证对象在创建后就已经是完整可用的,推荐使用构造函数注入。同时,也可以根据不同的组件类型和使用场景来选择不同的注入方式。


三、Spring Bean的生命周期

1.学习Spring Bean的创建、初始化、使用和销毁的过程。

Spring Bean的生命周期包括创建、初始化、使用和销毁四个阶段。以下是这四个阶段的详细描述:

        1.创建阶段:

在创建阶段,Spring容器首先会解析Bean的配置文件,包括XML配置或者注解配置。然后,容器会根据配置信息,通过反射机制创建Bean的实例。如果Bean是单例的,Spring容器在启动时就会立即创建Bean实例并存储在单例池中,以后每次请求都从单例池中获取该实例。如果Bean是原型的,Spring容器在每次请求时都会创建一个新的实例。

        2.初始化阶段:

在初始化阶段,Spring容器会调用Bean的初始化方法,完成Bean属性的设置和依赖注入。具体步骤包括:

(1) 调用Bean的Setter方法,设置Bean的属性值。这些属性值可能是基本的数据类型、其他Bean的引用,或者是通过表达式计算得出的结果。

(2) 如果Bean实现了BeanNameAware接口,Spring容器会调用setBeanName()方法,将当前Bean的名称注入到Bean中。

(3) 如果Bean实现了BeanFactoryAware接口,Spring容器会调用setBeanFactory()方法,将当前BeanFactory注入到Bean中。

(4) 如果Bean实现了InitializingBean接口,Spring容器会调用afterPropertiesSet()方法,进行一些初始化的操作。

(5) 如果在配置文件中定义了init-method属性,Spring容器会调用该属性的值指定的方法,进行一些自定义的初始化操作。

        3.使用阶段:

在使用阶段,开发人员可以通过Spring容器来获取并使用Bean。具体的使用方式包括:通过getBean()方法直接获取Bean;通过@Autowired注解自动装配Bean;通过Java配置类来获取Bean等。在使用阶段,开发人员可以调用Bean的业务方法来完成具体的业务逻辑。

        4.销毁阶段:

在销毁阶段,Spring容器会调用Bean的销毁方法,释放Bean占用的资源。具体步骤包括:

(1) 如果Bean实现了DisposableBean接口,Spring容器会调用destroy()方法,进行一些销毁的操作。

(2) 如果在配置文件中定义了destroy-method属性,Spring容器会调用该属性的值指定的方法,进行一些自定义的销毁操作。

总的来说,Spring Bean的生命周期管理是通过Spring容器的支持来实现的。Spring容器负责创建、初始化、使用和销毁Bean实例,并提供了丰富的扩展点供开发人员自定义生命周期的行为。这种管理方式可以大大降低开发人员管理对象生命周期的复杂度,提高开发效率和应用的可维护性。


2.了解如何通过Bean的后处理器来扩展Bean的生命周期。

在Spring框架中,可以通过Bean的后处理器(BeanPostProcessor)来扩展Bean的生命周期。BeanPostProcessor接口定义了两个方法:postProcessBeforeInitialization和postProcessAfterInitialization,这两个方法分别在Bean的初始化方法(如afterPropertiesSet或自定义的init-method)之前和之后被调用。

以下是如何使用BeanPostProcessor来扩展Bean的生命周期的步骤:

  1. 创建一个类实现BeanPostProcessor接口:

首先,需要创建一个类实现BeanPostProcessor接口,并实现postProcessBeforeInitialization和postProcessAfterInitialization方法。这两个方法分别在Bean的初始化之前和之后被调用,因此可以在这里添加一些自定义的逻辑来扩展Bean的生命周期。

  1. 在postProcessBeforeInitialization方法中实现初始化前的逻辑:

在postProcessBeforeInitialization方法中,可以添加一些在Bean初始化之前需要执行的逻辑。例如,可以对Bean的属性进行一些预处理,或者记录一些日志信息等。这个方法返回一个Object对象,通常情况下应该返回传入的bean参数,但如果需要替换原来的Bean实例,可以返回一个新的实例。

  1. 在postProcessAfterInitialization方法中实现初始化后的逻辑:

在postProcessAfterInitialization方法中,可以添加一些在Bean初始化之后需要执行的逻辑。例如,可以对Bean进行一些后处理操作,或者调用一些额外的初始化方法等。这个方法同样返回一个Object对象,通常情况下应该返回传入的bean参数。

  1. 注册BeanPostProcessor:

最后,需要将自定义的BeanPostProcessor注册到Spring容器中。可以通过在Spring配置文件中定义一个bean来实现这一点,或者通过Java配置类来注册。注册后,Spring容器会自动识别并调用BeanPostProcessor的方法。

通过以上步骤,就可以使用Bean的后处理器来扩展Spring Bean的生命周期了。这种方式可以使得开发人员更加方便地管理和控制Bean的生命周期行为,提高应用的可维护性和可扩展性。


练习与实践:

1.创建一个简单的Spring项目:使用Maven或Gradle创建一个新的Spring项目,配置基本的Spring环境。
2.实现IoC与DI:定义一个简单的Java类(如UserService),并标注为Spring的Bean。
在另一个类(如Controller)中,通过自动装配或手动配置的方式注入UserService的实例。

3.验证Bean的生命周期:在UserService中添加初始化方法和销毁方法,并打印相关日志。
配置Spring容器,观察Bean的生命周期回调的执行。

PS:只是把maven给配置好了,根本没实现。

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

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

相关文章

PHP字符串面试题

PHP字符串面试题 1. 创建一个字符串变量&#xff0c;并打印输出字符串的内容。 <?php $string "Hello, World!"; echo $string; ?>2. 如何获取字符串的长度&#xff1f; <?php $string "Hello, World!"; $length strlen($string); echo …

P1530 [USACO2.4] 分数化小数 Fractions to Decimals

题目描述 写一个程序,输入一个形如 DN​ 的分数,输出它的小数形式。如果小数有循环节的话,把循环节放在一对圆括号中。 例如,13=0.33333333…31​=0.33333333… 写成 0.(3)0.(3),41333=0.123123123…33341​=0.123123123… 写成 0.(123)0.(123),整数 x 写成 x.0。 输入…

Vue3父子组件通信

一、父组件给子组件传值 子组件 ShipHomePortDialog 1.定义变量名称 <script lang"ts" setup> const props defineProps([title]) </script> 2.在template中使用变量 <h4>{{ title }}</h4> 3.在Script代码使用 var t props.title…

鸿蒙开发笔记

最近比较火&#xff0c;本身也是做前端的&#xff0c;就抽空学习了下。对前端很友好 原视频地址&#xff1a;黑马b站鸿蒙OS视频 下载安装跟着视频或者文档就可以了。如果你电脑上安装的有node&#xff0c;但是开发工具显示你没安装&#xff0c;不用动咱们的node&#xff0c;直…

15个Pandas代码片段助力数据分析

大家好&#xff0c;Python的Pandas库是数据分析的基本工具&#xff0c;提供了强大的数据操作和分析功能。本文将探讨15个高级Pandas代码片段&#xff0c;这些代码片段将帮助简化数据分析任务&#xff0c;并从数据集中提取有价值的见解。 1. 过滤数据 import pandas as pd# 创…

红队攻防实战之Access注入

若盛世将倾&#xff0c;深渊在侧&#xff0c;我辈当万死以赴 访问漏洞url: 1.Access联合查询 判断是否有注入 and 11正常&#xff0c;and 12出错 判断字段数 order by 7正常 order by 8出错 爆破出表名并判断回显点为2&#xff0c;5 查看字段内容&#xff0c;将字段名填入回…

12月1号作业

实现运算符重载 #include <iostream>using namespace std; class Person{friend const Person operator-(const Person &L,const Person &R);friend bool operator<(const Person &L,const Person &R);friend Person operator-(Person &L,const …

WakaTime一个用于跟踪和分析编程时间的工具

WakaTime是一个用于跟踪和分析编程时间的工具&#xff0c;它可以集成到各种代码编辑器和集成开发环境中&#xff0c;例如Visual Studio Code、Sublime Text、PyCharm等。它可以帮助开发人员了解他们花费在不同项目和编程语言上的时间&#xff0c;以及他们的编码习惯和生产力。 …

C语言实战演练之贪吃蛇游戏

贪吃蛇游戏的C语言实现主要包括以下几个步骤&#xff1a; 1. 初始化游戏界面&#xff1a; 设置窗口大小&#xff0c;背景颜色等。 2. 创建蛇的数据结构&#xff1a; 包括蛇头的位置、蛇身的长度、蛇身的坐标等。 3. 创建食物的数据结构&#xff1a; 包括食物的位置等。 4. 控制…

【面试HOT200】二叉树——广度优先搜索篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot200】进行的&#xff0c;每个知识点的修正和深入主要参…

Leetcode 2952. Minimum Number of Coins to be Added

Leetcode 2952. Minimum Number of Coins to be Added 1. 解题思路2. 代码实现 题目链接&#xff1a;2952. Minimum Number of Coins to be Added 1. 解题思路 这一题思路上就是一个贪婪算法的思路&#xff0c;偏数学性多一点。 首先&#xff0c;我们将面值有序排列&#x…

SpringSecurity工作原理

实现功能就是继承这几个对应功能的类。 大概工作流程 Spring Security 的过滤器&#xff08;Filters&#xff09;和拦截器&#xff08;Interceptors&#xff09;是 Spring Security 框架中用于保护 web 应用安全的重要组件。它们在处理 HTTP 请求时扮演不同的角色&#xff0c…

Go 模块系统最小版本选择法 MVS 详解

目录 Golang 模块系统简介 包版本管理 最小版本选择&#xff08;MVS&#xff09;原理 MVS 的优点 MVS的缺点 实际使用MVS 小结 参考资料 Golang 模块系统简介 Golang 模块系统是 Go 1.11 版本引入的一个新特性&#xff0c;主要目的是解决 Go 项目中的依赖管理问题。在模…

Python IDLE: 一个简单易用的Python集成开发环境

简介 Python是一种高级编程语言&#xff0c;被广泛用于科学计算、数据分析、Web开发等领域。要编写和运行Python代码&#xff0c;您需要一个集成开发环境&#xff08;Integrated Development Environment&#xff0c;简称IDE&#xff09;。Python IDLE&#xff08;Integrated …

数学杂谈:残次品的无砝码天平定位问题

数学杂谈&#xff1a;残次品的无砝码天平定位问题 1. 问题描述2. 问题解答3. 问题拓展 1. 引理12. 引理23. 引理34. 推论15. 推论2 1. 问题描述 给出问题如下&#xff1a; 12个乒乓球&#xff0c;有一个次品&#xff0c;不知轻重&#xff0c;用一台无砝码天平称三次&#xf…

uni-app一些目录结构、方法、生命周期、打包、微信小程序登录与支付

1、关于uniapp的目录结构 跟普通vue项目目录结构差不多&#xff0c;多了几个核心文件&#xff0c;manifest.json是配置应用名称、appid、logo、版本等打包信息用的&#xff0c;pages.json的作用是配置页面路径、页面窗口样式、tabBar、navigationBar等页面类信息 2、页面适配方…

c# 浮点余数

double x; double y; double zx%y;对于以上代码 z&#xff08;如果不为零&#xff09;的符号与 x 的符号相同。 z 的绝对值是 |x| - n * |y| 得出的值&#xff0c;其中 n 是小于或等于 |x| / |y| 的最大可能整数&#xff0c;|x| 和 |y| 分别是 x 和 y 的绝对值。 代码示例&am…

【Node.js】笔记梳理 8 - API和JWT

写在最前&#xff1a;跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识&#xff0c;需要格外注重实战和官方技术文档&#xff0c;文档建议作为手册使用 系列文章 【Node.js】笔记整理 1 - 基础知识【Node.js】笔记整理 2 - 常用模块【Node.js】笔记整理 3 - n…

什么是npm?能干什么?

npm是Node.js的包管理器。 npm的主要功能是管理node包&#xff0c;包括&#xff1a;安装、卸载、更新、查看、搜索、发布等。 npm是随同Node.js一起安装的包管理工具&#xff0c;能解决Node.js代码部署上的很多问题&#xff0c;常见的使用场景有以下几种&#xff1a; 允许用…