在上篇文章中( 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(){} 以后通过“方法名”取得切入点援用
在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: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样。