1.引出AOP
Spring框架的AOP是面向切面编程的思想,也是一种责任分离的思想,AOP思想的最大优势就是把业务代码和其他需要加在业务上的代码完全分离.
例如所有的业务方法在涉及到数据库数据的增删改这样的对数据库的数据有修改时,我需要给业务方法加上事务控制
如上图所示,我有A,B,C三个业务类,对应的三个业务方法方法名分别是 A,B,C,这三个业务方法都涉及对数据库数据的修改,我要给三个方法都加上事务控制,如果用OOP的思想,可以采用继承,或者组合的方式,给业务方法,加上事务控制,但是业务代码中,总会插入继承来的方法,或者是组合来的方法还是给业务代码中,插入其他代码段,那么AOP面向切面编程思想就解决了这个问题,
首先有一个Spring AOP官方文档的的链接https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#aop
现在需求就变成了:我需要对涉及到数据库数据更新操作的业务代码中,加上事务控制,并且不修改业务代码.
几个AOP中比较重要的概念:
Joinpoint:切入点,表示需要加上事务控制的业务代码
Pointcut:多个需要加上事务控制的业务代码(WHERE)
advice:在业务代码方法执行的什么时机上(WHEN)做什么样的增强(WHAT)
aspect(切面) = Pointcut + advice
其实总结起来,就是在指定业务类的业务方法执行的什么时机做什么样的增强WHERE + WHEN + WHAT
2.开发工具:Eclipse
jar包:Spring-core,Spring-context,Spring-expression,Spring-beans,Spring-aop,aspectjweaver,Spring-test,commons-logging
Spring版本5.1.0
2.1 新建一个Java项目:File --> new --> Java project
2.2 在项目下新建一个文件夹,取名为lib,然后将上述jar包拷贝至lib下,然后选中所有的jar包,右键build path
2.3.以mvc模式分包,DAO模块,Service模块,domain包,项目结构如下
IUserDAO类:
UserDAOImpl类:
IUserService:
UserServiceImpl:
domain类:
模拟的事务管理器类TransactionManager
Spring容器:App-context.xml
2.4.创建测试类,App,并和Spring测试集成,Junit5.x,测试一下保存的业务功能.目前还没有加上AOP的配置..
测试更新操作
我要在不动业务代码的情况下更新和新增的业务代码上加上事务控制,
再看我的业务代码,依然没有动过,
运行,测试方法中的,保存操作,
在保存操作之前输出了开启事务,保存操作保存成功(是业务代码)输出之后,然后提交事务