Spring是什么?
Spring是轻量级 Java 开发框架,支持IoC(Inversion of Control:控制反转) 和 AOP(Aspect-Oriented Programming,核心思想是达到开箱即用,整合了各种技术模块,不需要重复造轮子。
Spring框架架构
- 核心容器
- AOP,Aspects 面向切面编程
- 数据访问/集成
- 事务
- Spring Web
- Spring test
IOC
什么是IOC?
IOC(控制反转):意思在程序中不主动new对象,转换为外部主动提供对象,将对象创建控制权由程序转移到外部这种思想叫控制反转。
IOC实现方法
- Spring提供一个IOC容器(外部)来管理对象的创建与初始化。
- 容器中的对象统称为Bean。
DI(依赖注入)
- 在容器中建立bean和bean之间的依赖关系。如下图中的service运行依赖Dao方法,则会一起生成相关bean。
使用IOC和DI的目的?
- 对代码充分解耦,由外部来生成对应的bean,并调用相对的方法
- 使用对象时直接从IOC容器中获取bean,并且绑定了相对应的依赖关系
Spring中Bean 的三种实例化方式(默认单例模式)
- 利用反射调用无参构造器创造对象
- 使用静态工厂实例化bean
- 使用实例工程实例化bean
- 使用FactoryBean<T> 来实例化bean(实用)
Bean的生命周期
-
初始化容器
- 创建对象(内存分配)
- 执行构造器
- 执行属性注入
- 执行bean的初始化方法
-
使用bean
- 干活,执行业务
-
关闭容器/销毁容器
- 执行bean的销毁方法(容器关闭前)
bean生命周期的控制
-
xml配置
- init-method(在bean中自定义的方法)
- destroy-method(在bean中自定义的方法)
-
bean接口(重写对应的方法)
- InitializingBean
- DisposableBean
-
关闭容器
- close()暴力关闭不推荐
- registerShutdownHook 温柔关闭
bean中的属性注入方法(使用xml)
-
setter注入
- bean中要提供set方法
- bean中要提供set方法
-
构造器注入
- bean中提供对应构造器
- bean中提供对应构造器
-
自动装配
- bean中要提供set方法
- bean中要提供set方法
-
集合注入
-
bean中要提供set方法
-
例子:管理第三方bean的druid数据源![](https://i-blog.csdnimg.cn/blog_migrate/7562c0cb9f2e793dbb3ba7d2b3112004.png)
创建IOC容器
获取bean
容器类层次结构
Bean注解开发模式(重点)
- Spring3.0开启了纯注解开发模式,利用Java类代替了核心xml文档。
- 容器对象的获取也变为AnnotationConfigApplicationContext类
申明一个类为Bean的注解
@Bean 主要是引用第三方类库中的类引用到Spring使用的,主要用于方法的返回实例,如druid数据源导入
申明一个类为核心文档类 @Configuration
bean生命周期的注解
- @PostConstruct(实例化后)
- @PreDestory(销毁前)
依赖注入注解
- @Autoware 的注入方式默认时by type,底层应用了反射,因此bean中不用提供set方法了
- @Qualifier 当该接口有多个实现类的时候可以使用by name注入。
- @value(${ })可以对简单类型值进行注入,配合@PorpertyRsource({“文件名”})使用
xml和注解模式总结
Spring Aop(面向切面编程)
Aop:面向切面编程,在不惊动代码原始基础功能的条件下,对其追加额外的功能。
应用场景:对方法传入的参数格式进行验证加修改,注解开发的底层就是AOP原理
Aop的核心概念
- 连接点:程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等
- 在Spring aop 中为方法的执行
- 切入点:匹配连接点的位置
- 在Spring Aop 中一个切入点可以描述为一个具体的方法或者匹配多个方法
- 通知:在切入点执行的操作,也就是共性功能,主要以方法的形式呈现
- 通知类:定义通知方法的类
- 切面:描述通知与切入点的对应关系
Aop应用的相关注解
- @Aspect 声明该类为通知类,需要启用Aop
- @Pointcut(“execution(void 连接点方法)”) 绑定该连接点为切人点,定义一个切入点方法
- 切入点正则表达式
- 切入点正则表达式
-
@EnableAspectJAutoProxy 申明要进行Aop注解开发,调用@Aspect的类作用
- @Before(前置通知):目标对象的方法调用之前触发
- @After (后置通知):目标对象的方法调用之后触发
- @AfterReturning(返回通知):目标对象的方法调用完成,在返回结果值之后触发
- @AfterThrowing(异常通知) :目标对象的方法运行中抛出 / 触发异常后触发。AfterReturning 和 AfterThrowing 两者互斥。如果方法调用成功无异常,则会有返回值;如果方法抛出了异常,则不会有返回值。
- @Around (环绕通知):编程式控制目标对象的方法调用。环绕通知是所有通知类型中可操作范围最大的一种,因为它可以直接拿到目标对象,以及要执行的方法,所以环绕通知可以任意的在目标对象的方法调用前后搞事,甚至不调用目标对象的方法
相关依赖
Aop的工作流程(代理模式)
Spring 事务
Spring中事务的开启流程
1.给需要开启事务的类或者接口、方法前添加注解@Transactional 开启事务
2.根据不同数据源的平台设置对应的事务管理器
Spring中提供的管理事务的接口:PlatformTransactionManager
PlatformTransactionManager接口中的三个方法
不同的平台对PlatformTransactionManager接口有不同的事务管理器实现类,如:JDBC(DataSourceTransactionManager
)、Hibernate(HibernateTransactionManager
),、JPA(JpaTransactionManager
)
例子:在JDBC配置类中增加JDBC的事务管理器
3.在Spring的配置文件中添加注解@EnableTransactionManagement开启注解式事务驱动,类似Aop注解的启动。
事务的相关属性
事务的传播行为
通过枚举类Propagation来使用开启,在注解@Transactional中定义传播行为,例如:
@Transactional(propagation = Propagation.REQUIRED)
SpringMVC
SpringMVC技术与Servlet技术功能相同,均属于web层开发技术,是一种表现层的框架技术
使用步骤一共四步
1.导入坐标
2.创建SpringMVC控制器(Controller类)
3.初始化MVC环境,类似Spring环境
4.初始化web容器,加载MVC配置类到容器,再设置拦截器
MVC中数据请求与接受的相关注解
@RequestMapping:用于拦截指定的url的请求
@Enablewebmvc:功能强大,可以将json数据自动转换类型
@RequestBody:用于接受json数据,一般在post请求中接受数据
@RequestParam:用于接受url地址传参数,一般在get请求中接收参数
@ResponseBody:用于返回json数据,如果不加则默认返回url字符串(进行页面跳转)。
@DateTimeFormat(pattern = “xxx--xx--x”):接受时间类型参数
Rest风格
Rest是一种资源访问的风格,不是规范,是大伙儿一起默认的规则。
Rest优点
- 书写简化
- 隐藏了资源的访问行为,无法通过url判断行为
Rest相关注解(Spring提供)
@RestController:设置为RESTful风格,替代了@Controller和@ResponseBody两个注解
@Get/Put/Update/Delete Map:代替了@RequestMapping
SSM整合(Spring + SpringMVC + Mybatis)
- 要熟悉每个注解的作用以及对应的模块。SSM一共两个容器,Spring和SpringMVC。
- Mybatis和Jdbc为第三方库类,需要用@Bean和Import导入Spring容器中
-
Spring
-
SpringConfig (第三方的bean要通过import导入类文件)
-
-
SpringMVC
-
SpringMVCConfig
-
ServletConfig
-
-
Mybatis
-
JdbcConfig
-
MybatisConfig
-
jdbc.properties
-
事务的处理
-
全局异常处理
-
自定义异常类
-
业务异常(BusinessException)
-
系统异常(SystemException)
-
-
自定义异常编码
-
在需要的地方设置异常触发throw抛出异常,最好使用Aop进行设置
-
全局异常处理类拦截并处理异常
SpringMVC拦截器和过滤器
拦截器与过滤器的区别
- 归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
- 拦截内容不同:Filter对于所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强
- MVC的访问在MVC容器初始化的时候配置的,如例子,就是访问所有路径。
- 拦截器拦截的是controller的请求,filter拦截的包括html、js等静态请求的所有请求
拦截器设置步骤
-
在Controller层创建一个拦截器功能类,对方法进行增强,继承接口HandlerInterceptor
-
定义一个配置类继承WebMvcConfigurationSupport,或者直接在MvcConfig中实现WebMvcConfigurer接口,然后实现addInterceptor方法。
SpringBoot整合SSM
- pom.xml文件配置必要的起步依赖(webmcv、jdbc、mabatis),和必要的资源坐标(druid)
- application.yaml文件中配置数据源、端口等信息
- 配置类(全部删除)最大的便利之处!!简化Spring配置
- dao设置@Mapper
- 测试类
- 页面放在static目录下,优化了原本MvcSupportConfig中的添加静态资源拦截器的步骤
SpringBoot应用中常见技术
分页(整合MybatisPuls环境下)
- 创建MP分页连接器
- new个IPage对象,调用分页查询的api