动态代理实现日志(手动创建)dynamicproxy
AOP(aspect Oriented programming)
AOP:面向切面编程
Oop:面向对象编程(Object Oriented programming)
AOP概念:
1.核心业务关注点:核心业务。在例子中就是加减乘除;
2.横切关注点:非核心业务,在本例中就是前置日志,后置日志,验证参数;
3.切面:
有一个或者多个横切关注点组成,组成切面的多个横切关注点之间要有相关的逻辑;
4.目标对象:
仅由核心业务关注点组成;
5:织入
把切面织入到目标对象中,得到一个代理对象,这个织入的过程有Spring ioc完成
6.代理对象
把切面织入到目标对象中就得到一个代理对象;
7.通知:
控制一个横切关注点何时执行
@before前置通知:在目标方法执行前执行;
@after 后置通知:在目标方法执行后通知(无论是否有异常都执行)
@afterReturning 返回通知:在目标方法之后执行(无异常才执行)
@afterThrewing 异常通知:在目标方法抛出异常后执行
8:切点
控制何地执行横切关注点
9.连接点(就是方法)
就是方法的合集;
LogAspect
@component:被ioc容器管理
@Aspect 引入切面
public class LogAspect{
}
四种方式:
@before(“execution(* .(..))”)
public void before(){
System.out.print(“前置通知…..”)
}
@after(“execution(* .(..))”)
public void after(){
System.out.print(“后置通知…..”)
}
@After Throwing(value=”execution(* .(..))”,throwing=”e”)
public void afterThrowing(){
System.out.print(“异常通知…..”+e)
}@AfterReturning(value=”execution(* .(..))”,returning=”r”)
public void AfterReturning(){
System.out.print(“后置通知….”+r)
}
或者环绕通知代替前四种
/*
execution中的内容就是切点表达式,控制何地执行
第1个* 表示任意访问修饰符以及任意返回值
第2个* 表示任意包中的任意类
第3个* 表示任意方法
.. 表示任意参数
*/
@Around("execution(* *.*(..))")
public Object around(ProceedingJoinPoint pjp) {
/*
1. 返回通知一定能获取目标方法的返回值。
2. 异常通知一定能获取目标方法抛出的异常信息
*/
Object r = null;
try {
System.out.println("前置通知");
// pjp中,封装了真实对象。
// pjp.proceed()就是在调用真实对象的真实方法!
r = pjp.proceed();
System.out.println("返回通知:" + r);
return r;
} catch (Throwable e) {
System.out.println("异常通知:" + e);
return null;
} finally {
System.out.println("后置通知");
}
}
}