经典AOP
代理工厂Bean 是一个类 ProxyFactoryBean
前置增强 MethodBeforeAdvice
后置增强 AfterReturingAdvice
环绕增强 MethodInterceptor 熟悉
异常增强 ThrowsAdvice 记录日志
接口中没有方法,但是得实现afterThrows
public void afterThrows( [Method method,] [Object args,] [Object target,] Throwable throwable );
2.顾问(Advisor)
通知Advice是Spring提供的一种切面(Aspect)。但其功能过于简单,只能
将切面织入到目标类的所有目标方法中,无法完成将切面织入到指定目标方法中。
顾问Advisor是Spring提供的另一种切面。其可以完成更为复杂的切面织入功能,能选择性的增强切面中的部分方法。
PointcutAdvisor是顾问的一种,可以指定具体的切入点。顾问将通知进行了包装,
会根据不同的通知类型,在不同的时间点,将切面织入到不同的切入点。
PointcutAdvisor接口有两个较为常用的实现类:
*:NameMatchMethodPointcutAdvisor 名称匹配方法切入点顾问
*: RegexpMethodPointcutAdvisor 正则表达式匹配方法切入点顾问
<property name="pattern" value=".*do.*"></property> 表示方法全名(包名,接口名,方法名)
运算符 名称 意义
. 点号 表示任意单个字符
+ 加号 表示前一个字符出现一次或者多次
* 星号 表示前一个字符出现0次或者多次
名称匹配方法切入点顾问 NameMatchMethodPointcutAdvisor
<!-- 03.配置顾问 advisor 包装 advice-->
<bean id="beforeAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="beforeAdvice"></property>
<property name="mappedNames" value="do*"></property>
</bean>
正则匹配方法切入点顾问 RegexpMethodPointcutAdvisor
3.两种自动代理实现
=====默认Advisor自动代理生成器
注意:切面只能是顾问,对所有的对象都增强
DefaultAdvisorAutoProxyCreator
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean>
=====BeanName自动代理生成器
BeanNameAutoProxyCreator
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames" value="someService"></property>
<property name="interceptorNames" value="beforeAdvice"></property>
</bean>
4.AspectJ
AspectJ是一个面向切面的框架
传统AOP:Spring集成AspectJ
无缝面向切面扩展的框架,横切关注点
AspectJ(也就是AOP)的动机是发现那些使用传统的编程方法无法很好处理的问题。
考虑一个要在某些应用中实施安全策略的问题。安全性是贯穿于系统所有模块间的问题,
每个模块都需要应用安全机制才能保证整个系统的安全性,
很明显这里的安全策略的实施问题就是一个横切关注点,
使用传统的编程解决此问题非常的困难而且容易产生差错,
这就正是AOP发挥作用的时候了。@AspectJ 使用了Java5 的注解,
可以将切面声明为普通的Java类(POJO)。
使用AspectJ 基于 注解的AOP
接口
实现类
增强类 不去实现任何接口
@Aspect
public class MyAspect {
//前置增强
@Before("execution(* *..UserService.*(..))")
public void myBefore(){
System.out.println("======之前");
}
}
xml配置文件中
<aop:aspectj-autoproxy>
AspectJ基于XML的AOP实现 (开发常用)
4.1前置增强
<aop:config>
<aop:pointcut expression="execution(* *..SomeServiceImpl.doLog(..))" id="beforePointcut"/>
<aop:aspect ref="myAspect">
<aop:before method="myBefore(org.aspectj.lang.JoinPoint)" pointcut-ref="beforePointcut"/>
</aop:aspect>
</aop:config>