1、Spring简介
1.1、spring的由来
spring是轻量级java开发框架,是一个轻量级的企业级开发的一站式解决方案,所谓解决方案是可以基于Spring解决javaEE开发的所有问题。最早由Rod Johnson创建。目的是解决企业级应用开发的业务与逻辑层和其它各层的耦合问题。是一个分层的轻量级开源框架。提供基础框架支持。
1.2、spring的体系结构
20多个模块,这些模块分布在核心容器、数据访问层、web层、aop模块、信息模块、植入模块和测试模块。
1.3、Spring的优点
- 低侵入式设计
- 独立于各种应用服务器
- 依赖注入特性将组件关系透明化,降低耦合度
- 面向切面编程特性允许将通用任务进行集中式处理
- 与第三方框架的良好整合
1.4、Spring的发展过程
- xml配置
- 注解配置
- java配置
项目构建工具:Maven
2、Spring IOC
2.1、Spring IOC 的基本概念
控制反转(IOC): 对象的实例不由调用者创建,而是由Spring容器来创建。spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制,这样,控制权就由调用者转移到spring容器,控制权反生了反转,这就是spring的控制反转。
**依赖注入:**Spring 容器角度来看, Spring 容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例 这就是Spring的依赖注入。
综上所述,控制反转是一种通过描述 (在 Spring 中可以XML或注解 )并通过第三方去产生或获取特定对象的方式。在 Spring中实现控制反转的是IOC容器 其实现方法是依赖注入。每一个被Spring管理的Java对象都称之为Bean;而Spring提供了一个IoC容器用来初始化对象,解决对象间的依赖管理和对象的使用。
2.2、Spring IOC 容器
2.2.1、BeanFactory
BeanFactory由org.spring.framework.beans.factory.BeanFactory
接口定义,它提供完整的IOC服务支持,是一个管理 Bean的工厂,主要负责初始化各种Bean。
2.2.2、ApplicationContext
ApplicationContext是BeanFactory的子接口,也称为应用上下文,由org.springframework.context.ApplicationContext
接口定义。
实现ApplicationContext接口实例的三种方法:
- 通过ClassPathXMLApplicationContext 创建
- 通过FileSystemXmlApplicationContext 创建
- 通过Web服务器实例化ApplicationContext容器
2.3、依赖注入的类型
依赖注入的作用是使用spring框架创建对象时动态的将其所依赖的对象(例如属性值)注入Bean组件中。spring框架的依赖注入通常有两种实现方式。一种是使用构造方法注入,另一种是使用属性的setter方式注入。
2.3.1、使用构造方法注入
<!-- 将指定类 TestDIDaoimpl 配置给 Spring ,让 Spring 创建其实例 -->
<bean id="myTestDIDa" class="dao.TestDIDaoImpl">
<!-- 使用构造方法注入 -->
<bean id="testDIService" class="service.TestDIServiceImpl">
<!-- myTestDIDao 注入到 TestDIServiceimpl 类的属性 testDIDao -->
<constructor-arg index="0" ref="myTestDIDao"/>
</bean>
</bean>
2.3.2、使用属性setter方法注入
<!-- 使用setter方法注入 -->
<bean id="testDIService1" class="service.TestDIServiceImpl1">
<!-- 调用TestDIServiceImpl1 类的setter方法,将myTestDIDao注入到TestDIServiceImpl1类的属性testDIDao上 -->
<property name="testDIDao" ref="myTestDIDao"/>
</bean>
2.3.3、使用P命名空间注入属性值
3、Spring Bean
3.1、Bean的配置
Spring看做一个大型工厂,用于生产和管理Spring容器中的Bean,如果要使用工厂生产和管理Bean,需要开发者将Bean配置在spring的配置文件中。Spring框架支持XML和Properties两种格式的配置文件。
XML配置文件的根元素是,他包含了多个子元素,每一个bean元素定义一个Bean,并描述Bean如何被配置到Spring容器中。常用属性:
id:Bean在工厂中的唯一标识
class:Bean的具体实现类
scope:Bean的作用域
constructor-arg:构造方法注入,指定构造方法的参数,该元素的index属性指定参数的序号,ref属性指定对应工厂其它Bean的引用关系,type属性执行参数类型,value属性指定参数的常量值。
property:用于设置一个属性,那么指定Bean实例中相对应属性的名称,value属性指定Bean的属性值,ref属性指定属性对工厂中其它bean的引用关系
list:property元素的子元素,封装list或数组类型的依赖注入
map:property元素的子元素,封装map类型的依赖注入
entry:map的子元素,用于设置一个键值对。
3.2、Bean的实例化
3.2.1、构造方法实例化
3.2.2、静态工厂实例化
3.2.3、实例工厂实例化
3.3、Bean的作用域
3.4、Bean的生命周期
3.5、Bean的装配方式
3.5.1、基于XML配置的装配
3.5.2、基于注解的装配
- 1、@Component(“annotationUser”)
或者@Component(value=‘annotationUser’);@Value(“chenheng”)给属性uname赋值。
配置文件中配置注解:
<context:componnet-scan base-package="Bean所在的包路径"></context:componnet-scan>
-
2、@Repository
该注解用于将数据访问层(DAO)的类标识为Bean,即注解数据访问层BEan,其功能与@Component相同。 -
3、@Service
该注解用于标注一个业务逻辑组件类(Service层),其功能与@Component相同 -
4、@Controller
该注解用于标注一个控制器组件类(SpringMVC的Controller),其功能与@Component相同。 -
5、@Autowired
该注解可以对类成员变量、方法及构造方法进行标注,完成自动装配的工作。通过使用@Autowired来消除setter和getter方法。默认按照Bean的类型进行装配。 -
6、@Resource
该注解与@Autowired的功能一样,区别在于该注解默认按照名称来装配注入的,只有当找不到与名称匹配的Bean时才会按照类型来装配注入;而@Autowired默认按照Bean的类型进行装配,如果想按照名称来装配注入,则需要和@Qualifier注解一起使用。
@Resource有两个属性,name和type,name是指定Bean实例名称,type指定Bean实例类型。 -
7、@Qualifier
该注解与@Autowired注解配合使用。当@Autowired注解需要按照名称来装配注入时需要和该注解一起使用,Bean的实例名由@Qualifier注解的参数指定。
4、Spring AOP
4.1、Spring AOP的基本概念
4.1.1、AOP的概念
-
AOP:面向切面编程,基本单元是Aspect(切面);Struts2的拦截器设计就是基于AOP。
-
OOP:面向对象编程,基本单元是类
-
OOP可以通过封装或继承的方式达到代码的重用,但是仍然有同样的代码分散在各个方法中,因此采用OOP处理日志记录、性能统计、安全控制、事务处理、异常处理等操作不仅增加了开发者的工作量,而且提高了升级维护困难。为了解决此类问题,AOP思想应运而生。
-
AOP采取横向抽取机制:即将分散在各个方法中的重复代码抽取出来,然后在程序编译或者运行阶段将这些抽取出来的代码应用到需要执行的地方。
-
OOP采用的是纵向重用。
-
AOP不是OOP的替代品,而是OOP的补充。
AOP原理:
- 将复杂的需求分解出不同方面,将分散在系统中的公共功能集中解决
- 采用代理机制组装起来允许,在不改变原程序的基础上对代码进行增强处理,增加新的功能。
4.1.2、AOP的术语
切面:封装横切到系统功能(例如事务处理)的类
连接点:程序运行中的一些时间点,例如方法的调用或异常的抛出。
切入点:需要处理的连接点。在Spring AOP中,所有的方法执行都是连接点,而切入点是一个描述信息,他修饰的是连接点,通过切入点确定哪些连接点需要被处理。
通知 :由切面添加到特定的连接点的一段代码。
引入:允许在现有的实现类中添加自定义的方法和属性。
目标对象:所有被通知的对象。
代理:通知应用到目标对象之后被动态创建的对象。
织入:将切面代码插入的目标对象上,从而生成代理对象的过程。
4.2、动态代理(未更)
4.2.1、JDK 动态代理
4.2.2、CGLIB动态代理
4.3、基于代理类的AOP实现
4.3.1、通知类型
- 环绕通知:在目标方法执行前和执行后实施增强,日志记录 事务处理等功能
- 前置通知:目标方法执行前实施增强,可应用于权限管理等功能。
- 后置返回通知:目标方法成功执行后实施增强,关闭流,删除临时文件等功能。
- 后置(最终)通知:目标方法执行后实施增强,可以应用与释放资源。
- 异常通知:在方法抛出异常后实施增强,处理异常,记录日志等功能。
- 引入通知:在目标类中添加一些新的方法和功能,应用于修改目标类(增强类)。
4.3.2、ProxyFactoryBean
4.4、基于XML配置开发AspectJ
4.5、基于注解开发AspectJ
实例步骤:
上面的配置文件是xml的配置,现在使用java配置来配置:
5、Spring 的事务管理
5.1、Spring的数据库编程
5.1.1、Spring JDBC的配置
配置文件:
5.1.2、Spring JdbcTemplate常用方法
5.2、编程式事务管理
在代码中显式调用 beginTransaction commit rollback 等与事务处理 相关的方法 ,这就是编程式事务管理。当只有少数事务操作时,编程式事务管理才比较合适。
5.2.1、基于底层API的编程式事务管理
5.2.2、基于TransactionTemplate的编程式事务管理
5.3、声明式事务管理
Spring 的声明式事务管理是通过AOP 技术实现的事务管理,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
声明式事务管理最大的优点是不需要通过编程的方式管理事务,因而不需要在业务逻辑代码中掺杂事务处理的代码,只需相关的事务规则声明便可以将事务规则应用到业务逻辑中。通常情况下,在开发中使用声明式事务处理不仅因为其简单,更主要的是因为这样使得纯业务代码不被污染,极大地方便了后期的代码维护。
缺点:最细粒度只能作用到方法级别,无法做到代码块级别。可以让代码块独立为方法就可以解决这个问题。
5.3.1、基于XML方式的声明式事务管理
Spring 框架提供了 tx 命名空间来配置事务,提供了<tx:advice>元素来配置事务的通知。在配置<tx :adv ce>元素时一般需要指定 id 和transaction-manager 属性,其中 id 属性是配置文件中的唯一标识, transaction-manager 属性指定事务管理器。。另外还需要<tx:attributes >子元素,该子元素可配置多个<tx:method>子元素指定执行事务的细节。
5.3.2、基于@Transactional 注解的声明式事务管理
5.3.3、事务失效
代码中使用try。。catch处理了异常,程序执行到异常代码的时候可以继续执行下面的,所以事务失效。
即是没有处理异常,事务也失效。
默认在运行时抛出异常事务才会处理,要想所有异常都能处理,那么就在后面加上如下语句。
使用注解还是要注意事务失效的情况,所以遇到checked类型的异常,要指定注解的属性值。
6、MyBatis 开发入门
6.1、MyBatis简介
-
MyBatis 本是 Apache 的一个开源项目一-iBatis, 2010 年这个项目由 pache Software Foundation 迁移到了 Google Code 并且改名 MyBatis。
-
MyBatis是一个基于 Java 的持久层框架。 MyBatis 提供的持久层框架包括 SQL、Maps 和 DAO ,它消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。 MyBatis使用简单的XML或注解用于配置和原始映射,将接口和 Java的POJO ( Plain Old Java Objects 普通的 Java 象)映射成数据库中的记录。
-
Mybatis是一个半自动映射的框架,需要手动匹配POJO,SQL和映射关系。
-
Hibernate是一个全自动映射的框架,只需要提供POJO和映射关系即可。
持久化:
- 是程序数据在瞬时状态和持久状态间转换的过程
ORM(对象关系映射):
- 编写程序的时候,以面向对象的方式处理数据
- 保存数据的时候,却以关系型数据库的方式存储
特点:
- 基于SQL语法,简单易学
- 能了解底层封装过程
- SQL语句封装在配置文件中,便于统一管理与维护,降低程序的 耦合度
- 方便程序代码调试
6.2、MyBatis环境搭建
- 导入依赖
- 核心配置文件
- 实体类
- 映射文件
- 测试类
- 读取核心配置文件
- 创建会话工厂,读取配置文件
- 创建会话对象
- 调用mapper文件进行数据操作(执行SQL语句)
6.3、MyBatista的工作原理
- 读取MyBatis配置文件:mybatis-config.xml是Mybatis的全局配置文件,配置了Mybatis的运行环境等信息。例如数据库连接信息。
- 加载映射文件(SQL映射文件)。该文件配置了操作数据库的SQL语句,需要在Mybatis配置文件中加载。可以挤在多个映射文件,每个映射文件对应数据库中的一张表。
- 构造会话工厂SqlSessionFactory
- 创建会话对象SqlSession:由对话工厂创建,该对象中包含执行SQL语句的所有方法
- Executor执行器:MyBatis底层定义了一个Executor接口来操作数据库,根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
- MappedStatement对象:在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。
- 输入参数映射:输入参数类可以是Map,List等集合类型,也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对PreparedStatement对象设置参数的过程。
- 输出结果映射
6.4、MyBatis入门程序
-
导入依赖
-
创建持久化类
-
创建映射文件
-
创建MyBatis配置文件
-
创建测试类
-
读取配置文件
-
根据读取的配置文件创建会话工厂
-
创建会话对象
-
使用会话对象执行sql语句
-
6.5、MyBatis与Spring的整合
- 导入依赖
- 创建持久化类
- 创建SQL映射文件和MyBatis核心配置文件
- 创建数据访问接口
- 创建控制层
- 创建Spring的配置文件
- 连接数据库
- 添加事务支持
- 开启事务注解
- 配置MyBatis工厂,同时指定数据源,引入MyBatis核心配置文件
- 扫描Mapper代理,所有@Mapper注解标注的接口自动装配为MyBatis的映射接口
- 创建测试类
6.6、使用MyBatis Generator插件自动生成映射文件
7、映射器
7.1、MyBatis配置文件概述
元素要按照上面的顺序才可以,否则报错
7.1.1、properties元素
通过外部指定的方式实现
可以将数据库信息单独放在一个文件中。如下:
将数据库连接数据写在database.properties文件中:
修改核心配置文件:
直接在xml中实现
上述方法也可以直接都放在核心配置文件:
两种方式都使用
使用以下方式,两种方式都使用了,系统会使用database.properties中的为主。
settings元素
设置是否启动延迟加载
设置日志
-
添加日志驱动包
-
编写日志文件log4j.properties
-
在核心配置文件中添加日志设置语句
typeAliases元素
核心配置文件:
sql映射文件:
返回类型直接填写别名即可
environments元素
每个SqlSessionFactory实例只能选择一个运行环境
dataSource
mappers元素
7.2、映射器概述
映射器是 MyBatis 最复杂且最重要的组件,由一个接口加上 XM 文件 SQL 映射文件)组成。 MyBatis 的映射器 可以使用注解完成,但在实际应用中使用不广泛,原因主要来自 以下几个方面 其一 面对复杂的 SQL 会显得无力 其二 注解的可读性较差;其三,注解丢失了 XML 上下文相互引用的功能。因此,推荐使用 XML 文件开发映射器。
7.2.1、mapper元素
7.2.2、select元素
单个参数传递
接口:
SQL映射文件:
测试代码:
如果SQL映射文件中的UserMapper没有加入到核心配置文件中,需要先加入到核心配置文件中然后再测试代码。
多个参数传递
接口:
SQL映射文件:
这里#{userName},#{address}中{}里面的值要跟上面接口中@Param注解中的值一样,相当于给userName取别名为userName,然后在SQL映射文件中使用别名去接口中找对应的属性字段。
测试代码:
以对象为参数传递
接口:
SQL映射文件:
这里#{userName},#{address}中{}里面的值要跟User类中的属性字段对应,不能跟上面那样可以取别名后使用别名。
测试代码:
以map为参数传递
接口:
SQL映射文件:
这里#{userName},#{address}中{}里面的值要跟下面测试代码中的Map对象中的属性对应。填写的是别名,而不是实体类中的属性字段。
测试代码:
自定义映射ResultMap
查询的数据涉及到两个表,需要联表查询,如果返回的结果resultType=User,那么返回的只是User实体类中的属性字段,另一个表中的属性不会显示。所以需要在User实体类中加入,另一个表中的属性,并给他设置get,set方法。
当在User实体类中,有一个字段userRoleName代表roleName,但是数据库中是roleName,需要自定义映射,将他们对应。
cloumn是数据库中的字段,property是实体类中的字段。
7.2.3、insert元素
- keyProperty :该属性的作用是将插入或更新操作时的返回值赋给 PO 类的某个属性,
通常会设置为主键对应的属性。如果是联合主键,可以将多个值用逗号隔开。
- keyColumn :该属性用于设置第几列是主键,当主键列不是表中 的第 1列时需要设
置。如果是联合主键,可以将多个值用逗号隔开。
7.2.4、update和delete元素
7.2.5、sql元素
7.3、一对一映射
7.4、一对多映射
7.5、多对多映射
8、缓存
一级缓存
在同一个会话SQLSession下,执行两次同样的SQL语句的时候,第一次执行结束后,数据就存入到缓存中,第二次执行相同的sql语句的时候,就会从缓存中获取数据。重新获取会话的情况下,一级缓存就失效了。
一级缓存的作用域:在同一个会话SQLSession中
二级缓存的作用域:在同一个命名空间namespace中
二级缓存
默认是关闭的,所以要使用的时候要在映射文件中开启,如下:
某个不用二级缓存的时候,可以在该sql语句后面加上useCache=false。
总结
9、动态SQL
if和where使用
set使用
trim使用
trim代替where功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7b6zlz9P-1617729986817)(D:\笔记\java\朝月余晖\javaee.assets\20210220174051.png)]
trim代替set功能
foreach使用
foreach接收普通数据参数array
foreach接收动态数组参数(集合)list
foreach接收数组在Map中
此处的collection的值为map中对应的key。
choose(when、otherwise)元素
等效于多重if(if-else if-else…)
分页
bind元素
模糊查询
总结
10、Spring MVC
10.1、MVC 模式
10.2、Spring MVC 工作原理
10.3、Spring MVC 接口
10.4、第一个Spring MVC应用
-
导入依赖
-
web.xml部署DispatcherServlet
-
创建web应用首页
-
controller类
-
创建spring mvc的配置文件
-
创建跳转到的login.jsp页面和register.jsp页面。
-
发布并运行spring MVC应用。
-
视图解析器
11、Spring MVC的Controller
11.1、基于注解的控制器
11.1.1、Controller注解类型
表明这个类是Spring MVC中的Controller,将其声明为Spring的一个BEan
11.1.2、RequestMapping注解类型
用来映射Web请求(访问路径和参数)、处理类和方法的。可以注解在类或方法上,若注解在方法上,那么路径会继承注解在类上的路径。支持Servlet的request和response作为参数。
@ResponseBody:支持将返回值放在response体内,而不是返回一个页面。
@RequestBody:允许request参数在request体中,而不是在直接链接在地址后面。
@PathVariable:用来接收路径参数
@RestController:是一个组合注解,组合了@Controller和@RespponseBody
11.1.3、编写请求处理方法
11.2、Controller接收请求参数的常见方式
get、post或者两个都适合。
11.2.1、通过实体Bean接收请求参数
通过 实体 Bean 来接收参数 ,适用 get和 post 提交请求方式。需要注意的是Bean的属性名称与请求参数名称相同 。
11.2.2、通过处理方法的形参接收请求参数
11.2.3、通过HttpServletRequest接收请求参数
11.2.4、通过@PathVariable接收URL中的请求参数
11.2.5、通过@RequestParam接收请求参数
11.2.6、通过@ModelAttribute接收请求参数
11.3、重定向与转发
11.4、应用@Autowired进行依赖注入
11.5、@ModelAttribute
12、拦截器
12.1、拦截器概述
SpringMVC 拦截器(Interceptor )与 Java Servlet 的过滤器( Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。
12.1.1、拦截器的定义
12.1.2、拦截器的配置
spring MVC配置文件中配置拦截器:
12.2、拦截器的执行流程
12.2.1、单个拦截器的执行流程
12.2.2、多个拦截器的执行流程
13、ssm框架整合
- 导入依赖
- 创建信息输入页面
- 创建持久化类
- 创建DAO层,可以加上@Mapper完成自动装配Mybatis映射
- 创建Service层,可以加上@Transactional事务管理
- 创建Controller层
- 创建用户信息显示页面
- 创建web.xml配置文件
- 创建springmvc-servlet.xml配置文件
- 创建spring中的applicationContext.xml配置文件
- 创建MyBatis中的核心配置文件和SQL映射文件
- 发布并运行。
14、Spring高级话题
注解:
声明Bean的注解:
@Component组件,没有明确的角色
@Service在业务逻辑层使用
@Reppository在数据访问层使用
@Controller在控制层使用
注入Bean的注解,一般情况下通用:
@Autowired:Spring提供的注解,将一个类的实体Bean注入到另一个类中,让另一个类具有当前类的功能
@Inject:JSR-330提供的注解
@Resource:JSR-250提供的追
@Quitifier:和@Autowired一起使用
配置类注解:
@Configuration:声明当前类是一个配置类
@ComponentScan:自动扫描报名下所有使用@Repository,@Service,@Controller,@Component的类,并注册为Bean。
@Bean:注解在方法上,声明当前方法的返回值是一个Bean。
@EnableAspectJAutoProxy:开启Spring中对AspectJ代理的支持。
@PropertySource:指定文件地址
@Value("I Love You"):注入普通字符串
@Value("#{systemProperties{'os.name'}}"):注入操作系统属性
@Value("#{T(java.lang.Math).random()*100.0}"):注入表达式结果
@Value("#{demoService.another}"):注入其它Bean属性
@Value("classpath:com/wisely/highlight_spring4/ch2/el/test.txt"):注入文件资源
@Value("http://www.baidu.com"):注入网址资源
@Value("${book.name}"):注入配置文件
@EnableAsync:开启异步任务支持
切面注解:
@Aspect:声明一个切面
@After:定义建言,可直接将拦截规则(切点)作为参数。
@Before
@Around:
@PointCut:声明切点
事务处理:
@Transcational
数据缓存:
@Cacheable
Spring常用配置:
@Scope:描述的是Spring容器如何新建Bean的实例的。
@Scope("Singleton"):一个Spring容器只有一个Bean实例,为Spring的默认配置,全容器共享一个实例
@Scope("Prototype"):每次调用新建一个Bean实例
@Scope("Request"):Web项目中,给每一个Http request新建一个Bean实例
@Scope("Session"):Web项目中,给每一个Http session新建一个Bean实例
异步注解:
@Async:表明该方法是一个异步方法,如果在类上面使用这个注解,表明这个类下面的所有方法都是异步方法。
14.1、Spring Aware
14.2、多线程
14.3、计划任务
14.4、条件注解@Conditional
14.5、组合注解与元注解
使用@WiselyConfiguration组合注解代替@Configuration和@ComponentScan
14.6、@Enable* 注解的工作原理
3.7、测试
15、SpringBoot 基础
15.1、概述
15.2、Spring Boot 核心功能
-
独立运行的Spring项目
可以以jar包的形式队里运行,运行一个SpringBoot项目只需要通过java -jar xxx.jar来运行。
-
内嵌 Servlet容器
SpringBoot可以选择内嵌Tomcat,Jetty或者Undertow,这样我们无需以war包形式部署项目
-
提供starter简化Maven配置
spring提供一系列的starter pom来简化Maven的依赖加载
-
自动配置Spring
springBoot会根据类路径中的jar包,类,为jar包里的类自动配置Bean,这样会极大地减少我们要使用的配置。
-
准生产的应用监控
基于http,ssh,telnet对运行时的项目进行监控
-
无代码生成和xml配置