java 通俗理解,谈 `AOP` 的通俗理解

谈 AOP 的通俗理解

Spring的面向方面的编程(AOP),国内大都说面向切面,其实我还是觉得面向方面最恰当,何解?那就扯一扯。

1. AOP相关的概念

1) Aspect :切面,切入系统的一个切面。比如事务管理是一个切面,权限管理也是一个切面;

2) Join point :连接点,也就是可以进行横向切入的位置;

3) Advice :通知,切面在某个连接点执行的操作(分为: Before advice , After returning advice , After throwing advice , After (finally) advice , Around advice );

4) Pointcut :切点,符合切点表达式的连接点,也就是真正被切入的地方;

这就好比一团面,都是一团白面,根据食谱的不同,我们做什么样的面食即可,厨师关心的是做法,而客人关心的是色香味,再进一步的说,我同样的做面方法,完全可以用不一样的面粉(白面,玉米面,荞麦面等等),由此便可抽象出面团便是所谓的切点,而面团的加工,比如加水,放鸡蛋,放油,盐等的各种加工便是面的前置方法Before advice,将面团炸,煎,煮等做出成品来便是其后置方法After advice ,期间有所谓的环绕方法Around advice ,而客人的品评则是finally  advice 中间出现问题了所造成的事件 After throwing advice   仅供理解,里面可能有不恰当的地方,但自己写代码的时注意即可,由此,这个做面的过程便是面向方面编程即所谓的一个切面(Aspect )

而AOP的核心思想所在便是要求程序员专注于自己的逻辑业务,而非这团面,得以更好的去处理各种问题,从本质上进行解耦。

最后,再贴上一段代码来做参考对比:@Aspect

@Component // for auto scan

//@Order(2)

public class LogInterceptor {

@Pointcut("execution(public * net.aazj.service..*.getUser(..))")

public void myMethod(){};

@Before("myMethod()")

public void before() {

System.out.println("method start");

}

@After("myMethod()")

public void after() {

System.out.println("method after");

}

@AfterReturning("execution(public * net.aazj.mapper..*.*(..))")

public void AfterReturning() {

System.out.println("method AfterReturning");

}

@AfterThrowing("execution(public * net.aazj.mapper..*.*(..))")

//  @Around("execution(public * net.aazj.mapper..*.*(..))")

public void AfterThrowing() {

System.out.println("method AfterThrowing");

}

@Around("execution(public * net.aazj.mapper..*.*(..))")

public Object Around(ProceedingJoinPoint jp) throws Throwable {

System.out.println("method Around");

SourceLocation sl = jp.getSourceLocation();

Object ret = jp.proceed();

System.out.println(jp.getTarget());

return ret;

}

@Before("execution(public * net.aazj.service..*.getUser(..)) && args(userId,..)")

public void before3(int userId) {

System.out.println("userId-----" + userId);

}

@Before("myMethod()")

public void before2(JoinPoint jp) {

Object[] args = jp.getArgs();

System.out.println("userId11111: " + (Integer)args[0]);

System.out.println(jp.getTarget());

System.out.println(jp.getThis());

System.out.println(jp.getSignature());

System.out.println("method start");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值