程序员人生 网站导航

Spring(十二)AspectJ框架开发AOP(基于注解)

栏目:框架设计时间:2017-03-24 09:03:27

在上篇文章中( Spring(101)AspectJ框架开发AOP(基于xml))是使用xml对AspectJ的使用,@AspectJ 是AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面,所以可使用xml方式和注解方式来开发AOP 所以在这篇文章中我们使用注解来代替xml。
我们可使用注解1点1点替换xml的配置。
说明:

@Aspect 声明切面,修饰切面类,从而取得 通知。
通知
@Before 前置
@AfterReturning 后置
@Around 环绕
@AfterThrowing 抛出异常
@After 终究
切入点
@PointCut ,修饰方法 private void xxx(){} 以后通过“方法名”取得切入点援用

替换bean

在xml中

<!-- 创建目标类 -->
    <bean id="userServiceId" class="com.scx.xmlproxy.test.UserServiceImpl"></bean> 
    <!-- 创建切面类(通知) -->  
    <bean id="myAspectId" class="com.scx.xmlproxy.test.MyAspect"></bean>  

我们知道xml中的bean可使用注解@component来替换
在web开发中@component衍生了3个注解,我们也能够为不同的层次使用不同的注解。

web开发,提供3个@Component注解衍生注解(功能1样)
@Repository :dao层
@Service:service层
@Controller:web层
这3个注解和@Component1样,在web开发中使用这3个注解使代码更加清晰明了。
替换结果以下:
对目标类,即service层
这里写图片描述
对切面类
这里写图片描述

替换AOP

<aop:aspect ref="myAspectId">

这里写图片描述

替换公共切入点

xml配置:

    <aop:pointcut expression="execution(*com.scx.xmlproxy.test.*.*(..))" id="myPointCut"/>

注解替换:
需要在1个私有的方法上面添加注解@Pointcut。援用时就使用方法名称pointCut。
这里写图片描述

替换前置通知

xml配置:

<aop:before method="before" pointcut-ref="myPointCut"/>

注解替换:
在方法名上面添加@before注解

//前置通知
    @Before(value = "pointCut()")
    public void before(JoinPoint joinPoint){
        System.out.println("MyAspect-before");
    }

替换终究通知

xml代码

<aop:after method="after" pointcut-ref="myPointCut"/>

注解替换

    //终究通知
    @After(value="pointCut()")
    public void after(JoinPoint joinPoint){
        System.out.println("MyAspect-after");
    }

替换后置通知

xml配置:

<aop:after-returning method="afterReturning" pointcut-ref="myPointCut" returning="ret" />

注解替换:

//后置通知
    @AfterReturning(value="pointCut()",returning="ret")
    public void afterReturning(JoinPoint joinPoint,Object ret){
        System.out.println("MyAspect-afterReturning  "+joinPoint.getSignature().getName()+"\t"+ret);
    }

替换环绕通知

xml配置:

 <aop:around method="around" pointcut-ref="myPointCut"/>    

注解替换:

//环绕通知
    @Around(value = "pointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("MyAspect-around-前");
        Object obj=joinPoint.proceed();//履行目标方法
        System.out.println("MyAspect-around-后");
        return obj;
    }

替换异常通知

xml配置:

<aop:after-throwing method="afterThrowing" pointcut-ref="myPointCut" throwing="e"/>

注解替换:

//异常通知
    @AfterThrowing(value="pointCut()")
    public void afterThrowing(JoinPoint joinPoint,Throwable e){
        System.out.println("MyAspect-afterThrowing "+e.getMessage());
    }

测试代码和上篇1样 运行结果也是1样。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐