diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8791009 --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ + +target/ +**/target/** +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/README.md b/README.md index a706fbe..3d16d04 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,17 @@ # LoadTimeWeaving-demo -LTW(LoadTimeWeaving)技术实现AOP功能 \ No newline at end of file +LTW(LoadTimeWeaving)技术实现AOP功能 + + + +参考了: +https://www.eclipse.org/aspectj/doc/released/devguide/ltw-configuration.html + +执行步骤: +1.mvn clean package,得到jar包:java-aspectj-agent-1.0-SNAPSHOT + +2.把aspectjweaver-1.8.2.jar拷贝到和本jar包同路径下 + +3.cmd下执行: +java -javaagent:aspectjweaver-1.8.2.jar -cp java-aspectj-agent-1.0-SNAPSHOT.jar cn.x47.ltw.Main + diff --git a/java-aspectj-agent/pom.xml b/java-aspectj-agent/pom.xml new file mode 100644 index 0000000..70381f8 --- /dev/null +++ b/java-aspectj-agent/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + cn.x47.blog + LoadTimeWeaving-demo + 1.0 + + + java-aspectj-agent + 1.0 + jar + + + + com.alibaba + fastjson + + + org.aspectj + aspectjweaver + + + diff --git a/java-aspectj-agent/src/main/java/cn/x47/ltw/Main.java b/java-aspectj-agent/src/main/java/cn/x47/ltw/Main.java new file mode 100644 index 0000000..bc09ecc --- /dev/null +++ b/java-aspectj-agent/src/main/java/cn/x47/ltw/Main.java @@ -0,0 +1,19 @@ +package cn.x47.ltw; + +import com.alibaba.fastjson.JSON; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author xuwei + */ +public final class Main { + + public static void main(String[] args) { + Map map = new HashMap<>(1); + map.put("key", "ssss"); + JSON.toJSONString(map); + + } +} diff --git a/java-aspectj-agent/src/main/java/cn/x47/ltw/ProfilingAspect.java b/java-aspectj-agent/src/main/java/cn/x47/ltw/ProfilingAspect.java new file mode 100644 index 0000000..cc92793 --- /dev/null +++ b/java-aspectj-agent/src/main/java/cn/x47/ltw/ProfilingAspect.java @@ -0,0 +1,26 @@ +package cn.x47.ltw; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; + +/** + * @author xuwei + */ +@Aspect +public class ProfilingAspect { + + @Pointcut("execution(public * com.alibaba.fastjson.JSON.toJSONString(java.lang.Object))") + public void p2() { + } + + @Around("p2()") + public Object profile2(ProceedingJoinPoint pjp) throws Throwable { + System.out.println("A2"); + Object proceed = pjp.proceed(); + System.out.println(proceed); + System.out.println("q2"); + return proceed; + } +} \ No newline at end of file diff --git a/java-aspectj-agent/src/main/resources/META-INF/aop.xml b/java-aspectj-agent/src/main/resources/META-INF/aop.xml new file mode 100644 index 0000000..1139c17 --- /dev/null +++ b/java-aspectj-agent/src/main/resources/META-INF/aop.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..e2838d5 --- /dev/null +++ b/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + cn.x47.blog + LoadTimeWeaving-demo + 1.0 + pom + LoadTimeWeaving-demo + https://www.61dz.com + + + org.springframework.boot + spring-boot-starter-parent + 2.7.3 + + + + + java-aspectj-agent + springboot-aspectj-agent + + + + UTF-8 + 1.8 + 1.8 + + + + + + org.springframework.boot + spring-boot-starter-parent + 2.7.3 + pom + import + + + org.aspectj + aspectjweaver + 1.9.6 + + + com.alibaba + fastjson + 2.0.12 + + + + diff --git a/springboot-aspectj-agent/pom.xml b/springboot-aspectj-agent/pom.xml new file mode 100644 index 0000000..1ad4ca1 --- /dev/null +++ b/springboot-aspectj-agent/pom.xml @@ -0,0 +1,61 @@ + + + 4.0.0 + + cn.x47.blog + LoadTimeWeaving-demo + 1.0 + + + aspectj-agent-springboot + 1.0 + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + com.alibaba + fastjson + 2.0.12 + + + + org.springframework.boot + spring-boot-starter-aop + + + + org.aspectj + aspectjweaver + 1.9.9 + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/springboot-aspectj-agent/src/main/java/cn/x47/ltw/springboot/TestApplication.java b/springboot-aspectj-agent/src/main/java/cn/x47/ltw/springboot/TestApplication.java new file mode 100644 index 0000000..881f77a --- /dev/null +++ b/springboot-aspectj-agent/src/main/java/cn/x47/ltw/springboot/TestApplication.java @@ -0,0 +1,23 @@ +package cn.x47.ltw.springboot; + +import com.alibaba.fastjson.JSON; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author xuwei + */ +@SpringBootApplication +public class TestApplication { + + public static void main(String[] args) { + SpringApplication.run(TestApplication.class, args); + Map map = new HashMap<>(1); + map.put("key", "ssss"); + JSON.toJSONString(map); + } + +} diff --git a/springboot-aspectj-agent/src/main/java/cn/x47/ltw/springboot/aop/TestAspect.java b/springboot-aspectj-agent/src/main/java/cn/x47/ltw/springboot/aop/TestAspect.java new file mode 100644 index 0000000..3f69427 --- /dev/null +++ b/springboot-aspectj-agent/src/main/java/cn/x47/ltw/springboot/aop/TestAspect.java @@ -0,0 +1,27 @@ +package cn.x47.ltw.springboot.aop; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; + +/** + * @author xuwei + */ +@Aspect +public class TestAspect { + + @Around("execution(* com.alibaba.fastjson..*.*(..))") + public String parse2String(ProceedingJoinPoint join) { + System.out.println("parse to String before"); + String str = ""; + try { + str = (String) join.proceed(); + System.out.println("result:" + str); + } catch (Throwable e) { + e.printStackTrace(); + } + System.out.println("parse to String after"); + return str; + } + +} diff --git a/springboot-aspectj-agent/src/main/java/cn/x47/ltw/springboot/controller/TestController.java b/springboot-aspectj-agent/src/main/java/cn/x47/ltw/springboot/controller/TestController.java new file mode 100644 index 0000000..6e5c426 --- /dev/null +++ b/springboot-aspectj-agent/src/main/java/cn/x47/ltw/springboot/controller/TestController.java @@ -0,0 +1,23 @@ +package cn.x47.ltw.springboot.controller; + +import com.alibaba.fastjson.JSON; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author xuwei + */ +@RestController +@RequestMapping("/test") +public class TestController { + @GetMapping + public Object test(String a) { + Map map = new HashMap<>(1); + map.put("key", a); + return JSON.toJSONString(map); + } +} diff --git a/springboot-aspectj-agent/src/main/resources/META-INF/aop.xml b/springboot-aspectj-agent/src/main/resources/META-INF/aop.xml new file mode 100644 index 0000000..b3ee8ab --- /dev/null +++ b/springboot-aspectj-agent/src/main/resources/META-INF/aop.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/springboot-aspectj-agent/src/main/resources/application.yml b/springboot-aspectj-agent/src/main/resources/application.yml new file mode 100644 index 0000000..47fbb02 --- /dev/null +++ b/springboot-aspectj-agent/src/main/resources/application.yml @@ -0,0 +1,2 @@ +server: + port: 8080 \ No newline at end of file diff --git a/springboot-aspectj-agent/src/test/java/cn/x47/ltw/springboot/TestApplicationTests.java b/springboot-aspectj-agent/src/test/java/cn/x47/ltw/springboot/TestApplicationTests.java new file mode 100644 index 0000000..7f04902 --- /dev/null +++ b/springboot-aspectj-agent/src/test/java/cn/x47/ltw/springboot/TestApplicationTests.java @@ -0,0 +1,13 @@ +package cn.x47.ltw.springboot; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class TestApplicationTests { + + @Test + void contextLoads() { + } + +}