经典aop,

经典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>

原文地址:https://www.cnblogs.com/yfyfyff/p/7665843.html