Spring(2)

动态代理实现日志(手动创建)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("后置通知");
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值