Spring Aop

package com.neusoft.service;

/**
 * @author: user
 * @version: : UserService.java, 2020/4/7 16:13
 */
public interface UserService {
    public boolean testException(boolean b);
}
package com.neusoft.service.impl;

import com.neusoft.enums.ResultCode;
import com.neusoft.exception.DataException;
import com.neusoft.service.UserService;
import org.springframework.stereotype.Service;

/**
 * @author: user
 * @version: : UserServiceImpl.java, 2020/4/7 16:13
 */

@Service("userService")
public class UserServiceImpl implements UserService {
    public boolean testException(boolean b) {
        if(b){
            System.out.println("throw DataException before");
            throw new DataException(ResultCode.TEST_EXCEPTION.name());
        }
        return true;
    }
}
package com.neusoft.exception;

/**
 * @author: user
 * @version: : DataException.java, 2020/4/7 16:11
 */
public class DataException extends RuntimeException{
    public DataException(String message) {
        super(message);
    }

    public DataException() {
    }

}
package com.neusoft.enums;

import org.apache.commons.lang3.StringUtils;

/**
 * @author: user
 * @version: : ResultCode.java, 2020/4/7 16:08
 */

public enum ResultCode {
    SUCCESS(200, "successful"),//成功请求
    FAILURE(1,"操作失败"),
    SYSTEM_ERROR(2, "系统错误"),
    TEST_EXCEPTION(3,"异常测试示例结果"),
    ;

    private int code;
    private String message;

    private ResultCode(int code, String msg) {
        this.code = code;
        this.message = msg;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    public boolean isSuccess() {
        return this.code == 200;
    }

    public static ResultCode valueOf(int code) {
        for (ResultCode value : values()) {
            if (code == value.code) {
                return value;
            }
        }
        return SUCCESS;
    }


    public static boolean contains(String name) {
        if (StringUtils.isBlank(name)) {
            return false;
        } else {
            ResultCode[] var1 = values();
            int var2 = var1.length;

            for(int var3 = 0; var3 < var2; ++var3) {
                ResultCode value = var1[var3];
                if (value.name().equals(name)) {
                    return true;
                }
            }

            return false;
        }
    }

}
package com.neusoft.aspect;

/**
 * @author: user
 * @version: $ID: ServiceExceptionAspect.java, 2020/4/7 16:06
 */

import com.neusoft.enums.ResultCode;
import com.neusoft.exception.DataException;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Order(1)
@Aspect
@Component
public class ServiceExceptionAspect2 {

    private static final Logger logger = Logger.getLogger(ServiceExceptionAspect2.class);

    @Around("execution(* com.neusoft.service.impl..*.*(..))")//切点表达式以及通知类型
    public Object around(ProceedingJoinPoint joinPoint) {//通过joinPoint对象获取参数以及其他对象信息
        String MethodName = joinPoint.getSignature().getName();
        Object result = null;
        try {
            System.out.println("ServiceExceptionAspect2 come here");
            result = joinPoint.proceed();
        } catch (Throwable e) {
            if(ResultCode.contains(e.getMessage())){
                //throw new DataException(ResultCode.TEST_EXCEPTION.name());
                return true;
            }
            Object[] args = joinPoint.getArgs();
            StringBuffer stringBuffer = new StringBuffer();
            for (Object  ob :args){
                stringBuffer.append(ob);
                stringBuffer.append(",");
            }
            System.out.println("Method:"+MethodName+",Params:"+stringBuffer.toString()+"error:"+e.getMessage());
            return false;
        }
        return result;

    }

    @Before("execution(* com.neusoft.service.impl..*.*(..))")
    public void before(){
        System.out.println("ServiceExceptionAspect2 before");
    }

    @AfterReturning("execution(* com.neusoft.service.impl..*.*(..))")
    public void AfterReturning(){
        System.out.println("ServiceExceptionAspect2 AfterReturning");
    }

    @After("execution(* com.neusoft.service.impl..*.*(..))")
    public void After(){
        System.out.println("ServiceExceptionAspect2 After");
    }

    @AfterThrowing("execution(* com.neusoft.service.impl..*.*(..))")
    public boolean AfterThrowing(){
        System.out.println("ServiceExceptionAspect2 AfterThrowing");
        return true;
    }
}
package com.neusoft.aspect;

/**
 * @author: user
 * @version: $ID: ServiceExceptionAspect.java, 2020/4/7 16:06
 */
import com.neusoft.enums.ResultCode;
import com.neusoft.exception.DataException;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Order(2)
@Aspect
@Component
public class ServiceExceptionAspect {

    private static final Logger logger = Logger.getLogger(ServiceExceptionAspect.class);

    @Around("execution(* com.neusoft.service.impl..*.*(..))")//切点表达式以及通知类型
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {//通过joinPoint对象获取参数以及其他对象信息
        String MethodName = joinPoint.getSignature().getName();
        Object result = null;
        /*try {
            System.out.println("ServiceExceptionAspect come here");
            result = joinPoint.proceed();
        } catch (Throwable e) {
            if(ResultCode.contains(e.getMessage())){
                throw new DataException(ResultCode.TEST_EXCEPTION.name());
                //return true;
            }
            Object[] args = joinPoint.getArgs();
            StringBuffer stringBuffer = new StringBuffer();
            for (Object  ob :args){
                stringBuffer.append(ob);
                stringBuffer.append(",");
            }
            System.out.println("Method:"+MethodName+",Params:"+stringBuffer.toString()+"error:"+e.getMessage());
            return true;
        }
        return result;*/
        System.out.println("ServiceExceptionAspect come here");
        result = joinPoint.proceed();
        return result;
    }

    @Before("execution(* com.neusoft.service.impl..*.*(..))")
    public void before(){
        System.out.println("ServiceExceptionAspect before");
    }

    @AfterReturning("execution(* com.neusoft.service.impl..*.*(..))")
    public void AfterReturning(){
        System.out.println("ServiceExceptionAspect AfterReturning");
    }

    @After("execution(* com.neusoft.service.impl..*.*(..))")
    public void After(){
        System.out.println("ServiceExceptionAspect After");
    }

    @AfterThrowing("execution(* com.neusoft.service.impl..*.*(..))")
    public boolean AfterThrowing(){
        System.out.println("ServiceExceptionAspect AfterThrowing");
        return true;
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 自动扫描 ,将带有注解的类 纳入spring容器管理 -->
    <context:component-scan base-package="com.neusoft.*" />

    <aop:config proxy-target-class="true" />

    <aop:aspectj-autoproxy /><!-- 用户扫描aop实现类上@Aspect标签-->
</beans>
package com.neusoft.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.neusoft.service.UserService;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import static org.junit.Assert.*;

public class UserServiceImplTest {

    private static final String SERVICE_PROVIDER_XML = "classpath:spring/spring-service.xml";
    private static final String BEAN_NAME = "userService";

    private ClassPathXmlApplicationContext context = null;
    UserService bean = null;

    @Before
    public void before() {
        context= new ClassPathXmlApplicationContext(
                new String[] {SERVICE_PROVIDER_XML});
        context.start();
        bean = (UserService) context.getBean(BEAN_NAME);
    }

    @Test
    public void testException() {
       boolean result = bean.testException(true);
       System.out.println(result);
        //System.out.println(JSONObject.toJSONString());
    }
}
"D:\Program Files\Java\jdk1.8.0_221\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar=53037:D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.1.4\bin" -Dfile.encoding=GBK -classpath "D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.1.4\lib\idea_rt.jar;D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.1.4\plugins\junit\lib\junit-rt.jar;D:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2018.1.4\plugins\junit\lib\junit5-rt.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;D:\source\javatest\springaopmvntest\target\test-classes;D:\source\javatest\springaopmvntest\target\classes;C:\Users\user\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\user\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\user\.m2\repository\org\springframework\spring-context\4.1.6.RELEASE\spring-context-4.1.6.RELEASE.jar;C:\Users\user\.m2\repository\org\springframework\spring-aop\4.1.6.RELEASE\spring-aop-4.1.6.RELEASE.jar;C:\Users\user\.m2\repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;C:\Users\user\.m2\repository\org\springframework\spring-beans\4.1.6.RELEASE\spring-beans-4.1.6.RELEASE.jar;C:\Users\user\.m2\repository\org\springframework\spring-expression\4.1.6.RELEASE\spring-expression-4.1.6.RELEASE.jar;C:\Users\user\.m2\repository\org\springframework\spring-core\4.1.6.RELEASE\spring-core-4.1.6.RELEASE.jar;C:\Users\user\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\user\.m2\repository\org\springframework\spring-tx\4.1.6.RELEASE\spring-tx-4.1.6.RELEASE.jar;C:\Users\user\.m2\repository\org\springframework\spring-test\4.1.6.RELEASE\spring-test-4.1.6.RELEASE.jar;C:\Users\user\.m2\repository\log4j\log4j\1.2.16\log4j-1.2.16.jar;C:\Users\user\.m2\repository\net\logstash\log4j\jsonevent-layout\1.7\jsonevent-layout-1.7.jar;C:\Users\user\.m2\repository\net\minidev\json-smart\1.1.1\json-smart-1.1.1.jar;C:\Users\user\.m2\repository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;C:\Users\user\.m2\repository\org\aspectj\aspectjweaver\1.8.5\aspectjweaver-1.8.5.jar;C:\Users\user\.m2\repository\org\aspectj\aspectjrt\1.8.5\aspectjrt-1.8.5.jar;C:\Users\user\.m2\repository\org\apache\commons\commons-lang3\3.3.2\commons-lang3-3.3.2.jar;C:\Users\user\.m2\repository\com\alibaba\fastjson\1.2.35\fastjson-1.2.35.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.neusoft.service.impl.UserServiceImplTest,testException
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
ServiceExceptionAspect2 come here
ServiceExceptionAspect2 before
ServiceExceptionAspect come here
ServiceExceptionAspect before
throw DataException before
ServiceExceptionAspect After
ServiceExceptionAspect AfterThrowing
ServiceExceptionAspect2 After
ServiceExceptionAspect2 AfterReturning
true

Process finished with exit code 0

上述AOP的切面按照递归的方式依次执行,本例中两个aspect 通过@order 设置了顺序,从执行日志中可以看出执行顺序。ServiceExceptionAspect 切面 执行了AfterThrowing,而ServiceExceptionAspect2 未执行。

原因在于@Around 是否catch了异常:spring AOP中的AfterThrowing增强处理可以对目标方法的异常进行处理,但这种处理与直接使用catch捕捉处理异常的方式不同,catch捕捉意味着能完全处理异常,即只要catch块本身不抛出新的异常,则被处理的异常不会往上级调用者进一步传播下去;但是如果使用了AfterThrowing增强处理用于对异常进行处理,处理后异常仍然会往上一级调用者传播,如果是在main中调用的目标方法,那么异常会直接传到JVM
另外需要注意:如果目标方法中出现异常,并由catch捕捉处理且catch又没有抛出新的异常,那么针对该目标方法的AfterThrowing增强处理将不会被执行。

 


其他两种xml AOP方式

  • 通过AbstractPointcutAdvisor

  其中CacheInterceptor

public class CacheInterceptor implements MethodInterceptor{
        Object invoke(MethodInvocation var1) throws Throwable{
        }
}

  其中CacheMethodMatcherPointcut

import org.springframework.aop.support.StaticMethodMatcherPointcut;

import java.lang.reflect.Method;


public class CacheMethodMatcherPointcut extends StaticMethodMatcherPointcut {

    @Override
    public boolean matches(Method method, Class<?> targetClass) {
        return false;
    }

   //***** 盾啊
}

   其中CachePointcutAdvisor 

public CachePointcutAdvisor extends AbstractPointcutAdvisor{
    /**
     * 自定义的拦截器
     */
    private MethodInterceptor methodInterceptor;

    /**
     * 自定义切点,识别缓存注解
     */
    private Pointcut pointcut;
    

    //**** 其他代码
}
<!-- 支持并发的缓存拦截器 -->
<bean id="CacheInterceptor" class="com.wuyy.core.service.cache.CacheInterceptor"/>

<!-- 识别缓存注解的切点 -->
<bean id="cacheMethodMatcherPointcut"
      class="com.wuyy.service.cache.CacheMethodMatcherPointcut">
    <property name="cachePackage" value="com.wuyy.core.service"/>
</bean>

<!-- 自定义PointcutAdvisor 识别缓存注解 -->
<bean id="cachePointcutAdvisor" class="com.wuyy.core.service.cache.CachePointcutAdvisor">
    <property name="methodInterceptor" ref="CacheInterceptor"/>
    <property name="pointcut" ref="cacheMethodMatcherPointcut"/>
</bean>
  • 通过BeanNameAutoProxyCreator beawnNames 和 interceptorNames

        其中FixedDataSyncRepositoryInterceptor

public class FixedDataSyncRepositoryInterceptor implements MethodInterceptor {
        Object invoke(MethodInvocation var1) throws Throwable{
      }
}
<bean id="fixedDataSyncRepositoryInterceptor"
      class="com.alipay.wuyy.service.interceptor.FixedDataSyncRepositoryInterceptor"/>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <property name="beanNames">
        <list>
            <value>wuyyTradeRepository</value>
            <value>***</value>
        </list>
    </property>
    <property name="interceptorNames">
        <list>
            <value>fixedDataSyncRepositoryInterceptor</value>
        </list>
    </property>
</bean>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值