我正在努力处理项目/回购中的所有交叉问题,如异常、授权等,并注入多个独立的spring-webflux项目,即通过构建可重用的微服务平台来处理交叉问题。
有人能建议如何做到这一点吗?
例如:-light4j处理所有交叉关注点,因为中间件只需要作为插件添加即可。但它与SpringWebflux不兼容。即使使用AspectJ,我们也不能对不同的项目使用相同的处理程序,除非它们在同一个父项目下。
我尝试使用AspectJ的加载时编织功能。我在不同的项目中定义了方面,并在当前项目中添加了一个插件(我想在其中使用(,但当异常发生时,aspectJ部分不会被调用
下面是我当前项目的pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dummy</groupId>
<artifactId>dummydmanagement</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>DummyManagement</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
<dependency>
<groupId>com.jaway.blog.aspectj</groupId>
<artifactId>annotations-element-value-pair-without-main-class</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>/home/mmt8281/codebase/annotations-element-value-pair-without-main-class/target/annotations-element-value-pair-without-main-class-1.0-SNAPSHOT.jar</systemPath>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
以下是方面项目的pom.xml
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jaway.blog.aspectj</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>annotations-element-value-pair-without-main-class</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
<target>1.8</target>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
连接gitHub链接:-
AspectJ代码
DummyManagement代码
;复制&粘贴编程";就是你用了一些你不懂的东西。也许先学习基础知识会更好。
话虽如此,考虑到您从博客文章中复制的方面模块是本机AspectJ:,有两种方法可以解决您的问题
-
通过编译后二进制编织或加载时编织,将所有想要使用方面的应用程序配置为也使用本机AspectJ。Spring手册介绍了如何使用LTW。
-
简单地将方面模块转换为Spring组件,并使所有客户端项目都使用SpringAOP。
后者是我所做的,因为我认为您只想在Spring项目中使用方面,并且只在Spring组件中注释公共方法。
原生的AspectJ解决方案将更加强大,因为它还可以与静态和受保护/私有方法一起工作,即使是对于非Spring代码,甚至是完全在Spring之外。但是,如果手枪就足够了,为什么要用大炮呢?
我给你发了两个提取请求:
- https://github.com/shas2hwat/AspectjMgmt/pull/1
- https://github.com/shas2hwat/DummyManagement/pull/1
在方面模块中需要更改的基本内容是:
- 删除AspectJ Maven插件
- 添加
org.springframework:spring-context
以便能够将@Component
添加到方面类 - 我还优化了一些其他的东西,比如更新AspectJ版本
然后,在应用程序模块中,您需要:
- 添加
org.aspectj:aspectjweaver
- 将方面模块的基本包名称添加到组件扫描中
- 我还通过到方面模块的固定路径删除了丑陋的系统依赖关系。如果在构建应用程序之前简单地在方面模块上运行
mvn clean install
,那么库将在本地Maven存储库中找到。(我认为,您迫切需要学习一些Maven基础知识。(
现在运行此应用程序时
@SpringBootApplication
@ComponentScan(basePackages = {"com.dummy.dummydmanagement", "com.jayway.blog"})
public class DummyManagementApplication {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(DummyManagementApplication.class, args);
context.getBean(ItemService.class).getAllItemsService();
}
// (...)
}
控制台日志将为:
YourAspect's aroundAdvice's body is now executed Before yourMethodAround is called.
Exception occured
YourAspect's aroundAdvice's body is now executed After yourMethodAround is called.
当然,注释静态主方法不适用于SpringAOP,这就是我删除注释的原因。这只适用于本机AspectJ。如果你需要,请告诉我,但我认为你应该保持简单,因为你显然不了解你正在使用的工具。
更新:因为无论出于什么原因,OP现在对我很生气,因为我告诉他不要直接在Telegram上给我发短信,他还删除了自己的存储库。对于任何感兴趣的人来说,这里是我的克隆,包含原始代码和我修复问题的修改,如上所述:
- https://github.com/kriegaex/AspectjMgmt,此处相关承诺
- https://github.com/kriegaex/DummyManagement,此处相关承诺