欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring(十二)--Spring AspectJ

程序员文章站 2022-10-16 16:03:10
Spring AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。 AspectJ 是一个面向切面的框架!定义了AOP的语法! Spring 将AspectJ 整合到了自己 ......

               spring aspectj

  aspectj是一个面向切面的框架,它扩展了java语言。aspectj定义了aop语法,所以它有一个专门的编译器用来生成遵守java字节编码规范的class文件。

  aspectj 是一个面向切面的框架!定义了aop的语法!

  spring 将aspectj 整合到了自己的框架中!

  需要引入两个核心jar

    01.aspectj.weaver

    02.spring-aspects

  (如果你使用的是idea  所需的所有pom节点,在这儿:)

  务必掌握的  aspectj 的切入点表达式

    execution([访问权限类型] 返回值类型 [完整限定类名]方法名 (参数) [抛出的异常类型])

    execution( 返回值类型  方法名(参数))

 

  *:0-n的字符

  ..:

    01.如果是在方法参数中,表示参数可有多个或者可无

    02.如果是在包名之后,表示当前包和子包

  +:

    01.如果定义在类后面,表示当前类以及子类

    02.如果定义在接口后面,表示当前接口以及实现类

例子:

Spring(十二)--Spring AspectJ

1. 使用注解实现

/**
 * 当前类就是 整个程序中需要的各种系统级业务
 * 就是一个切面类
 */
@aspect
public class myaspectj {

    @before("execution(* *..userdao.sleep(..))")
    public void  before(){
        system.out.println("前置增强........");
    }

    @afterreturning("execution(* *..userdao.sleep(..))")
    public void  afterreturning(){
        system.out.println("后置增强........");
    }
//如果想获取方法的返回值
    @afterreturning(value = "execution(* *..userdao.sleep(..))",returning = "result")
    public void  afterreturning(string result){
        system.out.println("后置增强........"+result);
    }

    /**
     * 环绕增强可以改变返回值
     */
    @around("execution(* *..userdao.eat(..))")
    public object  around(proceedingjoinpoint point){
        system.out.println("环绕增强进来........");
        object result=null;
        try {
             result=  point.proceed(); //执行目标方法
        } catch (throwable throwable) {
            throwable.printstacktrace();
        }
        system.out.println("环绕增强出去........");
        return  "orange";
    }
}

2. 对应的xml文件和测试方法

 

<!--01.配置目标对象-->
<bean id="userdao" class="com.xdf.dao.userdaoimpl"/>

  <!--02.配置切面-->
<bean id="myaspectj" class="com.xdf.annotation.myaspectj"/>

 <!--03.注册aspectj的自动代理-->
<aop:aspectj-autoproxy/>

//测试方法
@test
public  void  defaulttest(){
    applicationcontext context=new classpathxmlapplicationcontext("spring.xml");
    userdao dao= context.getbean("userdao", userdao.class);
  //  system.out.println(dao.eat());
    dao.sleep();
}

 

3. 使用纯切面的方式实现

 

public class myaspectj {

    public void  before(){
        system.out.println("前置增强........");
    }

    public void  afterreturning(){
        system.out.println("后置增强........");
    }

    /**
     * 环绕增强可以改变返回值
     */
    public object  around(proceedingjoinpoint point){
        system.out.println("环绕增强进来........");
        object result=null;
        try {
             result=  point.proceed(); //执行目标方法
        } catch (throwable throwable) {
            throwable.printstacktrace();
        }
        system.out.println("环绕增强出去........");
        return  "orange";
    }


}

 

4.对应的xml文件和测试方法

 

<!--01.配置目标对象-->
<bean id="userdao" class="com.xdf.dao.userdaoimpl"/>

  <!--02.配置切面-->
<bean id="myaspectj" class="com.xdf.annotation.myaspectj"/>

 <!--03.注册aspectj需要的切入点-->
  <aop:config>
      <!--配置切入点表达式-->
      <aop:pointcut id="myponit" expression="execution(* *..userdao.sleep(..))"/>
      <aop:pointcut id="myponit2" expression="execution(* *..userdao.eat(..))"/>
      <!--配置切面-->
      <aop:aspect ref="myaspectj">
          <aop:before method="before" pointcut-ref="myponit"/>
          <aop:after-returning method="afterreturning" pointcut-ref="myponit"/>
          <aop:around method="around" pointcut-ref="myponit2"/>
      </aop:aspect>
  </aop:config>

 

@test
public  void  aspectjtest(){
    applicationcontext context=new classpathxmlapplicationcontext("aspectj.xml");
    userdao dao= context.getbean("userdao", userdao.class);
   //system.out.println(dao.eat());
   dao.sleep();
}

 

 

    未完待续!!!