Spring核心主要两部分
(1)AOP: 面向切面编程,横向扩展功能,不改动原有代码。
(2)IOC: 控制反转。
Spring是一站式框架,在JavaEE三层结构中,每一层都提供不同的解决技术
web层:SpringMVC
service层:Spring的ioc
dao层:Spring的jdbcTemplate
1.把对象的创建交给Spring进行管理
2.ioc 操作两部分:
(1)ioc的配置文件方式
(2)ioc 的注解方式
1.ioc底层原理使用技术
(1)XML
(2)dom4j解决XML
(3)工厂设计模式
(4)反射
2.画图分析IOC原理
New→工厂模式解耦→ioc
IOC入门案例
第一步 导入jar包
做spring最基本功能的时候,只需要导入4个核心jar包就可以了,导入支持日志输出的jar包
第二步 创建类,在类里面创建方法
第三步 创建Spring配置文件,配置创建类
(1)Spring 核心配置文件名称和位置不是固定的
建议放到src下面,官方建议applicationContext.xml
(2)引入schema约束
(3)配置对象
第四步 写代码测试对象创建
这段代码在测试中使用
在spring里面通过配置文件创建对象
bean实例化三种方式实现
第一种 使用类的无参数构造创建(重点)
类里面没有无参的构造方法,出现异常
第二种 使用静态工厂创建
创建静态的方法,返回类对象
第三种 使用实例工厂创建
创建不是静态的方法,返回类的对象
(1)Id属性: 起名称,id属性值任意命名
id的属性值,不能包含特殊符号
根据id值得到配置对象
(2)Class属性: 创建对象所在类的全路径
(3)Name属性: 功能和id属性一样的,id的属性值不能包含特殊符号,但是在name属性值里面可以包含特殊符号(不用了)
(4)Scope属性: Bean的作用范围
singleton默认值,单例
prototype 多例的
request创建对象把对象放到request域中
session 创建对象把对象放到session域中
globalSession 创建对象把对象放到globalSession域中
1.创建对象时候,向类里面属性里面设置值
2.属性注入的方式介绍(三种方式)
在spring框架里面,支持前两种方式
创建service类和dao类具体实现过程
(1)在service里面把dao作为类型属性
(2)生成dao类型属性的set方法
(3)配置文件中注入关系
(1)IOC:控制反转,把对象创建交给Spring进行配置
(2)DI:依赖注入,向类里面的属性中设置值
(3)关系:IoC主要的实现方式有两种:依赖查找,依赖注入。依赖注入不能单独存在,需要ioc基础之上完成操作,它们是spring核心思想的不同方面的描述。
在服务器启动时候,为每个项目创建一个ServletContext对象
在ServletContext对象创建时候,使用监听器可以具体到ServletContext对象在什么时候创建
使用监听器听到ServletContext对象创建时候,
加载Spring配置文件,把配置文件配置对象创建
把创建出来的对象放到ServletContext域对象里面(setAttribute方法)
获取对象时候,到ServletContext域得到(getAttribute方法)
(1)导入基本jar包
(2)导入aop的jar包
(1)第一次项目做ioc基本功能引入的约束是beans
(2)做spring的ioc注解开发,引入新的约束
在创建对象的类上面使用注解实现
创建对象有四个注释
@Component:组件
@Controller:web层
@Service:业务层
@Repository:持久层
这四个注解功能是一样的,都创建对象,后续版本做扩展
创建对象单实例还是多实例
创建service类,创建dao类,在service得到到对象
(1)创建dao和service类
(2)在service类里面定义dao类型属性
spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
AOP:面向切面(方面)编程,在不修改原本业务的前提下对方法进行增强
AOP采取横行抽取机制,取代了传统纵向继承体系重复性代码
画图分析原理
(Springboot2.X默认使用gclib模式,Springboot官方他们认为使用cglib更不容易出现转换错误)
Joinpoint(连接点): 类里面那些方法可以被增强,这些方法称为连接点,因为spring只支持方法类型的连接点。如:类开始初始化前、类初始化后、类的某个方法调用前、类的某个方法调用后、方法抛出异常后等。
Pointcut(切入点): 切点是指我们要对那些Joinpoint进行拦截,切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。
Advice(通知/增强): 所谓通知是只拦截到Joinpoint 之后所要做的事情就是通知,通知分为
前置通知(Before)后置通知(After)返回通知(After-returning) 异常通知(After-throwing)环绕通知(Around)
Aspect(切面): 是切入点和通知(引介)的结合
Introduction(引介): 引介是一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态的添加一些方法或Field
Target(目标对象): 代理的目标对象(要增强的类)
Weaving(织入): 是把增强应用到目标的过程。把advice应用到target的过程
Proxy(代理): 一个类被AOP织入增强后,就产生一个结果代理类
(1)aspectj不是Spring一部分,和Spring一起使用进行aop操作
(2)Spring2.0以后新增了对AspectJ支持
(1)基于aspectj的xml配置
(2)基于aspectj的注解方式
aspectjweaver-1.8.13.jar文件在IDEA创建Spring项目中,没有,需要自己导入
Execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
(1)execution(*xyz.hcworld.aop.Book.add(..)) 代表可以是public或protected或private
(2)execution(*xyz.hcworld.aop.Book.*(..)) 对所有方法
(3)execution(**.*(..))全部类的全部方法
(4)execution(*save*(..)) 匹配所有save开头的方法
3. 通配符 *代表所有
(1)导入log4j的jar包
(2)负责log4j的配置文件复制到src下面
(1)info:看到基本信息
(2)debug:可以看到更详细信息。
第一步创建对象
第二步在Spring核心配置文件中,开启AOP
第三步在增强类上面使用注解完成AOP操作
事务包含一个或多个业务操作,这些操作要么都执行,要么都不执行。事务常被用来确保数据的一致性。
1. 原子性 (atomicity):强调事务的不可分割.
2. 一致性 (consistency):事务的执行的前后数据的完整性保持一致.
3. 隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰
4. 持久性(durability) :事务一旦结束,数据就持久到数据库
1. 脏读 :一个事务读到了另一个事务的未提交的数据
2. 不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致.
3. 虚(幻)读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致.
DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
1. 未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生
2. 已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生
3. 可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.
4. 串行化的 (serializable):避免以上所有读问题.
Mysql 默认:可重复读
Oracle 默认:读已提交
第一种 编程式事务管理(一般不用)
第二种 声明式事务管理(主要)
(1)基于xml配置文件实现
(2)基于注解实现
主要三个接口
PlatformTransactionManager
事务管理器
(1)spring针对不同的dao层框架,提供接口不同的实现类
org.springframework.jdbc.datasource.DataSourceTransactionManager
使用SpringJDBC或Mybatis进行持久化数据时使用
org.springframework.orm.hibernate5.HibernateTransactionManager
使用Hibernate5.0版本进行持久化数据时使用
(2)配置事务管理器
(1)service层又叫业务逻辑层
(2)dao层,单纯对数据库操作层,在dao层不添加业务
(3)需求:小王转账1000给小马
第一步 配置事物管理器
第二步 配置事务的增强
第三步配置切面
第一步 配置事务管理器
第二步 配置事务注解
第三步在使用事务的方法所在类上添加注解