当前位置: 移动技术网 > IT编程>开发语言>Java > Spring(十二)--Spring AspectJ

Spring(十二)--Spring AspectJ

2018年09月16日  | 移动技术网IT编程  | 我要评论

               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.如果定义在接口后面,表示当前接口以及实现类

例子:

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();
}

 

 

    未完待续!!!

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网