Spring(Spring Framework) 是一个开源框架,致力于全方位的简化Java开发,降低程序的耦合度
IOC:控制反转, 将 new 的过程交给spring容器去处理。IoC是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式之一是DI。(@Component组件注解,用于修饰一个类,普通属性使用 @Value,对象属性使用 @Autowired)
DI:依赖注入是指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是由外部容器创建后传递给程序。依赖注入是目前最优秀的解耦方式。
AOP: 即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。动态代理,在代码执行过程中,动态嵌入其他代码,常见的使用场景:
i :日志
ii: 事务
iii:数据库操作
动态代理:在业务中使用动态代理(JDK、CGLIB),一般是为了给需要实现的方法添加预处理或者添加后续操作,但是不干预实现类的正常业务,把一些基本业务和主要的业务逻辑分离。如加事务,加权限,加日志。
JDK 动态代理只能对实现了接口的类产生代理,代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性。
JDK通过proxy类的newProxyInstance方法创建代理对象,其参数 ClassLoader(类加载器,加载被代理对象字节码),class[](字节码数组,让代理对象和被代理对象拥有相同的方法),InvocationHandler(用于提供增强的方法)
Cglib 动态代理可以对没有实现接口的类产生代理对象,对指定的类生成一个子类,所以该类(被代理的类)或方法不能声明final。
通过Enhancer类中的create方法创建代理对象,其参数 class(被指定代理对象的字节码) , InvocationHandler(用于提供增强的方法)
spring中事务失效场景,其中一种,在同一个类中相互调用,由于spring是通过AOP 代理对象管理事务,同类中方法调用是this.XXX,故失效;
不考虑事物隔离性导致的问题:
-
读问题:
1)脏读:B事务读取到了A事务尚未提交的数据 ------ 要求B事务要读取A事 务提交的数据
2)不可重复读:一个事务中 两次读取的数据的内容不一致 ----- 要求的是一个事 务中多次读取时数据是一致的 — unpdate
3)幻读/虚读:一个事务中 两次读取的数据的数量不一致 ----- 要求在一个事务多 次读取的数据的数量是一致的 — insert delete
-
写问题: 丢失更新
具有四个特性(事务要么全部成功,要么全部失败,事务就是用户定义的一系列数据库操作,并视为一个完整逻辑的处理单元):
-
原子性:事务不可分
-
一致性:事务执行前后数据完整性保持一致
-
隔离性:一个事务的执行不应该受到其他事务干扰
-
持久性:一旦事务结束,数据就持久化到数据库
解决读问题:设置事务隔离级别
-
Read uncommitted: 未提交读,无法解决任何读问题
-
Read committed: 已提交读,解决脏读问题 —— oracle默认的
-
Repeatable read: 重复读,解决脏读和不可重复读问题 —— mysql默认的
-
Serializable:序列化,解决所有读问题。但会大大影响系统的性能,一般不用。
spring中7种事务传播机制:(a执行过程中调用b,b是被调用者)
required:(spring默认传播类型): 如果当前 a 没有事务则自己 b 创建事务,如果当前存在事务则加入事务 (一起成功一起失败)
supports: 当前a存在事务则加入事务 ,则加入b事务;当前a没有事务,则以非事务方法执行(以调用方为主)
mandatory:当前a存在事务则加入事务;当前a不存在事务则抛出异常(调用方不存在事务则抛出异常)
requires_new:挂起当前事务,各执行各的,异常后各自回滚各自的(各自处理各自事务)
not_supported:被调用者b必须以非事务运行,如果当前a存在事务,则自己执行(被调用方必须以非事务方式运行)
never:不使用事务,如果当前a存在事务则抛出异常(不能存在事务,调用方存在事务则抛出异常)
nested:如果当前a事务存在,则自己b嵌套其中执行;当a回滚时,b跟着回滚;当b回滚时,a不一定回滚(a作为父事务可能会吃掉b的异常)
spring-mybatis.xml:
1、自动扫描路径 <context:component-scan>
2、引入数据库配置文件 <context:property-placeholder>
3、配置数据源连接池 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
4、集成mybatis <bean id="sqlSessionFacotry" class="org.mybatis.spring.SqlSessionFactoryBean">
5、 配置包扫描创建映射接口代理对象 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
6、配置事务管理器 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">