1.回调思路:
1.当接口A执行时,需要调用接口B中的add操作,这时程序会执行接口B中的操作,但是接口B中会引入接口A中的业务逻辑,所以程序再次回到接口A进行执行,最终将结果放回。
2.AOP高级:
1.问题:什么处理使用AOP
说明:
AOP的使用是在整个系统之上的,使用了AOP的操作,可以对原有的程序进行来了扩展,让方法更加的丰富。一般会使用AOP做
1.事务处理 2.日志收集 3.权限控制 4.异常信息收集
5.根据公司自己的业务逻辑定义。
3.通知选取规则
5大通知类型中,环绕通知最为强大,能够控制目标方法的执行。
如果需要记录异常信息,使用异常通知。
其他通知,只能做记录工作,不能做处理
4.切入点表达式:
within表达式 粗粒度的只能控制类
Execution(返回值类型 包名.类名.方法名(参数列表))
Add(int a)
例子1:
<aop:pointcut expression=
"execution(int service.UserServiceImpl.add())" id="txPointcut"/>
改切点表达式表示
返回值为int 包名类名serviceUserServiceImpl 方法为add()的匹配规则
例子2:
<aop:pointcut expression="execution(* service.*.add())" id="txPointcut"/>
规则:返回值值任意, 包名service下子类的add(),只能包含一层,子孙类不行。
例子3:
<aop:pointcut
expression="execution(* service..*.add())" id="txPointcut"/>
规则:方法返回值任意, service包下的所有子孙类的add()
例子4:
<aop:pointcut expression=
"execution(* service..*.add(int,String))" id="txPointcut"/>
规则:返回值的类型任意 service子孙包下的add方法参数类型为int,String
<aop:pointcut expression=
"execution(* service..*.add(..))"
id="txPointcut"/>
规则:返回值类型任意 service下的所有子孙类.add方法() (参数任意)
例子6:
要求返回值为任意的,service包下的全部类的全部方法的任意参数
Execution(* service..*.*(..))
简化:
execution(* service..*(..))
5.异常通知的异常收集
作用:
在程序中做异常的收集,可以实时监控那些java代码报错,方便后期维护。
注入的顺序,必须位于第一位
6.后置通知介绍:
作用:
获取目标方法执行后的返回值结果,并且进行记录时需要使用后置通知。
报错信息:
只有环绕通知添加ProceedingJoinPoint
7.环绕通知的规范
环绕通知中必须添加返回值,否则程序执行获取不到结果。
8.多个环绕通知的执行规则
如果有多个环绕通知,则或先执行下一个通知,如果没有下一个通知,则会执行目标方法
其结构是一种嵌套关系
9.AOP的注解形式
切面配置的要素:
1.切入点表达式
2.切面对象
3.通知
1.开启前面注解
2.注解的使用
10.注解中切入点的写法
1.将切入点写入通知内部
@Before(value="execution(* service..*.*(..))")
缺点:如果该切入点需要重复使用,则必须重复写多次
2.自定义方法编辑切入点
@Pointcut(value="execution(* service..*.*(..))")
public void pointcut(){}
优点:
1.可以实现切入点表达式的复用
2.方便表达式管理
11.注解中通知的用法:
12.如何获取方法的注解:
案例:
权限控制,如果该方法上添加了@privilege注解,则需要进行权限控制.
思路:
1.通过反射调用获取方法注解
2.通过切入点表达式获取
方法:
1.自定义注解
2.注解的获取
13.权限控制例题
1.用户应该有自己的权限列表,内部保存用户的全部权限
2.当方法执行时需要权限时会与用户列表进行匹配如果满足权限。
方法才能执行如果不满足权限,方法则不能执行。