标签:springaop
1、前置通知 aop:before
1、在目标方法执行之前执行
2、无论目标方法是否抛出异常,都执行,因为在执行前置通知的时候,目标方法还没有执行,还没有遇到异常
2、后置通知 aop:after-returning
1、在目标方法执行之后执行
2、当目标方法遇到异常,后置通知将不再执行
3、后置通知可以接受目标方法的返回值,但是必须注意:
后置通知的参数的名称和配置文件中returning="var"的值是一致的
3、最终通知:aop:after
1、在目标方法执行之后执行
2、无论目标方法是否抛出异常,都执行,因为相当于finally
4、异常通知 aop:after-throwing
1、接受目标方法抛出的异常信息
2、步骤
在异常通知方法中有一个参数Throwable ex
在配置文件中
<aop:after-throwing method="throwingMethod" pointcut-ref="perform" throwing="ex"/> //接收目标方法抛出的异常对象
5、环绕通知
1、如果不在环绕通知中调用ProceedingJoinPoint的proceed,目标方法不会执行
2、环绕通知可以控制目标方法的执行
<aop:around method="aroundMethod" pointcut-ref="perform"/>
JoinPoint joinpoint可以获得目标方法信息
public void aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println(joinPoint.getSignature().getName());
joinPoint.proceed();//调用目标方法
System.out.println("aaaasfdasfd");
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<bean id="salaryManager" class="springAOP.cn.itcast.aspects.SalaryManagerImpl"></bean>
<bean id="logger" class="springAOP.cn.itcast.aspects.Logger"></bean>
<bean id="security" class="springAOP.cn.itcast.aspects.Security"></bean>
<bean id="privilege" class="springAOP.cn.itcast.aspects.Privilege">
<property name="access" value="user"></property>
</bean>
<aop:config>
<aop:pointcut expression="execution(* springAOP.cn.itcast.aspects.SalaryManagerImpl.*(..))" id="perform"/>
<aop:aspect ref="logger">
<aop:before method="interceptor" pointcut-ref="perform"/>
</aop:aspect>
<aop:aspect ref="security">
<aop:before method="interceptor" pointcut-ref="perform"/>
</aop:aspect>
<aop:aspect ref="privilege">
<aop:around method="isAccess" pointcut-ref="perform"/>
</aop:aspect>
</aop:config>
</beans>
privilege中的方法
public void isAccess(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("111111111111111111");
if(this.access.equals("admin")){
joinPoint.proceed();
}else{
System.out.println("没有权限");
}
System.out.println("22222222222222222");
}
测试
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("/springAOP/cn/itcast/aspects/applicationContext.xml");
SalaryManager proxy = (SalaryManager) context.getBean("salaryManager");
proxy.showSalary();
}
测试结果
logger
security
111111111111111111
没有权限
22222222222222222
异常通知,截获service层所有目标方法的异常信息
标签:springaop
原文地址:http://8477424.blog.51cto.com/8467424/1769834