spring源码
@Transactional [trænˈzækʃən(ə)l]
@transactional 的使用
1、一般在service里加@Transactional注解,不建议在接口上添加
2、加了此注解后每个业务方法执行时,都会开启一个事务,不过都是按照相同的管理机制。
3、@Transactional注解只能应用到public修饰符上,其它修饰符不起作用,但不报错。
4、默认情况下此注解会对unchecked[ʌnˈtʃekt]异常进行回滚,对checked异常不回滚。
检查@Transactional不回滚解决方案
1,检查方法是不是public
2,检查异常是不是unchecked异常
3,如果是checked异常也想回滚的话,注解上写明异常类型即可@Transactional(rollbackFor=Exception.class)
什么是ioc
ioc控制反转,ioc是一个技术思想,spring框架实现了ioc而已。
举个列子:
没有ioc容器的情况下:有3个类,分别是主类、a类、b类,a依赖b,在a中new B();,在主类中有要去new a();
有ioc容器的情况下:ioc容器实例化对象并存储起来,用哪个对象的时候问IOC容器要就好了。
控制:指的是对象(实例化、管理)的创建的权力
反转:控制权交给了spring框架、ioc容器
IOC解决了什么
对象于对象之间的耦合问题
IOC和DI的区别:
IOC和DI其实描述的是同一件事情(描述对象实例化及依赖关系维护),只不过是角度不同。
IOC是站在对象的角度,把对象实例化以及管理的权力交给了(反转)容器;
DI是站在容器的角度,容器会把对象依赖的其他对象注入;
DI概念出现在IOC之后
什么是AOP
那说要说一下oop,因为oop解决不了父类中发法相同位置出现的重复代码块(横切逻辑代码);
在多个纵向(顺序)流程中出现的相同子流程代码块中我们称之为横切逻辑代码。
横切逻辑代码的使用场景很有限:一般用做事务控制、权限校验、日志。
横切逻辑代码重复问题、与业务逻辑代码混杂在一起,代码臃肿,维护不方便。
于是AOP就这么出现,AOP提出横向抽取机制,将横切逻辑代码和业务逻辑代码拆分出来,在不改变原有业务逻辑的情况下,把横切逻辑代码应⽤到原有的业务逻辑中,达到和原来⼀样的效果。
AOP在解决什么问题
在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。
为什么叫做面向切面编程
切:指的是横切逻辑,原有业务逻辑代码我们不能动,只能操作横切逻辑代码,所以⾯向横切逻辑
面:横切逻辑代码往往要影响的是很多个方法,每一个方法都如同⼀个点,多个点构成面,有一个
面的概念在里面
(ps:明天手写一个简单实现 IoC 和 AOP例子有于消化理解IOC和AOP思想,文章格式明天中午调一下,欢迎关注我,带你一起学习spring源码)