标签:
Spring AOP基于注解的“零配置”方式:
Spring的beans.xml中
<!-- 指定自动搜索Bean组件、自动搜索切面类 --> <context:component-scan base-package="org.crazyit.app.service,org.crazyit.app.aspect"> <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/> </context:component-scan>
BeanTest的main方法中
//1、 创建Spring的IoC容器 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); //2、从IoC容器中获取Bean Hello hello = ctx.getBean("hello" , Hello.class); //3、调用bean的方法 hello.foo(); hello.addUser("孙悟空" , "7788");
用@Aspect把AuthAspect声明为一个切面,切面也要放到容器中,用@Component
@Before("execution(public int org.crazyit.app.service.Hello.addUser(String , String)")
告诉这个切面中的方法在哪些类的哪些方法(即目标方法addUser)开始之前执行,addUser的执行作为切入点。
让@Before 起作用:调用一个目标方法,如果一个目标方法跟Before这个注解所声明的方法相一致的时候,AOP框架会自动地为目标方法所在的类生成代理对象,然后在调用这个目标方法之前先调用@Before注解指定的方法
在beans.xml中加入:
<!-- 启动@AspectJ支持 -->
<!-- 使AspectJ起作用,自动为匹配的类生成代理对象 -->
<aop:aspectj-autoproxy/>
启用Spring对@Aspect切面配置的支持
AspectJ支持5种类型的通知注解
访问目标方法最简单的方法是定义增强处理方法时将第一个参数定义为JointPoint类型
JointPoint参数代表连接点,表明连接细节,包含几个常用方法:
1、Object[] getArgs():返回执行目标方法时的参数
2、Signaure getSignature():返回被增强的方法的相关信息
3、Object getTarget()返回被植入增强处理的目标对象
4、Object getThis():返回AOP框架为目标对象生成的代理对象
前置通知(@Before):在目标方法执行前,执行的通知
后置通知(@After):在目标方法执行后,执行的通知,后置通知还不能访问目标方法的执行结果,无论目标方法是否出现
异常
返回通知(@AfterReturning):是在目标方法正常结束后执行的,可以访问到方法的返回值
@AfterReturning(returning="rvt", pointcut="execution(* org.crazyit.app.service.impl.*.*(..))")
pointcut(或写成value)用于指定该切入点对应的切入表达式
returning属性所指定的形参名必须对应于增强处理中的一个形参名,当目标方法执行返回后作为相应的参数传入 增强处理方法,returning还有一个 额外的作用:可以用于限定切入点只匹配具有对应返回值类型的方法
异常通知(@AfterThrowing):在目标方法出现异常时会执行的代码,可以访问到异常对象,且可以指定在出现特定异常时再执行通知代码
环绕通知(@Round):环绕通知需要携带ProceedingJointPoint类型的参数,类似于动态代理的全过程,ProceedingJointPoint类 型的参数可以决定是否执行目标方法,且环 绕通知必须有返回值,即为目标方法的返回值
标签:
原文地址:http://www.cnblogs.com/gaoxiangde/p/4200004.html