https://blog.csdn.net/baidu_33403616/article/details/70304051
https://blog.csdn.net/ljxzdn/article/details/79404353
2017年04月20日 20:28:46 再写三行 阅读数 21795
假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如
但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。
但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。
通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置插入这些功能。这样的思想,被称为面向切面编程,亦即AOP。
为了在指定位置执行这些横向的功能,需要知道指定的是什么地方
例如上图,方法级别的aop实现,在一个程序执行链条中,把method2称为切点,也就是说在method2执行时会执行横切的功能,那么是在method2之前还是之后呢,又是执行什么呢?这些都由advice(通知)来指定。advice有5种类型,分别是
通知类型 | 简介 |
---|---|
Before(前置通知) | 目标方法调用之前执行 |
After(后置通知) | 目标方法调用之后执行 |
After-returning(返回通知) | 目标方法执行成功后执行 |
After-throwing(异常通知) | 目标方法抛出异常后执行 |
Around(环绕通知) | 相当于合并了前置和后置 |
把切点和通知合在一起就是切面了,一个切面指定了在何时何地执行何种方法。在spring aop中如此定义这个切面:
@Aspect
@Component
public class UserAspect {
@Before("execution(* com.aop.service.impl.UserServiceImpl.login(..))")
public void loginLog(){
System.out.println("user login");
}
}
使用注解@Aspect将某个特定的类声明为切面,这样,该类下的方法就可以声明为横向的功能点后插入到指定位置。使用execution表达式声明在这个切点,格式如下
第一个位置指定了方法的返回值,*号代表任意类型的返回值,然后是所在的类和方法名,*号同样代表任意,就是该类中任意的方法,在上一个例子中方法名是login,则是指定了该类中的login方法。然后最后一个参数是方法入参,因为java中支持重载,所以这个参数可以帮助你更精确的进行定位。两点表示任意参数类型。这样,execution表达式告诉了程序该在何地执行通知。而被诸如@Before注解修饰的方法就是通知的内容,也就是做什么。
至此,我们就可以使用spring aop,但是还有两点需要得到注意
大家应该明白一个道理,所有广为人用的框架/技术等.基本都是两个目的:
1.软件开发期(写代码,测试,上线)内,让开发人员用更少的代码完成同样的功能实现.
2.软件上线后的维护升级器,让让开发人员用更少的代码完成同样的功能实现.
记住这两条,然后我们来看看AOP到底是什么,以及在什么地方能够让我们少写代码?
1.AOP是什么?
面向切面编程,能够让我们在不影响原有功能的前提下,为软件横向扩展 功能 .
2.在什么地方能够让我们少写代码?
要回答问题2,首先解决"横向"扩展什么意思?
理解了这个词基本就能理解AOP了.
软件开发可分为"持久层" "业务层" 控制器层"
所谓的"横向"就是指上面说到的三个层里的任意一层!
使用AOP技术后,用一个方法,就能同时作用与一个层面内所有方法!
上句话不容易理解,栗子来了!
写日志是一个很好的编程习惯,不用AOP技术的话,我们应该怎么写日志?
System.out.println("方法a开始执行");
public void a(){
System.out.println("我是一个方法");
}
System.out.println("方法a执行成功");
上述是一个很简单的日志.两行代码也不多.
可是在真实开发中,面对100个甚至1000个方法时,这样写你会不会被累死?
如果用AOP的话,我们用一个方法就可以搞定所有的日志!
@Around("bean(*Service)")//指定要监控的bean中的方法
public Object testObject(ProceedingJoinPoint jp) throws Throwable{ //参数的意思是代理执行原软件中的方法
System.out.println(jp.getSignature()+"开始执行"); //在方法执行之前执行
Object val = jp.proceed();
System.out.println(jp.getSignature()+"执行成功");//在方法执行之后执行
return val;
}
OK!,搞定.现在所有业务层的方法执行前后都会打出日志了!.
一个方法搞定了需要机械重复的复制粘贴几百行的工作!世界美好了.
本文目的是简单说明使用AOP如何能帮助我们少写代码,具体如何使用请看下一篇.
http://blog.csdn.net/qq_35360135/article/details/79080502
---------------------
作者:LJXZDN
来源:CSDN
原文:https://blog.csdn.net/ljxzdn/article/details/79404353
版权声明:本文为博主原创文章,转载请附上博文链接!