spring-AOP-基于Schema切面的小例子

前言:

如果一个项目没有 jdk 5.0 , 那就无法使用基于@AspectJ 注解 的切面.

但是使用AspectJ的表达式的大门还是可以使用的。

我们可以用java提供的Schema配置方法,来替代基于AspectJ注解声明切面这种方式。

  其实很容易理解,@AspectJ注解配置 和 Schema配置 是两个不同的实现手法,它们都能实现说明切面和增强的类型。

 以下是一些标签的说明:

<aop:config>标签可以定义多个切面

<aop:aspect id="" ref=""> //标签用于定义一个切面,其内部可以定义多个增强
 <aop:pointcut expression="" id=""/> //定义切点
 <aop:before method="" pointcut-ref=""/>  //前置增强
 <aop:after-returning method="" pointcut-ref=""/>  //后置增强
 <aop:after-throwing method="" pointcut-ref=""/>  //异常增强
 <aop:after method="" pointcut-ref=""/>  //Final增强
<aop:around method="" pointcut-ref=""/> //环绕增强

<aop:declare-parents types-matching="com.imooc.aop.schema.advice.biz.*(+)"  //引介增强
implement-interface="com.imooc.aop.schema.advice.Fit"
default-impl="com.imooc.aop.schema.advice.FitImpl"/>

代码:

SayHelloBeforemale.java

//增强类
//
不需要实现增强类的接口 , 只需要在 schema 的xml中定义就行啦 public class SayHelloBeforemale { public void before() { System.out.println("hello"); } }

 waiter.java

//目标类
public class waiter {
    public void say() {
        // TODO Auto-generated method stub
        System.out.println("先生");
    }

}

spring-aop-schema-advice.xml

<bean id="advicemethods" class="test4.SayHelloBeforemale"/>
            <bean id="waiter" class="test4.waiter"/>
              <aop:config proxy-target-class="true"> <!-- 当状态为true 开启了CGLib 目标类不需要实现接口 -->
              <aop:pointcut expression="execution(* test4.waiter.*(..))" id="pointcutt"/>  <!-- 定义切点 -->
                  <aop:aspect id="advicemethods" ref="advicemethods">  <!-- 定义切面  -->
                      <aop:before method="before" pointcut-ref="pointcutt" />         <!-- 把切面切点连接起来 -->
                  </aop:aspect>
              </aop:config>
              

UnitTest.java

//测试类
public
class UnitTest { @Test //基于Schema配置方式 public void test3(){ ApplicationContext a = new ClassPathXmlApplicationContext("test4/spring-aop-schema-advice.xml"); waiter w = (waiter)a.getBean("waiter"); w.say(); } }
原文地址:https://www.cnblogs.com/tjc1996/p/spring.html