Spring5 学习笔记
1,简介
1.1,优点
Spring是一个开源的免费的框架(容器)
他是一个轻量级的,非入侵式的框架
控制反转(IOC),面向切面编程(AOP)
反转就是,程序本身不创建对象,从而只是被动地接收对象
而注入本来就是依赖Set方法来实现的
ioc就是由主动的编程变成被动的接收
或者我们可以说ioc就是对象又Spring来创建管理,装配
支持事务的处理,对框架整合的支持
spring就是一个轻量级的控制反转,面向切面的框架
1.2,拓展
Spring Boot
一个快速开发的脚手架
基于Spring Boot可以快速的开发单个微服务
约定大于配置
Spring Cloud
是基于Spring Boot实现的
现在大多数公司都在使用SpringBoot,学习SpringBoot的前提是学习Spring和SpringMVC
2,ioc创建对象的方式
使用无参构造创建对象,默认
假设我们要使用有参构造创建对象
2.1,p命名空间注入
可以直接注入属性的值
3,自动装配
ByName的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的的属性的Set方法的一致
ByType是的时候,要保证所有bean的class的一致,
4,注解实现自动装配
导入约束(context约束)
配置注解的支持()
5,使用注解开发
在Spring4之后,要使用注解开发,必须保证aop的包已经导入了
使用注解需要导入context约束,增加注解的支持!
bean
属性如何注入
衍生的注解
自动装配
作用域
小结
要学会直接使用注解做到所有xml能做到的事情(配置类)
如果完全使用了配置类去做,我们就只能通过AnnotationConfig上下文来获取容器,通过配置类的class对象来加载!
这种纯Java的配置方式,在SpringBoot中随处可见。
6,使用java的方式去配置Spring
我们现在要完全不使用Spring的xml配置了,全权交给
javaConfig是Spring的一个子项目,在Spring4之后
7,代理模式
7,1,静态代理
7.2,动态代理
动态代理和静态代理的角色一样
动态代理的代理类是动态生成的,不是我们直接写好的
动态代理分为两大类:基于接口的动态代理,基于类的动态代理
基于接口---JDK动态代理(我们学习这个)
基于类:cglib
java字节码实现:javassist
需要了解两个类:Proxy(代理),InvocationHandler(调用处理程序)
动态代理的好处:
可以使真实角色的操作更加纯粹,不用去关注一些公共的业务
公共也就交给代理角色,实现了业务的分工
公共业务发证拓展的时候,方便集中管理
每一个动态代理类代理的是一个接口,一般就是对应的一类业务
一个动态代理可以代理多个类,只要是实现了同一个接口即可
8,AOP
8.1,什么是AOP
面向切面编程,通过预编译的方式和运行期动态代理的方式实现程序功能的统一维护的一种技术,AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使业务逻辑之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
8.2,AOP在Spring中的作用
提供声明式事务;允许用户自定义切面
横切关注点:跨越应用程序多个模块的方法或者功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志,安全,缓存,事务等等。。。。
切面:横切关注点被模块化的特殊对象。即,他是一个类。
通知:切面必须要完成的工作,即,他是类中的一个方法。
目标:被通知对象
代理:向目标对象应用通知之后创建的对象
切入点:切面通知执行的’地点‘的定义
连接点:与切入点匹配的执行点
8.3,使用Spring实现Aop
重点:需要 导入一个依赖包
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
方式一:使用Spring的API接口
方式二:自定义类来实现AOP(主要是切面定义)
方式三:使用注解实现
9,整合Mybatis
步骤:
导入相关jar包
junit
mybatis
mysql数据库
spring相关的
aop植入
mybatis-spring(新知识点)-----他是专门整合spring和mybatis
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.19.RELEASE</version>
</dependency>
<!--Spring操作数据库的话,还需要一个Spring-jdbc的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.2</version>
</dependency>
编写配置文件
测试
9.1,回忆mybatis
编写实体类
编写核心配置文件
编写接口
编写Mapper.xml
测试
9.1,Mybatis-spring
他会帮助你把Mybatis代码无缝的衔接到Spring中
允许Mybatis参与到Spring的事务管理中
创建映射器Mapper和sqlSession并注入到bean中
把mybatis的异常转化为spring的dataaccessexception
最终可以做到应用代码不依赖Mybatis,Spring或者Mybatis-Spring
10,声明式事务
1,回顾事务
把一组业务当成一个业务来做,要么都成功,要么都失败(我认为他的作用就是比如在支付这些重要的是场景,不能允许任何一个地方出现错误)
事务在项目开发中,十分的重要,涉及到数据的一致性问题,不能马虎
确保完整性和一致性
事务ACID原则:
原子性
一致性
隔离性
多个业务可能操作同一个资源,防止数据损坏
持久性
事务一旦提交,无论系统发生什么,结果都不会再被影响,被持久化的写到存储器当中
2,spring中的事务管理
声明式事务:AOP
编程式事务:需要改变原有的代码,然后进行事务的管理
思考:
为什么需要事务?
如果不配置事务,可能存在数据提交不一致的情况;
如果我们不在spring中配置声明式事务,我们就需要在代码中手动配置事务!
事务在项目的开发中十分的重要,涉及到数据的一致性和完整性,绝对不能马虎!