AOP aspectj idea 笔记

 

1、 idea专业版本 (非专业版不支持aspectj)

2、创建个maven项目 

加入如下依赖   plugin尤其重要 ,需要运行编译后版本,才能发现生效

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.9.6</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjtools</artifactId>
    <version>1.9.6</version>
</dependency>
 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>com.nickwongdev</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.12.6</version>
<!--                <groupId>org.codehaus.mojo</groupId>-->
<!--                <artifactId>aspectj-maven-plugin</artifactId>-->
<!--                <version>1.11</version>-->
                <configuration>
                    <complianceLevel>1.8</complianceLevel>
                    <source>1.8</source>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

 

3、配置AJC编译jar

 

4、 写拦截器类 


@Slf4j
@Aspect
public class SimpleIntercept {

    @Pointcut("execution(public * org.simple.aop.web..*(..))")
    public void traceLogAspect() {
    }

    @Before(value = "traceLogAspect()")
    public void doBefore() {
        System.out.println("-------------before");
    }

    @Around(value = "traceLogAspect()")
    public Object doAround(ProceedingJoinPoint pjp) {
        System.out.println("-------------doAround--start");
        Object ob = null;
        try {
            //请求埋点
            ob = pjp.proceed();
            //成功埋点
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("-------------doAround--end");
        return ob;

    }
    @AfterReturning(returning = "obj", pointcut = "traceLogAspect()")
    public void doAfterReturning(Object obj) {
        System.out.println("-------------doAfterReturning");
    }

    @AfterThrowing(throwing = "ex"  ,pointcut = "traceLogAspect()")
    public void AfterThrowing(Throwable ex) {
        System.out.println("-------------AfterThrowing");
    }
    @After(value = "traceLogAspect()")
    public void doAfter() {
        System.out.println("-------------doAfter");
    }

}

5、写业务类



public class SimpleWepApp {

    public String simple() {
        return this.getClass().getName();
    }


}

6、写启动类

public class Application {
    public static void main(String[] args) {

        SimpleWepApp app = new SimpleWepApp();
        String simple = app.simple();
        System.out.println(simple);

    }
}

7、 编译当前应用,并运行启动函数

最终AOP --aspectj的执行顺序如下

-------------before
-------------doAround--start
-------------doAround--end
-------------doAfterReturning
-------------doAfter
org.simple.aop.web.SimpleWepApp

 

8、懵逼问题 

1、业务类抛异常case    并且支持顺序存在差异    另外AfterThrowing 并没有生效(最终解决之后发现完全是大意了)

-------------before
-------------doAround--start
java.lang.RuntimeException
	at org.simple.aop.web.SimpleWepApp.simple_aroundBody0(SimpleWepApp.java:8)
	at org.simple.aop.web.SimpleWepApp.simple_aroundBody1$advice(SimpleWepApp.java:27)
	at org.simple.aop.web.SimpleWepApp.simple(SimpleWepApp.java:8)
	at org.simple.aop.Application.main(Application.java:9)
-------------doAround--end
-------------doAfterReturning
-------------doAfter
null
-------------before
-------------doAround--start
-------------doAround--end
-------------doAfterReturning
-------------doAfter
null
java.lang.RuntimeException
	at org.simple.aop.web.SimpleWepApp.simple_aroundBody0(SimpleWepApp.java:8)
	at org.simple.aop.web.SimpleWepApp.simple_aroundBody1$advice(SimpleWepApp.java:27)
	at org.simple.aop.web.SimpleWepApp.simple(SimpleWepApp.java:8)
	at org.simple.aop.Application.main(Application.java:9)

编译后业务代码如下  看着感觉流程很正常

public class SimpleWepApp {
    public SimpleWepApp() {
    }

    public String simple() {
        JoinPoint var1 = Factory.makeJP(ajc$tjp_0, this, this);

        String var6;
        try {
            try {
                SimpleIntercept.aspectOf().doBefore();
                String var2;
                String var3 = var2 = (String)simple_aroundBody1$advice(this, var1, SimpleIntercept.aspectOf(), (ProceedingJoinPoint)var1);
                SimpleIntercept.aspectOf().doAfterReturning(var3);
                var6 = var2;
            } catch (Throwable var7) {
                SimpleIntercept.aspectOf().AfterThrowing(var7);
                throw var7;
            }
        } catch (Throwable var8) {
            SimpleIntercept.aspectOf().doAfter();
            throw var8;
        }

        SimpleIntercept.aspectOf().doAfter();
        return var6;
    }

    static {
        ajc$preClinit();
    }
}

找到问题原因  替换如下两种case均可 around的case 把 异常处理了   导致最终没有出现异常    AfterThrowing 在around之后 导致无法触发

   @Around(value = "traceLogAspect()")
    public Object doAround(ProceedingJoinPoint pjp) {
        System.out.println("-------------doAround--start");
        Object ob = null;
        try {
            //请求埋点
            ob = pjp.proceed();
            //成功埋点
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("-------------doAround--end");
        return ob;
    }



    @Around(value = "traceLogAspect()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("-------------doAround--start");
        Object ob = null;
        try {
            //请求埋点
            ob = pjp.proceed();
            //成功埋点
        } catch (Throwable e) {
            throw e;
        }
        System.out.println("-------------doAround--end");
        return ob;
    }



    @Around(value = "traceLogAspect()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("-------------doAround--start");
        Object ob = null;

        ob = pjp.proceed();

        System.out.println("-------------doAround--end");
        return ob;
    }

 

最终结果如下 

-------------before
-------------doAround--start
-------------AfterThrowing
-------------doAfter
Exception in thread "main" java.lang.RuntimeException
	at org.simple.aop.web.SimpleWepApp.simple_aroundBody0(SimpleWepApp.java:8)
	at org.simple.aop.web.SimpleWepApp.simple_aroundBody1$advice(SimpleWepApp.java:25)
	at org.simple.aop.web.SimpleWepApp.simple(SimpleWepApp.java:8)
	at org.simple.aop.Application.main(Application.java:9)

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值