全站资源开放下载,感谢广大网友的支持
链接失效请移步职涯宝平台的学习路线|资源下载分类
支持用户留言评论_客服实时在线_问题解决更快
非盈利平台

非盈利平台

只为分享一些优质内容

Java帮帮-微信公众号

Java帮帮-微信公众号

将分享做到极致

微信小程序

微信小程序

更方便的阅读

百度小程序

百度小程序

搜索便捷阅读

支付宝小程序

支付宝小程序

支付也能阅读

程序员生活志-公众号

程序员生活志-公众号

程序员生活学习圈,互联网八卦黑料

支付宝赞助-Java帮帮社区
微信赞助-Java帮帮社区

谈 `AOP` 的通俗理解

77
发表时间:2018-11-20 23:44

AOP 的通俗理解

最近在翻译Spring Framework 5.0.0.M3中文文档 ,看到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)

publicclassLogInterceptor{

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

publicvoidmyMethod(){};

@Before("myMethod()")

publicvoidbefore(){

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

}

@After("myMethod()")

publicvoidafter(){

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

}

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

publicvoidAfterReturning(){

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

}

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

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

publicvoidAfterThrowing(){

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,..)")

publicvoidbefore3(int userId){

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

}  

@Before("myMethod()")

publicvoidbefore2(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");

}

}



Java帮帮学习群生态

Java帮帮学习群生态

总有一款能帮到你

Java学习群

Java学习群

与大牛一起交流

大数据学习群

大数据学习群

在数据中成长

九点编程学习群

九点编程学习群

深夜九点学编程

python学习群

python学习群

人工智能,爬虫

测试学习群

测试学习群

感受测试的魅力

Java帮帮生态承诺

Java帮帮生态承诺

一直坚守,不负重望

初心
勤俭
诚信
正义
分享
友链交换:加帮主QQ2524138991 留言即可 24小时内答复  
满吉教育资讯
会员登录
获取验证码
登录
登录
我的资料
留言
回到顶部