Spring:
Spring:
Spring是一个一站式 企业级开发框架,是跨软件三层架构的,主要由IOC和Aop两大部分组成。
IOC:
1).定义:全称Inverse Of Controller:控制反转,
指的是将bean对象的创建和对象之间关联关系的维护由原来我们自己创建和自己维护反转给了spring的容器来创建对象和维护对象之间的关联关系。
2).作用:解决了上层建筑严重依赖下层建筑的问题,实现了上层建筑对下层建筑的控制。
3)实现方式:
IOC是一种思想,DI是IOC的实现,DI:[Dependency Injection]依赖注入,解耦合思想,技术实现:xml解析技术+反射+Map容器。
AOP:
1).定义:全称Aspect Oreinted Programming:面向切面编程 ,和OOP是相互促进、相互补充。
2).作用:指的是在不改变原有类方法的基础上对类的原有方法进行功能性扩展,实现高内聚、低耦合
3).实现方式:
代理:
动态代理: 被代理类实现了接口
CGLIB代理:被代理类没有实现了接口
获取Spring容器的三种方式:
1.在类路径下寻找配置文件来实例化容器:ClassPathXmlApplicationContext
2.在文件系统路径下寻找配置文件来实例化容器:FileSystemXmlApplicationContext
3.使用BeanFactory:XmlBeanFactory
Bean标签:生成类对象
class:指定生成类对象的类,根据这个类,生成该类的对象
id:indntifier,表示该bean对象在Spring的核心容器中的唯一标识
name:bean对象的别名,该值也是唯一的
Spring的容器是通过反射,调用无参构造器创建类对象的
容器中的bean对象默认是在我们创建容器对象的时候就已经创建了,注意:不是在获取该bean对象的时候才创建
bean对象的创建次数:一次,默认容器中的对象都是单例的
bean对象的scope属性:可以指定当前类对象是单例还是多例的
singleton:表示该类对象是单例的,是随着容器的创建而创建
prototype:表示该类对象是多例的,获取几次就创建几次
request:表示每一次请求都会创建一个当前类对象
session:表示每一个会话都会创建一个当前类对象
从核心容器中取出bean对象的两种方式:
1.根据bean的类型获取
2.根据bean的id值或者name值获取
bean对象的生命周期
指的是bean对象有产生到销毁的过程:
bean标签的init-method、destroy-method属性来指定
分模块配置:
通过import标签导入其他配置文件信息<import resources="mybatisConfig.xml">
bean对象之间的依赖
bean标签对的depends-on属性
bean对象的继承
bean标签的parent属性、abstract属性定义抽象bean
引用内部bean和外部bean
创建对象的三种方式:
1.无参构造器、有参构造器
2.静态工厂:StaticFactory
3.实例工厂:InstanceFactory
Bean的属性赋值的三种方式:
属性赋值按着属性类型划分:1.值注入2.引用数据类型注入
属性赋值按着赋值方式划分:1.set方式、2.构造器、3.p名称空间【底层set方法】
spel:
语法:spel使用#{...}作为定界符,所有在大括号中的字符都将被认定为spel表达式
手动装配与自动装配:
自动装配的概念:
1.手动装配:以value或ref的方式明确指定属性值都是手动装配
2.自动装配:根据指定的装配规则,不需要明确指定,Spring自动将匹配的属性值注入bean中
自动装配【设置bean标签的autowired属性】:
基于xml配置的方式:
1.根据类型自动装配:将匹配的bean作为属性注入到另一个bean中,若ioc容器中有多个与目标bean一致的bean
2.Spring将无法判定哪个bean最合适该属性,所以不能执行自动装配
根据名称自动装配:必须将目标bean的名称和属性名设置的完全相同
基于注解的自动配置:Autowireds
AOP
软件工程有个基本的概念,关注点分离【Separation of Concerns】:
不同的问题交给不同的部分去解决,每部分专注于解决自己的问题
面向切面编程AOP正式此技术的实现
写业务代码的时候还要写事务管理、缓存、日志等等通用化的功能,而且这些通用化功能和这些业务逻辑混在一起,
所以为了将业务逻辑功能的关注点和这些通用化的功能的关注点分离开来,就出现了AOP的技术
通用化功能代码的实现,对应的就是所谓的切面【Aspect】
业务代码和通用功能代码分离之后,责任明确,架构就能变得高内聚低耦合
AOP和OOP的区别:
可以理解:Aop和OOP是相互补充、相互增强的组合!Aop是在不改变原有OOp类的代码的前提下,对原有类的原有方法进行的一种拓展
AOP重要概念:
连接点:目标对象中,可以被拓展的代码【方法】
切入点:目标方法中,已经被拓展的方法
目标对象:被拓展的类对象
通知:拓展的方法
织入:就是讲通知应用到目标对象的过程
切面:通知+连接点
Aop底层原理:
动态代理:要求被代理类和代理类都要实现相同的接口:被代理类和代理类之间是兄弟关系,他们都实现了相同的接口,
所以可以使用父接口获取代理类对象,或者被代理类的类名首字母小写来获取代理类对象
CGLIB代理:不要求被代理类和代理类都要实现相同的接口:被代理类和代理类之间是父子关系,代理类继承被代理类
Spring的五种通知:
前置通知:@Before: 在目标方法执行之前执行
后置通知: @After:无论目标方法 是否正常执行,后置通知都会执行
返回通知: @AfterReturing:目标方法正常执行之后,返回通知才会被执行
异常通知: @AfterThrowing:当出现异常时,异常通知才会被执行
环绕通知:@Around:相当于以上四种通知
底层结构:try...catch 嵌套 try...final 结构
切入点表达式:
作用:通过表达式的范式定位一个或多个具体的连接点
语法格式:execution([权限修饰符][返回值类型][简单类名/全类名][方法名]([参数列表]))
最简洁(最模糊):
最复杂(最精确):
切入点表达式的重用:
切面类中获取目标对象的信息:
前置通知中获取方法名,参数信息[连接点]
返回通知获取结果,异常通知获取异常信息
AOP与实务的关系
前置通知相当于setAutoCommit(false)
返回通知相当于commit
异常通知相当于rollback
多Aop情况下的执行顺序:
双层try..catch()中嵌套双层try...catch()
try{
try{
前置通知
目标方法
}finally{
后置通知
}
后置通知
}catch(Exception exception){
异常通知
}
多AOP情况下的优先级问题
通过order注解完成,order值越小,优先级越高
AOP的使用:
如:给controller层的所有方法都记录一个请求日志的功能,即,记录请求的时间、
url、ip及访问协议,当然也要将controller层方法的返回值记录下来
JavaWeb事务:
四个特性:
原子性:操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,
所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态
一致性:事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定
隔离性:隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,
不能被其他事务的操作所干扰,多个并发事务之间要相互隔离
持久性:当事务正确完成后,它对于数据的改变是永久性的
Spring的声明式事务:
传播机制[Propagation]:当事务被另一个事务方法调用时,必须指定事务应该如何传播
REQUIRED:如果有事务在运行,当前的方法在这个事务中运行,否则,就开启新的事务,并在自己的事务中运行
REQUIRES_NEW:当前方法必须启动新的事务,并在他自己的事务中运行,如果有事务在运行,应该将它挂起
SUPPORTS:如果有事务在运行,当前的方法就在此事务中运行,否则它可以不运行在事务中
NOT_SUPPORTED:当前的方法不应该运行在事务中,如果有运行的事务,应该将它挂起
MANDATORY:当前的方法必须运行在事务内,如果没有正在运行的事务,就抛出异常
NEVER:当前的方法不应该运行在事务内,如果有运行的事务,就抛出异常
NESTED:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,
就启动一个新的事务,并在它自己的事务内运行
隔离级别[isolation]:设置事务的并发级别,此设置级别会传递给底层数据库
READ_COMMITTED:读已提交,oracle默认值
REPEATABLE_READ:可重复读,mysql默认值
SERIALIZABLE:串行化,不允许并发时使用
read_uncommitted:读未提交
超时属性[timeout]:防止某个事务过长时间占用数据库资源,一旦达到某个时间还未完成,将回滚事务、撤销操作
只读属性[ReadOnly]:表示事务只读取数据但不更新数据,可以加快响应速度
回滚属性[RollBackFor]:事务的默认回滚规则时回滚RuntimeException异常类,当遇到非RuntimeException,默认是不回滚的,
可以通过设置该属性,实现非RuntimeException异常信息的回滚