SpringAop

Posted smokerbig

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringAop相关的知识,希望对你有一定的参考价值。

基于配置的方式

xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
    <!-- 加载bean -->
    <bean id="arithmeticCalculator" class="com.aspectsAopxml.bean.ArithmeticCalculatorImpl">
    </bean>
    <!-- 配置切面的 bean. -->
    <bean id="aopxx" class="com.aspectsAopxml.ArithmeticCalculatorAspects">
    </bean>
    <bean id="aopAround" class="com.aspectsAopxml.ArithmeticCalculatorAspectsAround">
    </bean>
    <!-- 配置AOP -->
    <aop:config>
        <!-- 配置切点表达式 -->
        <aop:pointcut
            expression="execution(* com.aspectsAopxml.bean.ArithmeticCalculator.*(..))"
            id="pointcut" />
        <!-- 配置切面及通知 -->
        <aop:aspect ref="aopxx" order="2">
            <aop:before method="beforeMethod" pointcut-ref="pointcut" />
            <aop:after method="afterMethod" pointcut-ref="pointcut" />
            <aop:after-throwing method="afterThrowing"
                pointcut-ref="pointcut" throwing="e" />
            <aop:after-returning method="afterReturning"
                pointcut-ref="pointcut" returning="result" />
        </aop:aspect>
        <aop:aspect ref="aopAround" order="1">
            <aop:around method="aroundMethods" pointcut-ref="pointcut"/>
        </aop:aspect>
    </aop:config>
</beans>
        

 

切面

package com.aspectsAopxml;

import java.util.Arrays;
import org.aspectj.lang.ProceedingJoinPoint;

public class ArithmeticCalculatorAspectsAround 

    public Object aroundMethods(ProceedingJoinPoint point) 

        Object result = null;
        Object args = point.getArgs();
        String methodName = point.getSignature().getName();
        try 
            // 1.前置通知
            System.out.println("环绕前置通知信息Method:" + methodName + "<参数>==》" + Arrays.asList(args));
            // 2.执行目标方法
            result = point.proceed();
            // 3.返回通知
            System.out.println("环绕后置通知信息Method:" + methodName + "<参数>==》" + Arrays.asList(args) + "》》结果:" + result);
         catch (Throwable e) 
            // 4.异常通知
            System.out.println("环绕后置通知信息Method:" + methodName + "<参数>==》" + Arrays.asList(args) + "异常信息:" + e);
            throw new RuntimeException(e);
        
        // 5.方法完成后的返回通知
        System.out.println("环绕方法执行完成通知信息Method:" + methodName + "<参数>==》" + Arrays.asList(args));
        return result;
    

 

package com.aspectsAopxml;

import java.util.Arrays;
import org.aspectj.lang.JoinPoint;

public class ArithmeticCalculatorAspects 

    public void beforeMethod(JoinPoint joinPoint) 

        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        System.out.println("Methods befor......." + methodName + "-->args=>" + Arrays.asList(args));
    

    public void afterMethod(JoinPoint joinPoint) 

        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        System.out.println("Methods after......." + methodName + "-->args=>" + Arrays.asList(args));
    

    public void afterReturning(JoinPoint joinPoint, Object result) 

        String methodName = joinPoint.getSignature().getName();
        System.out.println("Methods afterReturn......." + methodName + "===" + result);
    

    public void afterThrowing(JoinPoint joinPoint, Exception e) 

        String methodName = joinPoint.getSignature().getName();
        System.out.println("Methods afterTh......." + methodName + "===异常信息:" + e);
    

 

测试

package com;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.aspectsAopxml.bean.ArithmeticCalculator;

public class Main 

    public static void main(String[] args) 

        ApplicationContext ctx = new ClassPathXmlApplicationContext("application-aspects.xml");
        ArithmeticCalculator target = (ArithmeticCalculator) ctx.getBean("arithmeticCalculator");
        int result = target.add(1, 2);
        System.out.println("result--->:" + result);
        result = target.sub(20, 12);
        System.out.println("result--->:" + result);
        result = target.mul(8, 8);
        System.out.println("result--->:" + result);
        result = target.div(1000, 0);
        System.out.println("result--->:" + result);
    

 

以上是关于SpringAop的主要内容,如果未能解决你的问题,请参考以下文章

Spring AOP

Spring AOP

Spring-AOP和IOC调用过程

Spring-AOP和IOC调用过程

Spring AOP 实现方式与应用