Spring6--->Spring6介绍

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 最新最全的Spring6入门教程,学习链接:B站 动力节点_老杜的视频!!

一、Spring启示录
阅读以下代码:
可以看出,UserDaoImplForMySQL中主要是连接MySQL数据库进行操作。如果更换到Oracle数据库上,则需要再提供一个UserDaoImplForOracle,如下:
很明显,以上的操作正在进行功能的扩展,添加了一个新的类UserDaoImplForOracle来应付数据库的变化,这里的变化会引起连锁反应吗?当然会,如果想要切换到Oracle数据库上,UserServiceImpl类代码就需要修改,如下:
1.1 OCP开闭原则
这样一来就违背了开闭原则OCP。开闭原则是这样说的:在软件开发过程中应当对扩展开放,对修改关闭。也就是说,如果在进行功能扩展的时候,添加额外的类是没问题的,但因为功能扩展而修改之前运行正常的程序,这是忌讳的,不被允许的。因为一旦修改之前运行正常的程序,就会导致项目整体要进行全方位的重新测试。这是相当麻烦的过程。导致以上问题的主要原因是:代码和代码之间的耦合度太高。如下图所示:

USERCONTROLLER

依赖

依赖

USERSERVICELMPL

依赖

USERDAOLMPFORMYSQL


可以很明显的看出,上层是依赖下层的。UserController依赖UserServiceImpl,而UserServiceImpl依赖UserDaoImplForMySQL,这样就会导致下面只要改动,上面必然会受牵连(跟着也会改),所谓牵一发而动全身。这样也就同时违背了另一个开发原则:依赖倒置原则。
1.2 依赖倒置原则DIP
依赖倒置原则(Dependence Inversion Principle),简称DIP,主要倡导面向抽象编程,面向接口编程,不要面向具体编程,让上层不再依赖下层,下面改动了,上面的代码不会受到牵连。这样可以大大降低程序的耦合度,耦合度低了,扩展力就强了,同时代码复用性也会增强。(软件七大开发原则都是在为解耦合服务)
你可能会说,上面的代码已经面向接口编程了呀:

2 USAGES

IMPLEMENTS

USERSERVICE

PUBLIC CLASS USERSERVICEIMPL

//PRIVATE USERDAO USERDAO - NEW USERDAOIMPLFORMYSQL();

接口

1 USAGE

USERDAOIMPLFORORACLE();

USERDAO USERDAO

PRIVATE

NEW

I USAGE

LOGIN(STRING USERNAME, STRING PASSWORD)

PUBLIC BOOLEAN

USER USER

LUSERDAO.SELECTBYUSERNAMEANDPASSWORD(USERNAME, PASSWORD)

IF

(USER !: NULL)

也是调的接口中的方法

RETURN TRUE;

RETURN FALSE;


确实已经面向接口编程了,但对象的创建是:new UserDaoImplForOracle()显然并没有完全面向接口编程,还是使用到了具体的接口实现类。什么叫做完全面向接口编程?什么叫做完全符合依赖倒置原则呢?请看以下代码:

PUBLIC CLASS USERSERVICEIMPL IMPLEMENTS USERSERVICE {

/PRIVATE USERDAO USERDAO - NEW USERDAOIMPLFORMYSQL();

//PRIVATE USERDAO USERDAO ; NE

; NEW USERDAOIMPLFORORACLE();

1 USAGE

PRIVATE USERDAO USERDAO;

1 USAGE

IN LOGIN(STRING USERNAME, STRING PASSWORD) {

PUBLIC BOOLEAN L

USER USER - USERDAO.SELECTBYUSERNAMEANDPASSWORD(USERNAME, PASSWORD);

(USER !: NULL) {

RETURN TRUE;

RETURN FALSE;


如果代码是这样编写的,才算是完全面向接口编程,才符合依赖倒置原则。那你可能会问,这样userDao是null,在执行的时候就会出现空指针异常呀。你说的有道理,确实是这样的,所以我们要解决这个问题。解决空指针异常的问题,其实就是解决两个核心的问题:
第一个问题:谁来负责对象的创建。【也就是说谁来:new UserDaoImplForOracle()/new UserDaoImplForMySQL()】
第二个问题:谁来负责把创建的对象赋到这个属性上。【也就是说谁来把上面创建的对象赋给userDao属性】
如果我们把以上两个核心问题解决了,就可以做到既符合OCP开闭原则,又符合依赖倒置原则。
很荣幸的通知你:Spring框架可以做到。
在Spring框架中,它可以帮助我们new对象,并且它还可以将new出来的对象赋到属性上。换句话说,Spring框架可以帮助我们创建对象,并且可以帮助我们维护对象和对象之间的关系。比如:

USERDAOLMPLFORMYSQL

和它产生关系?

SPRING说了算

USERSERVICELMPL

还是和它产生关系?

USERDAOLMPLFORACLE


Spring可以new出来UserDaoImplForMySQL对象,也可以new出来UserDaoImplForOracle对象,并且还可以让new出来的dao对象和service对象产生关系(产生关系其实本质上就是给属性赋值)。
很显然,这种方式是将对象的创建权/管理权交出去了,不再使用硬编码的方式了。同时也把对象关系的管理权交出去了,也不再使用硬编码的方式了。像这种把对象的创建权交出去,把对象关系的管理权交出去,被称为控制反转。
1.3 控制反转IoC
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计思想,可以用来降低代码之间的耦合度,符合依赖倒置原则。
控制反转的核心是:将对象的创建权交出去,将对象和对象之间关系的管理权交出去,由第三方容器来负责创建与维护。
控制反转常见的实现方式:依赖注入(Dependency Injection,简称DI)
通常,依赖注入的实现由包括两种方式:
set方法注入
构造方法注入
而Spring框架就是一个实现了IoC思想的框架。
IoC可以认为是一种全新的设计模式,但是理论和时间成熟相对较晚,并没有包含在GoF中。(GoF指的是23种设计模式)

二、Spring概述
2.1 Spring简介

SPRING


来自百度百科
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
Spring最初的出现是为了解决EJB臃肿的设计,以及难以测试等问题。
Spring为简化开发而生,让程序员只需关注核心业务的实现,尽可能的不再关注非业务逻辑代码(事务控制,安全日志等)。
2.2 Spring8大模块
注意:Spring5版本之后是8个模块。在Spring5中新增了WebFlux模块。

SPRING WEBFLUX

SPRING WEB MVC

SPRING WEB

SPRING AOP

支持集成常见的WEB框架

SPRING提供的响应式

SPRING自己提供了

面向切面编程

STRUTS

WEB框架

一套MVC框架

WEBWORK...

SPRING ORM

SPRING

CONTEXT

SPRING DAO

国际化消息(118N)

支持集成常见的ORM框架

提供了单独的支持

事件传播

MYBATIS

JDBC操作的API

验证的支持

HIBERNATE....

企业服务

VELOCITY和FREEMARKER集成的支持

SPRING CORE

控制反转(LOC)


1Spring Core模块
这是Spring框架最基础的部分,它提供了依赖注入(DependencyInjection)特征来实现容器对Bean的管理。核心容器的主要组件是 BeanFactory,BeanFactory是工厂模式的一个实现,是任何Spring应用的核心。它使用IoC将应用配置和依赖从实际的应用代码中分离出来。
2Spring Context模块
如果说核心模块中的BeanFactory使Spring成为容器的话,那么上下文模块就是Spring成为框架的原因。
这个模块扩展了BeanFactory,增加了对国际化(I18N)消息、事件传播、验证的支持。另外提供了许多企业服务,例如电子邮件、JNDI访问、EJB集成、远程以及时序调度(scheduling)服务。也包括了对模版框架例如Velocity和FreeMarker集成的支持
3Spring AOP模块
Spring在它的AOP模块中提供了对面向切面编程的丰富支持,Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中,可以自定义拦截器、切点、日志等操作。
4Spring DAO模块
提供了一个JDBC的抽象层和异常层次结构,消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析,用于简化JDBC。
5Spring ORM模块
Spring提供了ORM模块。Spring并不试图实现它自己的ORM解决方案,而是为几种流行的ORM框架提供了集成方案,包括Hibernate、JDO和iBATIS SQL映射,这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
6Spring Web MVC模块
Spring为构建Web应用提供了一个功能全面的MVC框架。虽然Spring可以很容易地与其它MVC框架集成,例如Struts,但Spring的MVC框架使用IoC对控制逻辑和业务对象提供了完全的分离。
7Spring WebFlux模块
Spring Framework 中包含的原始 Web 框架 Spring Web MVC 是专门为 Servlet API 和 Servlet 容器构建的。反应式堆栈 Web 框架 Spring WebFlux 是在 5.0 版的后期添加的。它是完全非阻塞的,支持反应式流(Reactive Stream)背压,并在Netty,Undertow和Servlet 3.1+容器等服务器上运行。

SPRING MVC

SPRING WEBFLUX

IMPERATIVE LOGIC,

@CONTROLLER

FUNCTIONAL ENDPOINTS

SIMPLE TO WRITE

EVENT LOOP

AND DEBUG

REACTIVE CLIENTS

CONCURRENCY MODEL

JDBC,JPA,

TOMCAT,JETTY,

UNDERTOW

NETTY

BLOCKING DEPS


8Spring Web模块
Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文,提供了Spring和其它Web框架的集成,比如Struts、WebWork。还提供了一些面向服务支持,例如:实现文件上传的multipart请求。
2.3 Spring特点
1轻量
a从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。
bSpring是非侵入式的:Spring应用中的对象不依赖于Spring的特定类。
2控制反转
aSpring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
3面向切面
aSpring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
4容器
aSpring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
5框架
aSpring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。
2.4 本教程软件版本
IDEA工具:2022.1.4
JDK:Java17(Spring6要求JDK最低版本是Java17)
Maven:3.8.6
Spring:6.0.0-M2
JUnit:4.13.2

三、Spring的入门程序
3.1 Spring的下载
官网地址:https://spring.io/

SPRING.IO

SPRING

COMMUNITY

WHY SPRING

TRAINING

SUPPORT

PROJECTS

LEARN

OVERVIEW

SPRING BOOT

SPRING FRAMEWORK

SPRING MAK

SPRING CLOUD

TIV

SPRING CLOUD DATA FLOW

CLOU

SPRING DATA

SPRING INTEGRATION

SPRING BATCH

WHY SPRING

QUI

SPRING SECURITY

VIEW ALL PROJECTS

DEVELOPMENT TOOLS

SPRING TOOLS 4

SPRING CLOUD GATEWAY - COMMERCIAL UPDATES

122-22965

NEWS

SPRING INITIALIZR

WHAT SPRING CAN DO

REACTIVE

WEB APPS

MICROSERVICES

CLOUD


官网地址(中文):http://spring.p2hp.com/

不安全

SPRING.P2HP.COM

SPRING

训练

社区

项目

为什么选择SPRING

支持

学习

概述

SPRING BOOT

SPRING FRAMEWORK

SPRING使

SPRING CLOUD

SPRING CLOUD DATA FLOW

具备反应

SPRING DATA

SPRING INTEGRATION

SPRING BATCH

为什么使用SPRING

SPRING SECURITY

查看所有项目

DEVELOPMENT TOOLS

SPRING TOOLS 4

122-22965

SPRING云网关.商业更新

NEWS

SPRING INITIALIZR

SPRING能做什么

反应性

WEB应用

微服务


打开Spring官网后,可以看到Spring Framework,以及通过Spring Framework衍生的其它框架:

SPRING?

WHY SPRING

PRO

LEARN

SPRING FRAMEWORK

SPRING BOOT

SPRING FRAMEWORK

SPRING DATA

SUPPORT

LEARN

OVERVIEW

SPRING CLOUD

SPRING CLOUD DATA FLOW 这是SPRING框架,其他的框架都是基于SPRING框架扩展的.

THE SPRING FRAMEWORK PROVIDES A COMPREHEN

SPRING SECURITY

BASED ENTERPRISE APPLICATIONS - ON ANY KIND OF

SPRING FOR GRAPHQL

A KEY ELEMENT OF SPRING IS INFRASTRUCTURAL SUPPRE

SPRING SESSION

"PLUMBING" OF ENTERPRISE APPLICATIONS SO THAT

UNNECESSARY TIES TO SPECIFIC DEPLOYMENT ENVIR

SPRING INTEGRATION

SPRING HATEOAS

SUPPORT POLICY AND MIGRATION

SPRING REST DOCS

FOR INFORMATION ABOUT MINIMUM REQUIREMENT

SPRING BATCH

POLICIES, PLEASE CHECK OUT THE OFFICIAL SPRING F

SPRING AMQP

FEATURES

SPRING CREDHUB

CORE TECHNOLOGIES: DEPENDENCY INJECTION

SPRING FLO

CONVERSION, SPEL, AOP.

SPRING FOR APACHE KAFKA

TESTING: MOCK OBJECTS, TESTCONTEXT FRAM

SPRING LDAP

DATA ACCESS: TRANSACTIONS, DAO SUPPORT,

SPRING SHELL

SPRING MVC AND SPRING WEBFLUX WEB FRA

SPRING STATEMACHINE

SPRING VAULT

INTEGRATION: REMOTING, JMS, JCA, EMA

SPRING WEB FLOW

LANGUAGES: KOTLIN, GROOVY, DYNAMIC LANG

SPRING WEB SERVICES


我们即将要学习的就是Spring Framework。
怎么下载呢?
第一步:进入github

SPRING

COMMUNITY

WHY SPRING

TRAINING

SUPPORT

PROJECTS

LEARN

SPRING BOOT

SPRING FRAMEWORK

5.3.23

SPRING FRAMEWORK

SPRING DATA

OVERVIEW

SUPPORT

LEARN

SPRING CLOUD

SPRING CLOUD DATA FLOW

DOCUMENTATION

>

SPRING SECURITY

EACH SPRING PROJECT HAS ITS OWN;IT EXPLAINS IN GREAT DETAILS HOW YOU CAN USE PROJECT FEATURES AND WHA

SPRING FOR GRAPHQL

YOU CAN ACHIEVE WITH THEM.

SPRING SESSION

5.3.23

APIDOC.

REFERENCE DOC.

CURRENT

GA

SPRING INTEGRATION

REFERENCE DOC.

APIDOC.

6.0.0-SNAPSHOT

SNAPSHOT

SPRING HATEOAS

API DOC.

6.0.0-M6

REFERENCE DOC.

SPRING REST DOCS

PRE

SPRING BATCH

5.3.24-SNAPSHOT

REFERENCE DOC.

APIDOC.

SNAPSHOT


第二步:找到下图位置,点击超链接

GITHUB.COM/SPRING-PROJECTS/SPRING-FRAMEWORK

README.MD

A WIDE RANGE OF SCENARIOS AND ARCHITECTURES.PLEASE READ THE OVENVIEW SECTION AS REFERENCE COMPLETE

INTRODUCTION.

CODE OF CONDUCT

THIS PROJECT IS GOVERNED BY THE SPRING CODE OF CONDUCT BY PARTICIPATING.YOU ARE EXPECTED THIS CODE OF

CONDUCT.PLEASE REPORT UNACCEPTABLE BEHAVIOR TO SPRING-CODE-OF-CONDUCT@PIVOTALIO.

ACCESS TO BINARIES

FOR ACCESS TO ARTIFACTS OR A DISTRIBUTION ZIP, SEE THE SPRING FRAMEWORK ARTIFACTS WIKI PAGE.

DOCUMENTATION

THE SPRING FRAMEWORK MAINTAINTAINS REFERENCE DOCUMENTATION (PUBLSHED AND SOURCE), GITHUBES,AND AN API

REFERENCE.THERE ARE ALSO GUIDES AND TUTORIALS ACROSS SPRING PROJECTS.

MICRO-BENCHMARKS


第三步:找到下图位置,点击超链接

GITHUB.COM/SPRING-PROJECTS/SPRING-FRAMEWORK/WIKI/SPRING-FRAMEWORK-ARTIFACTS

<DEPENDENCY>

<GROUPID>ORG.SPRINGFRAMEWORK</GROUPID>

<ARTIFACTID>SPRING-CONTEXT</ARTIFACTID>

<VERSION>5.3.16</VERSION>

</DEPENDENCY>

SPRING REPOSITORIES

SNAPSHOT MILESTONE AND RELEASE CANDIDATE VERSONS ARE PUBISHED TO AN AN ARIFACTOY INSTED BY LFION USE

WEB ULAT HTIPS//REPOSPRIFACIO TO BRONSE THE SPRING ARTIFACTORY,OR GO DRECLY TO OF THE REPOSTED BETOW'

SNAPSHOTS

ADD THE FOLLOWING TO RESOLVE SNAPSHOT VERSIONS - FOR EXAMPLE, 5.3.17-SNAPSHOT :

<REPOSITORY>

<ID>REPOSITORY.SPRING.S

G.SNAPSHOT</ID>

<NAME>SPRING SNAPSHOT

REPOSITORY</NAME>

<URL>HTTPS://REPO.SPRING.IO/SNAPSHOT</URL>

</REPOSITORY>


第四步:按照下图步骤操作

个TQ

REPO.SPRING.IO/UI/REPOS/TREE/GENERAL/LIBS-MILESTONE

SPRING

ARTIFACTS

SEARCH ARTIFACTS

HAPPILY SERVING 2,677,153 ARTIFACTS

ARTIFACTORY

FILTER BY:                                                                                          

FILTER REPOSITORIES

PACKAGES

LIBS-MIL

LIBS-SPRING-FRAMEWORK-BUILD

BUILDS

MILESTONE

PLUGINS-MILESTONE

GENERAL

ARTIFACTS

PLUGINS-RELEASE

INFO

XRAY

PLUGINS-SNAPSHOT

RELEASE

DISTRIBUTION

COM

NAME:

IO

PIPELINES

PACKAGE TYPE

3

ORG

REPOSITORY P

APACHE

CLOUDFOUNDRY

URL TO FILE:

PROJECTREACTOR

DESCRIPTION:

SPRINGFRAMEWORK

AMQP

PACKAGE INF

ANALYTICS

ANDROID

DEPENDENC

AWS

BATCH

BEANDOC

VIRTUAL REPO

BOOT


第五步:继续在springframework目录下找下图的spring,点开之后你会看到很多不同的版本

FILTER BY:

FILTER REPOSITORIES

SECURITY

SESSION

SHELL

SOCIAL

SPRING

1.0

1.0-M4

1.0-RC1


第六步:选择对应的版本

REPOSITORY TYPE

FILTER BY:PACKAGE TYPES

REPOSITORY TYPES

FILTER REPOSITORIES

MY FAVO

SORT BY:

CLEAR

5.3.9

5.3.3

5.3.4

5.3.5

PROPERTIES

GENERAL

5.3.6

INFO

5.3.7

5.3.8

5.3.9

5.3.9

NAME:

MAVEN-METADATA.XML

RELEASE/ORG/SPRINGFRAMEWORK/SPRING/5.3.9/

REPOSITORY PATH:

MAVEN-METADATA.XML.SHA512

HTTPS://REPO.SPRINGIO/ARTIFACTORY/RELEASE/ORG/SPRINGFRAMEWORK/SPRING/5.3.9/

URL TO FILE:

SPRING-AGENT

SPRING-AOP

14-07-21 07:18:11+0000

CREATED:

SPRING-ASM

PACKAGE INFORMATION

SPRING-ASPECTS

SPRING-BEANDOC

SPRING-BEANS

DEPENDENCY DECLARATION

SPRING-BINDING

SPRING-CONTEXT

VIRTUAL REPOSITORY ASSOCIATIONS

SPRING-CONTEXT-INDEXER

SPRING-CONTEXT-SUPPORT

SPRING-CORE


第七步:点击上图的url

INDEX OF RELEASE/ORG/SPRINGFRAMEWORK/SPRING/5.3.9

LAST MODIFIED

NAME

14-07-21 14:49:17 +0800

SPRING-5.3.9-DIST.Z

14-07-21 14:49:15 +0800

SPRING-5.3.9-DOCS.ZIP

SPRING-5.3.9

14-07-21 14:49:13 +0800

SCHEMA.ZIP

14-07-21 14:49:06 +0800

SPRING-5.3.9

POM

SPRING-5.3.9.POM.ASC

14-07-21 15:17:35 +0800

ARTIFACTORY ONLINE SERVER AT LOCALHOST PORT 8081


点击spring-5.3.9-dist.zip下载spring框架。
将下载的zip包解压:

DOCS

LIB

SCHEMA

LICENSE.TXT

NOTICE.TXT

README.TXT


docs:spring框架的API帮助文档
libs:spring框架的jar文件(用spring框架就是用这些jar包)
schema:spring框架的XML配置文件相关的约束文件
3.2 Spring的jar文件
打开libs目录,会看到很多jar包:

202

SPRING-CORE-5.3.9JAR

202

SPRING-CORE-5.3.9-JAVADOCJAR

202

SPRING-CORE-5.3.9-SOURCES.JAR


spring-core-5.3.9.jar:字节码(这个是支撑程序运行的jar包)
spring-core-5.3.9-javadoc.jar:代码中的注释
spring-core-5.3.9-sources.jar:源码
我们来看一下spring框架都有哪些jar包:

SPRING-AOP-5.3.9JAR

SPRING-ASPECTS-5.3.9JAR

SPRING-BEANS-5.3.9JAR

SPRING-CONTEXT-5.3.9JAR

SPRING-CONTEXT-INDEXER-5.3.9JAR

SPRING-CONTEXT-SUPPORT-5.3.9JAR

SPRING-CORE-5.3.9JAR

SPRING-EXPRESSION-5.3.9JAR

SPRING-INSTRUMENT-5.3.9.JAR

SPRING-JCL-5.3.9JAR

SPRING-5.3.3.3.9JAR

SPRING-JMS-5.3.9JAR

SPRING-MESSAGING-5.3.9JAR

SPRING-ORM-5.3.9JAR

SPRING-OXM-5.3.9.JAR

SPRING-R2DBC-5.3.9JAR

SPRING-TEST-5.3.9JAR

SPRING-TX-5.9JAR

SPRING-WEB-5.3.9JAR

SPRING-WEBFLUX-5.3.9JAR

SPRING-WEBMVC-5.3.9JAR

SPRING-WEBSOCKET-5.3.9JAR


JAR文件

描述

spring-aop-5.3.9.jar

这个jar 文件包含在应用中使用Spring 的AOP 特性时所需的类

spring-aspects-5.3.9.jar

提供对AspectJ的支持,以便可以方便的将面向切面的功能集成进IDE中

spring-beans-5.3.9.jar

这个jar 文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean 以及进行Inversion ofControl / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI 支持,引入spring-core.jar 及spring-beans.jar 文件就可以了。

spring-context-5.3.9.jar

这个jar 文件为Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI 所需的全部类,instrumentation组件以及校验Validation 方面的相关类。

spring-context-indexer-5.3.9.jar

虽然类路径扫描非常快,但是Spring内部存在大量的类,添加此依赖,可以通过在编译时创建候选对象的静态列表来提高大型应用程序的启动性能。

spring-context-support-5.3.9.jar

用来提供Spring上下文的一些扩展模块,例如实现邮件服务、视图解析、缓存、定时任务调度等

spring-core-5.3.9.jar

Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。

spring-expression-5.3.9.jar

Spring表达式语言。

spring-instrument-5.3.9.jar

Spring3.0对服务器的代理接口。

spring-jcl-5.3.9.jar

Spring的日志模块。JCL,全称为"Jakarta Commons Logging",也可称为"Apache Commons Logging"。

spring-jdbc-5.3.9.jar

Spring对JDBC的支持。

spring-jms-5.3.9.jar

这个jar包提供了对JMS 1.0.2/1.1的支持类。JMS是Java消息服务。属于JavaEE规范之一。

spring-messaging-5.3.9.jar

为集成messaging api和消息协议提供支持

spring-orm-5.3.9.jar

Spring集成ORM框架的支持,比如集成hibernate,mybatis等。

spring-oxm-5.3.9.jar

为主流O/X Mapping组件提供了统一层抽象和封装,OXM是Object Xml Mapping。对象和XML之间的相互转换。

spring-r2dbc-5.3.9.jar

Reactive Relational Database Connectivity (关系型数据库的响应式连接) 的缩写。这个jar文件是Spring对r2dbc的支持。

spring-test-5.3.9.jar

对Junit等测试框架的简单封装。

spring-tx-5.3.9.jar

为JDBC、Hibernate、JDO、JPA、Beans等提供的一致的声明式和编程式事务管理支持。

spring-web-5.3.9.jar

Spring集成MVC框架的支持,比如集成Struts等。

spring-webflux-5.3.9.jar

WebFlux是 Spring5 添加的新模块,用于 web 的开发,功能和 SpringMVC 类似的,Webflux 使用当前一种比较流程响应式编程出现的框架。

spring-webmvc-5.3.9.jar

SpringMVC框架的类库

spring-websocket-5.3.9.jar

Spring集成WebSocket框架时使用

注意:
如果你只是想用Spring的IoC功能,仅需要引入:spring-context即可。将这个jar包添加到classpath当中。
如果采用maven只需要引入context的依赖即可。
3.3 第一个Spring程序
前期准备:
打开IDEA创建Empty Project:spring6

NEW PROJECT

A BASIC PROJECT THAT ALLOWS WORKING WITH SEPARATE FIES AND COMPILING JAVA AND KOTLIN DASSES.

NEW PROJECT

EMPTY PROJECT

NAME:

SPRING6

GENERATORS

D://POWERNODE\SPRING6\CODE

LOCATION:

MAVEN ARCHETYPE

PROJECT WILL BE CREATED IN: D:/POWERNODE\SPRING6\CODE\SPRING6

JAVA ENTERPRISE

CREATE GIT REPOSITORY

SPRING INITIALIZR

JAVAFX

QUARKUS

MICRONAUT

KTOR

KOTLIN MULTIPLATFORM

COMPOSE MULTIPLATFORM

HTML

REACT

EX EXPRESS

A

ANGULAR CLI

IDE PLUGIN

ANDROID

CANCEL

CREATE


设置JDK版本17,编译器版本17

J

PROJECT STRUCTURE

PROJECT

PROJECT SCTTINGS

DEFAULT SATTINGS FOR ALL MODULES.CONFIQURE THESE PARANETERS FOR EACH MODULE ON THE MODULE AS NEEDED

PROJECT

MODULES

NAME:

SPRING6

LIBRARIES

FACETS

17 ORACLE OPENJDK VERSION 17.0.4

SDK:

EDIT

ARTIFACTS

PLATFORM SETTINGS

17 - SEALED TYPES, ALWAYS-STRICT FLOATING-POINT SEMANTICS

LANGUAGE LEVEL:

SDKS

GLOBAL LIBRARIES

COMPILER OUTPUT:

D:\POWERNODE|SPRING6/CODE|SPRING6\OUT

USED FOR MODULES' SUBDIRECTORIES, PRODUCION AND TEST DIRECTORIES FOR THE CORRESPONDING SOURCES

PROBLEMS

OK

APPLY

CLOSE


设置IDEA的Maven:关联自己的maven

SETTINGS

BUILD,EXECUTION,DEPLOYMENT > BUILD TOOLS > MAVEN

RESET

APPEARANCE&BEHAVIOR

WORK OFFLINE

KEYMAP

USE PLUGIN REGISTRY

EDITOR

EXECUTE GOALS RECURSIVELY

PLUGINS

PRINT EXCEPTION STACK TRACES

VERSION CONTROL

ALWAYS UPDATE SNAPSHOTS

BUILD,EXECUTION,DEPLOYMENT

OUTPUT LEVEL:

INFO

BUILD TOOLS

CHECKSUM POLICY:

MAVEN

NO GLOBAL POLICY

IMPORTING

MULTIPROJECT BUILD FAIL POLICY:

DEFAULT

LGNORED FILES

THREAD COUNT

-TOPTION

RUNNER

RUNNING TESTS

C:/DEV/APACHE-MAVEN-3.8.6

MAVEN HOME PATH:

REPOSITORIES

(VERSION:3.8.6)

ARCHETYPE CATALOGS

\DEV\APACHE-MAVEN-3.8.6\CONF SETTINGS.XML

USER SETTINGS FILE:

OVERRIDE

GRADLE

E:\REPOSITORY

LOCAL REPOSITORY:

GANT

OVERRIDE

COMPILER

J USE SETTINGS FROM .MVN/MAVEN.CONFIG

DEBUGGER

REMOTE JAR REPOSITORIES

DEPLOYMENT

ANDROID

APPLICATION SERVERS

COVERAGE

DOCKER

OK

APPLY

CANCEL


在空的工程spring6中创建第一个模块:spring6-001-first

NEW MODULE

SPRING6-001-FIRST

NAME:

NEW MODULE

D:\POWERNODE\SPRING6/CODE\SPRING6

LOCATION:

GENERATORS

MODULE WILL BE CREATED IN: D:YPOWERNODE\SPRING6\CODE(SPRING6\SPRING6-001-FIRSS

M MAVEN ARCHETYPE

JAVA ENTERPRISE

JAVASCRIPT

LANGUAGE:

GROOVY

SPRING INITIALIZR

BUILD SYSTEM:

INTELLIJ

GRADLE

MAVEN

JAVAFX

QUARKUS

17 ORACLE OPENJDK VERSION 17.0.4

JDK:

MICRONAUT

ADD SAMPLE CODE

KTOR

COMPOSE MULTIPLATFORM

ADVANCED SETTINGS

HTML

GROUPLD:

COM.POWERNODE

REACT

ARTIFACTLD:

SPRING6-001-FIRST

EX EXPRESS

ANGULAR CLI

IDE PLUGIN

ANDROID

CANCEL

CREATE


第一步:添加spring context的依赖,pom.xml配置如下
注意:打包方式jar。
当加入spring context的依赖之后,会关联引入其他依赖:
spring aop:面向切面编程
spring beans:IoC核心
spring core:spring的核心工具包
spring jcl:spring的日志包
spring expression:spring表达式


第二步:添加junit依赖
第三步:定义bean:User
第四步:编写spring的配置文件:beans.xml。该文件放在类的根路径下。

5

RESOURCES

NEW

</BEANS>

00

KOTLIN CLASS/FILE

SPRING

FILE

ERNAL

SCRATCH FILE

CTRL+ALT+SHIFT+LNSERT

ATCHES

DIRECTORY

HTML FILE

KOTLIN SCRIPT

KOTLIN WORKSHEET

STYLESHEET

JAVASCRIPT FILE

TYPESCRIPT FILE

TS

PACKAGE.JSON FILE

OPENAPI SPECIFICATION

MYBATIS核心配置文件

八V

MYBATIS的SQL映射文件

KV

EDIT FILE TEMPLATES...

RESOURCE BUNDLE

EDITORCONFIG FILE

XML CONFIGURATION FILE

SPRING CONFIG

HTTP REQUEST

JSP TAG LIBRARY DESCRIPTOR

API

1T DIAGRAM

DATA SOURCE IN PATH


上图是使用IDEA工具自带的spring配置文件的模板进行创建。
配置文件中进行bean的配置。
bean的id和class属性:
id属性:代表对象的唯一标识。可以看做一个人的身份证号。
class属性:用来指定要创建的java对象的类名,这个类名必须是全限定类名(带包名)。
第五步:编写测试程序
第七步:运行测试程序

SPRING6TEST.TESTFIRST X

TESTS PASSED:1 OF 1 TEST - 429MS

SPRING6TEST (CO 429MS

C:\DEV\JAVA\JDK-17.0.4\BIN\JA

JAVA.EXE

TESTFIRST

429MS

COM.POWERNODE.SPRING6.BEAN.USER@12468A38

PROCESS FINISHED WITH EXIT CODE O


3.4 第一个Spring程序详细剖析
1bean标签的id属性可以重复吗?
运行测试程序:

PUBLIC CLASS SPRING6TEST

LE.SPRING6.TEST

@TEST

10

PUBLIC VOID TESTFIRST(){

11

BEANFACTORY BEANFACTORY;

12

//初始化SPRING容器上下文(解析BEANS.XML文件,创建所有的BEAN对象)

13

APPLICATIONCONTEXT APPLICATIONCONTEXT - NAW CLASSPATHXMLAPPLICATIONCONTEXT(CONTEXT(CON."BEANS.XML')

14

//根据ID获取BEAN对象

15

OBJECT USERBEAN ; APPLICATIONCONTEXT.GETBEAN( S:"USERBEAN"

16

17

SYSTEM.OUT.PRINTLN(USERBEAN);

18

10

TESTS FAILED:1 OF 1 TEST -230MS

A\JDK-17.0.4\BIN\JAVA.EXE

IS ALREADY USED IN THIS <BEANS> EL

FRAMEWORK.BEANS.FACTORY.PARSING:BEANDEFINITIONPARSINGEXCEPTION: CONFIGURATION PROBLEM;

'USERBEAN'

BEAN

NAME

RESOURCE: CLASS PATH RESOURCE [BEANS.XML]


通过测试得出:在spring的配置文件中id是不能重名。
2底层是怎么创建对象的,是通过反射机制调用无参数构造方法吗?
在User类中添加无参数构造方法,如上。
运行测试程序:

TESTS PASSED:1 OF 1 TEST - 290MS

C:\DEV\JAVA\JDK-17.0.4\BIN\JAVA.EXE

SL

USER的无参数构造方法执行

COM.POWERNODE.SPRING6.BEAN.USER@5876A9AF


通过测试得知:创建对象时确实调用了无参数构造方法。
如果提供一个有参数构造方法,不提供无参数构造方法会怎样呢?
运行测试程序:

:1 OF 1 TEST-280MS

-K.BEANS.BEANIN

COM.POWERNODE.SPRING6.BEAN.USER.<INIT>()

NOSUCHMETHODEXCEPTION

NO DEFAULT CONSTRUCTOR FOUND;

NESTED EXCEPTION IS JAVA.LANG

ISER]


通过测试得知:spring是通过调用类的无参数构造方法来创建对象的,所以要想让spring给你创建对象,必须保证无参数构造方法是存在的。
Spring是如何创建对象的呢?原理是什么?
3把创建好的对象存储到一个什么样的数据结构当中了呢?

MAP<STRING,OBJECT>

KEY(ID)

VALUE(BEAN)

USER对象

"USERBEAN"

"VIPBEAN

VIP对象

STUDENT对象

"STUDENTBEAN"

USERSERVICE对象

"USERSERVICEBEAN"


4spring配置文件的名字必须叫做beans.xml吗?
通过以上的java代码可以看出,这个spring配置文件名字是我们负责提供的,显然spring配置文件的名字是随意的。
5像这样的beans.xml文件可以有多个吗?
再创建一个spring配置文件,起名:spring.xml
运行测试程序:

TESTS PASSED:1 OF 1 TEST -276MS

C:\DEV\JAVA\JDK-17.0.4\BIN\JAVA.EXE

USER的无参数构造方法执行

COM.POWERNODE.SPRING6.BEAN.USER@2A798D51

COM.POWERNODE.SPRING6.BEAN.VIP@6D763516


通过测试得知,spring的配置文件可以有多个,在ClassPathXmlApplicationContext构造方法的参数上传递文件路径即可。这是为什么呢?通过源码可以看到:

I USAGE

CLASSPATHXMLAPPLICATIONCONTEXT(

THROWS BEANSEXCEPTION

(STRING... CONFIGLOCATIONS)

PUBLIC

REFRESH: TRUE,

(APPLICATIONCONTEXT)NULL);

THIS(CONFIGLOCATIONS,


6在配置文件中配置的类必须是自定义的吗,可以使用JDK中的类吗,例如:java.util.Date?
运行测试程序:

TESTS PASSED:1 OF 1 TEST - 311MS

C:\DEV\JAVA\JDK-17.0.4\BIN\JAVA.EXE

USER的无参数构造方法执行

COM.POWERNODE.SPRING6.BEAN.USER@6D763516

VIP@52BF72B5

COM.POWERNODE.SPRING6.BEAN.VI

THU SEP 22 15:16:03 CST 2022


通过测试得知,在spring配置文件中配置的bean可以任意类,只要这个类不是抽象的,并且提供了无参数构造方法。
7getBean()方法调用时,如果指定的id不存在会怎样?

@TEST

PUBLIC VOID TESTFIRST(){

//初始化SPRING容器上下文(解析BEANS.XML文件,创建所有的BEAN对象)

...CONFIGLOCATIONS:"BEANS.XML","SPRING.XML");

APPLICATIONCONTEXT APPLICATIONCONTEXT - NEW CLASSPATHXMLAPPLICATIONCONTEXT(

根据ID获取BEAN对象

OBJECT USERBEAN - APPLICATIONCONTEXT.GETBEAN(

HAHABEAN

OBJECT VIPBEAN - APPLICATIONCONTEXT.GETBEAN( S:"VIPBEAN

OBJECT DATEBEAN - APPLICATIONCONTEXT.GETBEAN(S:"DATEBEAN");

SYSTEM.OUT.PRINTLN(USERBEAN);

SYSTEM.OUT.PRINTLN(VIPBEAN);

SYSTEM.OUT.PRINTLN(DATEBEAN);


运行测试程序:

TESTS FAILED:1 OF 1 TEST - 320MS

C:\DEV\JAVA\JDK-17.0.4\BIN\JAVA.EXE

USER的无参数构造方法执行

AVAILABLE

'HAHABEAN'

ORG:SPRINGFRAMEWORK.BEANS.FACTORY.NOSUCHBEANDEFINITIONEXCEPTION: NO BEAN NAMEDL

AT ORG-SPRINGFRANOWORK,PEANS,FACTORY,SUPPORT,    FACTLISTABLEBEANFACTORY-9ETBEANDEFINLTION(OSFAULTLEB

AT ORG.SPRINGFRANEWORK,PEANS,FACTORY,SUPPORT.ABSTRACTEOANFACTEOANFACTARGALOCALBEANDEFINTTIONCABSTRAS


通过测试得知,当id不存在的时候,会出现异常。
8getBean()方法返回的类型是Object,如果访问子类的特有属性和方法时,还需要向下转型,有其它办法可以解决这个问题吗?
9ClassPathXmlApplicationContext是从类路径中加载配置文件,如果没有在类路径当中,又应该如何加载配置文件呢?

软件(D:)

名称

POWERNODE

SPRING6.XML


没有在类路径中的话,需要使用FileSystemXmlApplicationContext类进行加载配置文件。
这种方式较少用。一般都是将配置文件放到类路径当中,这样可移植性更强。
10ApplicationContext的超级父接口BeanFactory。

Java

复制代码

1

2

3

BeanFactorybeanFactory=newClassPathXmlApplicationContext("spring.xml");

ObjectvipBean=beanFactory.getBean("vipBean");

System.out.println(vipBean);

BeanFactory是Spring容器的超级接口。ApplicationContext是BeanFactory的子接口。
3.5 Spring6启用Log4j2日志框架
从Spring5之后,Spring框架支持集成的日志框架是Log4j2.如何启用日志框架:
第一步:引入Log4j2的依赖

pom.xml

XML

复制代码

1

2

3

4

5

6

7

8

9

10

11

<!--log4j2的依赖-->

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-core</artifactId>

<version>2.19.0</version>

</dependency>

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-slf4j2-impl</artifactId>

<version>2.19.0</version>

</dependency>

第二步:在类的根路径下提供log4j2.xml配置文件(文件名固定为:log4j2.xml,文件必须放到类根路径下。)

log4j2.xml

XML

复制代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<?xml version="1.0" encoding="UTF-8"?>


<configuration>


<loggers>

<!--

           level指定日志级别,从低到高的优先级:

               ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF

       -->

<rootlevel="DEBUG">

<appender-refref="spring6log"/>

</root>

</loggers>


<appenders>

<!--输出日志信息到控制台-->

<consolename="spring6log"target="SYSTEM_OUT">

<!--控制日志输出的格式-->

<PatternLayoutpattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/>

</console>

</appenders>


</configuration>

第三步:使用日志框架

Java

复制代码

1

2

Loggerlogger=LoggerFactory.getLogger(FirstSpringTest.class);

logger.info("我是一条日志消息");

相关文章
|
5天前
|
Java Spring 容器
Spring系列文章:Spring6集成MyBatis3.5
Spring系列文章:Spring6集成MyBatis3.5
|
9月前
|
Java 数据安全/隐私保护 Spring
【Spring】Spring6 启用 Log4j2 日志框架
【Spring】Spring6 启用 Log4j2 日志框架
|
设计模式 SQL 算法
Spring6详细教程(十)--->Spring中的八大模式
1. 学习视频在b站搜索动力节点即可!!! 2. 从 0 开始学 Java 知识之 Java-学习路线 中的《Spring中的八大模式》,不定期更新所学笔记 !!! 3. Spring6内容完结,所有资源均在 动力节点,关注动力节点微信公众号获取即可 !!!
259 0
|
XML Java 关系型数据库
Spring6详细教程(九)--->Spring6集成MyBatis3.5
1. 学习视频在b站搜索动力节点即可!!! 2. 从 0 开始学 Java 知识之 Java-学习路线 中的《Spring6集成MyBatis3.5》,不定期更新所学笔记
350 0
|
XML Java 测试技术
Spring6详细教程(八)--->Spring6整合JUnit5
1. 学习视频在b站搜索动力节点即可!!! 2. 从 0 开始学 Java 知识之 Java-学习路线 中的《Spring6整合JUnit5》,不定期更新所学笔记
231 0
|
SQL XML 前端开发
Spring6详细教程(七)--->Spring对事务的支持
1. 学习视频在b站搜索动力节点即可!!! 2. 从 0 开始学 Java 知识之 Java-学习路线 中的《Spring6--->Spring对事务的支持》,不定期更新所学笔记
235 0
|
SQL XML Oracle
Spring6详细教程(四)---&gt;Spring IoC注解式开发
本章节有一下内容:Spring IoC注解式开发、JdbcTemplate的回顾
256 0
|
XML 存储 Java
spring6详细教程(三)---&gt;手写Spring框架
1. 在线学习链接:B站搜动力节点_老杜,观看完整教程!!! 2. 能够手写出spring框架 3. 回归了反射相关知识
125 0
|
XML Java 关系型数据库
Spring6(一)--->Spring对IoC的实现
在线学习链接:B站搜动力节点_老杜,观看完整教程
104 0
|
5天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
62 0