18-spring学习-利用Annotation配置AOP

本文介绍如何在 Spring 框架中使用注解配置 AOP 功能,包括开启 AOP 支持、定义切面类和服务方法的前置、后置及环绕通知等,并提供了一个具体的 ServiceAspect 类实现示例。

之前是通过配置完成aop操作,如果自己写的话,太麻烦了,可以使用基于annotation的配置完成。

 

第一步:打开AOP的annotation支持

加上一句话:

    <context:annotation-config/>
    <context:component-scan base-package="com.Spring"/>
  <aop:aspectj-autoproxy  proxy-target-class="true"/>    //使用了jdk的自动动态代理,需要加上这句话,否则报错 <aop:aspectj-autoproxy/>

随后需要在ServiceAspect类中编写所需要使用的annotation。

范例:修改serviceAspect类。

package com.Spring.aop;

import java.lang.reflect.Array;
import java.util.Arrays;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import com.Spring.Vo.Member;

@Component  //用来取代在xml中配置bean初始化
@Aspect   //用来代替在xml中配置AOP操作
public class ServiceAspect {
    @Before(value="execution(* com.Spring..*.*(..)))")
    public void serviceBefore()
    {
        System.out.println("AOP切面执行日志记录操作");
    }
    @Before(value="execution(* com.Spring..*.*(..)) and args(param)))",argNames="param")
    public void serviceBefore2(Object arg)
    {
        System.out.println("AOP切面执行增加前操作,参数=" +arg);
    }
    @After(value="execution(* com.Spring..*.*(..)))")
    public void serviceAfter()
    {
        System.out.println("AOP切面执行事务处理操作");
    }
    @AfterReturning(value="execution(* com.Spring..*.*(..)))",argNames="ret",returning="ret")
    public void serviceAfterReturn(Object val)    //表示操作结果
    {
        System.out.println("AOP切面操作完成,返回结果:"+val);
    }
    @AfterThrowing(value="execution(* com.Spring..*.*(..)))",argNames="e",throwing="e")
    public void serviceAfterThrow(Exception e)    //表示操作结果
    {
        System.out.println("AOP切面操作出现异常:"+e);
    }
    @Around(value="execution(* com.Spring..*.*(..)))")
    public Object serviceAround(ProceedingJoinPoint point) throws Throwable
    {
        System.out.println("AOP切面数据层方法调用之前,参数:"+Arrays.toString(point.getArgs()));
        Member vo=new Member();
        vo.setMid("TestAOP");
        vo.setName("测试AOP");
        Object retVal=point.proceed(new Object[]{ vo });
        System.out.println("AOP切面数据层方法调用之后,返回值:"+retVal);
        return true;
    }
}

运行结果:

 

可以对照之前用注解的xml配置:

<context:annotation-config/>
    <context:component-scan base-package="com.Spring"/>
    <aop:aspectj-autoproxy  proxy-target-class="true"/>
    
    
    <aop:config>
    <!-- 定义程序的切入点 -->
        <aop:pointcut expression="execution(* com.Spring..*.*(..)) and args(vo))" id="pointcut"/>
        <!-- 这里ref的对象是通过annotation配置@Component出来的, -->
        <!-- 定义面向方面的处理类 -->
        <aop:aspect ref="serviceAspect">
        <!-- 
            <aop:before method="serviceBefore2" pointcut-ref="pointcut" arg-names="vo"/>
            <aop:after method="serviceAfter"  pointcut="execution(* com.Spring..*.*(..)))"/>
            <aop:after-returning method="serviceAfterReturn" pointcut="execution(* com.Spring..*.*(..)))"  returning="haha" arg-names="haha"/>
            <aop:after-throwing method="serviceAfterThrow" pointcut="execution(* com.Spring..*.*(..)))" arg-names="e" throwing="abc"/>
         -->    
            <aop:around method="serviceAround" pointcut="execution(* com.Spring..*.*(..)))" />
        </aop:aspect>
    </aop:config>

 

 实际操作中,需要进行一些辅助性功能编写的时候(比如日志记录),建议使用annotation的配置操作,这样的代码是最简化的,也是最直观的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值