SpringAOP
AOP是一种思想,意思是面向切面的编程/面向方面的编程。
Aspect(方面、方向) Oriented(导向、定向的) Programming(程序设计、规划)
使用AOP的目的就是将业务逻辑同业务功能关系不大的代码分离,降低耦合。
AOP和OOP的异同
OOP——面向对象编程
面向对象编程很好的 解决了软件系统中角色划分的问题,但是在日志、事务处理、权限管理等方面,使用OOP封装对象行为会产生大量的重复代码。
AOP——面向切面编程
面向切面编程可以使应用程序分为核心关注点和横切关注点,从而降低代码的耦合。
AOP和OOP是互补而不是对立的。
SPring的AOP借助于java的动态代理机制。
代理
最简单的代理就是手动去写一个代理类,将被代理的对象作为一个成员传入该对象中,之后再调用被代理对象方法前后插入需要拓展的内容——这就是静态代理。
但是这种方法有一个最大的缺点就是,我们需要为每一个被代理对象都编写一个代理类。
简化一些的方法就是我们可以面向接口编程,声明一个接口去代理,但是这样做又需要被代理类实现同一个接口。
Java提供了一种更灵活地方法——动态代理。
Java提供了InvocationHandler和Proxy ——动态代理。
而Spring就是基于java的动态代理机制实现的。
Spring的AOP有三个关键字分别是:
Pointcut——切入点
Advice——通知
Advisor——顾问/提供意见者
三者的关系是:
pointcut定义切入点的条件
Advice是具体的处理逻辑
Advisor则负责链接pointcut和advice。
Spring主要提供了三种切入点实现:
静态切入点、动态切入点和自定义切入点
自定义切入点目前还不成熟,用的比较多的是静态切入点。
静态切入点和动态切入点的主要区别在于:
静态切入点只限于给定的方法和目标类,不用考虑方法的参数,spring只在第一次计算静态切入点的位置,之后就会将其换成——RegexpMethodPointcut。
动态切入点不仅限于给定的方法和类,可以指定方法的参数,所以动态切入点不能缓存,因此使用动态切入点有很大的性能损耗。
Spring的通知ADVICE
Spring提供了五种advice类型:
Interception around:在切入点前后执行。
Before: 在切入点之前执行,实现Before通知的类需要实现接口 ethodBeforAdvice。
After returning通知: 在切入点执行之后通知。
Thorw通知:在切入点抛出异常时通知,实现Throw通知的类需要实现ThrowsAdvice接口。
Introduction通知: 在切入点调用完毕后通知,实现Introduction通知的类需要实现IntroductionAdvice和introductionInterceptor接口。
Spring的配置器Advisor
Advisor是pointcut和advice的配置器,他负责将advice注入到pointcut位置。
ProxyFactoryBean。