1、AOP思想
1.1 什么是AOP
Aspect oritention programming(面向切面编程),把一个个的横切关注点(这些零散存在于业务方法中的功能代码,我们称之为横切面关注点)放到某个模块中去,称之为切面。那么每一个的切面都能影响业务的某一种功能,切面的目的就是功能增强,如日志切面就是一个横切关注点,应用中许多方法需要做日志记录的只需要插入日志的切面即可。这种面向切面编程的思想就是AOP思想了。
1.2 AOP的功能
AOP能够将那些与Service业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
1.3 AOP当中的概念
Joinpoint:连接点,被拦截到需要被增强的方法。where:去哪里做增强
Pointcut:切入点,哪些包中的哪些类中的哪些方法,可认为是连接点的集合。where:去哪些地方做增强
Advice:增强,当拦截到Joinpoint之后,在方法执行的什么时机(when)做什么样(what)的增强。
Aspect:切面,Pointcut+Advice,去哪些地方+在什么时候+做什么增强
Weaving:织入,把Advice加到Target上之后,创建出Proxy对象的过程。
注意:
Spring的AOP使用动态代理实现:
如果一个类实现了接口,那么spring就使用JDK的动态代理完成AOP;
如果一个类没有实现接口,那么spring就是用cglib完成AOP;
1.4 Pointcut语法:
切入点一般指业务类
- AspectJ切入点语法如下:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?) - 翻译成中文:
execution(<访问修饰符>? <返回类型> <声明类型>? <方法名>(<参数>) <异常>?) - 举例:public static Class java.lang.Class.forName(String className)throws ClassNotFoundException
- 通配符:
*:匹配任何部分,只能表示一个单词
… 可用于全限定名中和方法参数中,分别表示子包和0到N个参数
1.4 AOP实现方式
(1)xml编程实现
(2)注解实现
2、xml编程实现
(1)创建Service层和Dao层
定义好业务层和dao代码
public class UserServiceImpl implements IUserService {
@Setter
private IUserDao dao;
@Override
public void save() {
dao.save();
}
@Override
public void update() {
dao.update();
}
}
(2)创建事务类
获取增强函数
JoinPoint :提供访问当前被增强方法的真实对象、代理对象、方法参数等数据。
ProceedingJoinPoint:JinPoint子类,只用于环绕增强中,可以处理被增强方法。
public class BusManager {
public void begin(JoinPoint jp){
System.out.println("开启事务...");
/*JoinPoint