AspectJ without Spring framework

使用runtime weave模式

1. mvn pom.xml. 开发工具使用jdk18, 本次cmd使用了jkd11

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>blue.sky</groupId>

<artifactId>luckdog</artifactId>

<version>1.0-SNAPSHOT</version>

<packaging>jar</packaging>

<name>goodluck</name>

<!-- <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.12</version></parent>-->

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<java.version>18</java.version>

</properties>

<dependencies>

<dependency>

<groupId>com.fasterxml.jackson.dataformat</groupId>

<artifactId>jackson-dataformat-xml</artifactId>

<version>2.12.6</version>

</dependency>

<!-- Jackson Databind -->

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.12.6.1</version>

</dependency>

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjrt</artifactId>

<version>1.9.7</version>

</dependency>

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>1.9.7</version>

</dependency>

</dependencies>

<build>

<plugins>

<plugin>

<groupId>org.codehaus.mojo</groupId>

<artifactId>aspectj-maven-plugin</artifactId>

<version>1.14.0</version>

<executions>

<execution>

<goals>

<goal>compile</goal>

</goals>

</execution>

</executions>

<configuration>

<source>11</source>

<target>11</target>

<!--<aspectLibraries><aspectLibrary><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.7</version></aspectLibrary></aspectLibraries>-->

</configuration>

<dependencies>

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjtools</artifactId>

<version>1.9.7</version>

</dependency>

</dependencies>

<!-- <configuration><complianceLevel>21</complianceLevel><showWeaveInfo>true</showWeaveInfo><verbose>true</verbose><encoding>UTF-8</encoding></configuration>-->

</plugin>

<!-- https://mvnrepository.com/artifact/dev.aspectj/aspectj-maven-plugin -->

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>3.8.1</version>

<configuration>

<source>11</source>

<target>11</target>

</configuration>

</plugin>

</plugins>

</build>

</project>

2. 编写aspectLog

https://howtodoinjava.com/spring-aop/aspectj-pointcut-expressions/

package com.solace.util;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.Signature;

import org.aspectj.lang.annotation.After;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;

import com.fasterxml.jackson.core.JsonProcessingException;

import com.fasterxml.jackson.databind.ObjectMapper;

@Aspect

public class LogAspect {

private static final ObjectMapper mapper = new ObjectMapper();

@Pointcut("execution(* com.solace.biz..*(..))")

public void serviceMethods(){}

@Before("serviceMethods()")

//@Before("execution(* com.solace.biz..*(..))")

public void beforeInvoke(JoinPoint joinPoint) throws JsonProcessingException {

Object[] args = joinPoint.getArgs();

Signature sga= joinPoint.getSignature();

String methodName = joinPoint.getSignature().getName();

String clzName = sga.getDeclaringTypeName();

System.out.println("Before invoke task...");

System.out.println("class: "+ clzName);

System.out.println("method: "+ methodName);

System.out.println("Parameters: "+ mapper.writeValueAsString( args));

}

//@After("serviceMethods()")

@After("execution(* com.solace.biz..*(..))")

public void afterInvoke() {

System.out.println("After invoke task...");

}

@AfterReturning(pointcut ="execution(public * com.psa.tos.ydms.domain.yc.business.*.*(..))", returning = "result")

public void afterReturn(JoinPoint joinPoint,Object result) throws JsonProcessingException {

Object[] args = joinPoint.getArgs();

Signature sga= joinPoint.getSignature();

String methodName = joinPoint.getSignature().getName();

String clzName = sga.getDeclaringTypeName();

String info="----"+clzName +"."+methodName + "() with retValue: "+ mapper.writeValueAsString( result);

System.out.println(info);

}

}

3. 测试方法

package com.solace.biz;

public class AdminBiz {

public void test(String msg) {

System.out.println("Message("+msg+") is sent successfully!");

}

}

package com.solace;

import com.solace.biz.AdminBiz;

public class AdminMain {

public static void main(String[] args) {

AdminBiz ts=new AdminBiz();

ts.test("Good luck from sky!");

}

}

4.  配置aop.xml

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "https://www.eclipse.org/aspectj/dtd/aspectj.dtd">

<aspectj>

<weaver options="-verbose -showWeaveInfo">

<include within="com.solace..*"/>

</weaver>

<aspects>

<aspect name="com.solace.util.LogAspect"/>

</aspects>

</aspectj>

1. 默认位置:文件放在target\classes\META-INF下, 否则动态加载不生效

2. 文件放在一个目录下, 使用变量设置文件所在位置。下面的配置就是编译后被放在target\classes目录下。源文件放在resources下。

      -Dorg.aspectj.weaver.loadtime.configuration=aop.xml

3.启动是加入JVM参数:

-javaagent:C:/axxx/aspectJ/lib/aspectjweaver-1.9.7.jar

java -javaagent:C:\tuasprj\aspectJ\lib\aspectjweaver-1.9.7.jar -Dorg.aspectj.weaver.loadtime.configuration=aop.xml

4. gradle+ junit5+aspectJ

test {

useJUnitPlatform()

//jvmArgs '-javaagent:C:/xxx/xx/lib/aspectjweaver.jar'

jvmArgs = ['-javaagent:./lib/aspectjweaver-1.9.7.jar', '-Dorg.aspectj.weaver.loadtime.configuration=aop.xml']

启动即可看到打印的log方法

https://www.baeldung.com/aspectj

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值