第十讲:AOP实现之agent类加载


目录

第十讲:AOP实现之agent类加载

学习目标

一、AOP实现之agent类加载(运行期间)

总结

第一:常用的利用代理进行增强

第二:aspectj插件的编译器,在编译期间对字节码进行修改的增强

第三:agent在运行期间的类加载时期进行了增强



学习目标

1.AOP的另一种实现及原理


一、AOP实现之agent类加载
(运行期间)

准备工作

package com.itheima.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    private static final Logger log = LoggerFactory.getLogger(MyService.class);

    final public void foo() {
        log.debug("foo()");
        this.bar();
    }

    public void bar() {
        log.debug("bar()");
    }
}
package com.itheima.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Aspect // ⬅️注意此切面并未被 Spring 管理
public class MyAspect {

    private static final Logger log = LoggerFactory.getLogger(MyAspect.class);
     //MyService类中的所有方法都被增强
    @Before("execution(* com.itheima.service.MyService.*())")
    public void before() {
        log.debug("before()");
    }
}
package com.itheima;

import com.itheima.service.MyService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class A10 {

    private static final Logger log = LoggerFactory.getLogger(A10.class);

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(A10.class, args);
        MyService service = context.getBean(MyService.class);

        log.debug("service class: {}", service.getClass());
        service.foo();

      
    }
}

 运行得到结果

因为我们  第一没有用aop的增强   第二没有加入插件 aspectj的插件  所以没有进行增强 

 我们这次使用agent增强 

运行时需要在 VM options 里加入 -javaagent:C:/Users/manyh/.m2/repository/org/aspectj/aspectjweaver/1.9.7/aspectjweaver-1.9.7.jar
    把其中 C:/Users/manyh/.m2/repository 改为你自己 maven 仓库起始地址

maven的起始仓库

  

 VM options在这里

   

设置后我们运行一下  看一下结果 

注意几点
1. 版本选择了 java 8, 因为目前的 aspectj-maven-plugin 1.14.0 最高只支持到 java 16
2. 运行时需要在 VM options 里加入 -javaagent:C:/Users/manyh/.m2/repository/org/aspectj/aspectjweaver/1.9.7/aspectjweaver-1.9.7.jar
    把其中 C:/Users/manyh/.m2/repository 改为你自己 maven 仓库起始地址

总结

AOP增强一共有三种增强的方式

第一:常用的利用代理进行增强

第二:aspectj插件的编译器,在编译期间对字节码进行修改的增强

第三:agent在运行期间的类加载时期进行了增强

这是开拓一下视野,在实际开发中,我们还是经常使用代理为主,也就是第一种

更多推荐