通知:

   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层所有目标方法的异常信息