一、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("我是一条日志消息");