Spring经典---AOP

  1.代理工厂Bean  

  前置增强  实现MethodBeforeAdvice  在方法执行之前执行    

  后置增强     实现AfterReturingAdvice  在方法执行之后执行

  环绕增强     实现MethodInterceptor   在方法前后都执行增强

  异常增强     实现ThrowsAdvice        接口中没有方法,但是得实现afterThrows

     public void afterThrows( [Method method,] [Object args,] [Object target,] Throwable throwable );

 <!--1.目标对象-->
  <bean id="service" class="cn.happy.day11aop01.SomeServiceImpl"></bean>
  <!--2.增强-->
  <bean id="beforeAdvice" class="cn.happy.day11aop01.MyBeforeAdvice"></bean>
  <!--3.代理工厂bean实现代理对象的生成-->
  <bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
     <!--target:目标对象是谁-->
       <property name="target" ref="service"></property>
       <property name="interceptorNames" value="beforeAdvice" ></property>
  </bean>
</beans>

环绕增强:

public interface SomeBefore {
    public void sayhi();
}
public class SomeBeforeImpl implements SomeBefore {
    public void sayhi() {
        System.out.println("我是李白");
    }
}
public class BeforeTest implements MethodInterceptor {
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        System.out.println("我在上");
        methodInvocation.proceed();
        System.out.println("我在下");
        return null;
    }
}
<!--目标类型-->
    <bean id="service" class="Inectoper.SomeBeforeImpl"></bean>
<!--增强通知-->
    <bean id="beforeadvice" class="Inectoper.BeforeTest"></bean>
<!--代理工厂bean 自己也是bean  中和调度目标类型和增强-->
    <bean id="proxys" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="target" ref="service"></property>
        <property name="interceptorNames" value="beforeadvice"></property>
    </bean>
  @Test
    public void Test03(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext08.xml");
        Inectoper.SomeBefore bean =(Inectoper.SomeBefore) context.getBean("proxys");
        bean.sayhi();
    }

运行结果:

advice  通知

advisor 顾问

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>
原文地址:https://www.cnblogs.com/1234AAA/p/8530044.html