spring启动前的AspectJ
假设我有一个spring启动应用程序spring启动前的AspectJ,spring,spring-boot,aop,aspectj,spring-aop,Spring,Spring Boot,Aop,Aspectj,Spring Aop,假设我有一个spring启动应用程序 @SpringBootApplication public abstract class AbstractMicroServer { public static void main(final String[] args) { // here some asppect should start final SpringApplication app = new SpringApplication(AbstractMi
@SpringBootApplication
public abstract class AbstractMicroServer {
public static void main(final String[] args) {
// here some asppect should start
final SpringApplication app = new SpringApplication(AbstractMicroServer.class);
app.run(args);
}
}
我的aspectJ类
@Aspect
public class AOP{
@Pointcut("execution(* org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.ignoreResourceType(..)")
public void intercept() {
}
@Around("intercept()")
public Object intercept(final ProceedingJoinPoint joinPoint) throws Throwable {
return joinPoint.getArgs();
}
}
我希望这个方面在春季启动之前准备好。这可能是我想做的吗?这方面没有被截获的原因,我不知道
聚甲醛
org.aspectj
aspectjrt
1.8.12
org.aspectj
aspectjweaver
1.8.12
org.codehaus.mojo
aspectj maven插件
1.10
1.8
1.8
1.8
真的
真的
忽视
UTF-8
**/*.爪哇
**/*.aj
编译
测试编译
我没有使用spring boot starter aop。以上是我对aop的所有配置和代码 在我看来,您希望在Spring类中拦截方法执行。为此,您有两种选择:
- 使用加载时编织(
作为JVM参数)-javaagent:/path/to/aspectjweaver-.jar
- 在构建时编织Spring库类以创建库()的特殊编织版本,并使用生成的编织类而不是原始Spring jar文件。您得到的配置与此类似:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <configuration> <weaveDependencies> <weaveDependency> <groupId>org.agroup</groupId> <artifactId>to-weave</artifactId> </weaveDependency> <weaveDependency> <groupId>org.anothergroup</groupId> <artifactId>gen</artifactId> </weaveDependency> </weaveDependencies> </configuration> </plugin>
org.codehaus.mojo aspectj maven插件 org.agroup 编织 org.anothergroup 消息
CommonAnnotationBeanPostProcessor
,没有代理。因此,Spring AOP无法拦截对CommonAnnotationBeanPostProcessor
的ignoreResourceType
方法的任何调用
然而,这并不意味着你运气不好。您仍然可以利用AspectJ的二进制编织
AspectJ
二元织造
在二进制编织中,目标和方面源代码(*.java)分别编译成二进制类(.class)。然后将二进制类与AspectJ编译器(ajc)组合在一起
在您的例子中,方面源代码(AOP.java
)将使用AspectJ编译器编译成二进制类(AOP.class
)。AOP.class
和现有的Spring类CommonAnnotationBeanPostProcessor.class
将被编织到一起,形成一个新的编织CommonAnnotationBeanPostProcessor.class
编前编码
下面是类CommonAnnotationBeanPostProcessor
的ignoreResourceType
方法的代码片段
public void ignoreResourceType(String resourceType) {
Assert.notNull(resourceType, "Ignored resource type must not be null");
this.ignoredResourceTypes.add(resourceType);
}
编后编码
现在,请注意AspectJ编织方法后的更改
public void ignoreResourceType(String resourceType) {
JoinPoint var3 = Factory.makeJP(ajc$tjp_0, this, this, resourceType);
SpringFrameworkClassAspect var10000 = SpringFrameworkClassAspect.aspectOf();
Object[] var4 = new Object[]{this, resourceType, var3};
var10000.adviceAround((new CommonAnnotationBeanPostProcessor$AjcClosure1(var4)).linkClosureAndJoinPoint(69648));
}
如何实现AspectJ二进制编织?
- 您可以在的帮助下生成二进制编织
- 您仍然需要aspect类
- 确保在
下包含weaveDependencies
依赖项spring上下文
pom.xml
插件部分的摘录。您可以找到一个完整的工作示例
org.codehaus.mojo
aspectj maven插件
1.10
1.8
1.8
${java.version}
忽视
真的
${project.build.directory}/classes
org.springframework
spring上下文
org.springframework
春季方面
编译
测试编译
org.aspectj
aspectjrt
${aspectj.version}
org.aspectj
aspectjtools
${aspectj.version}
public void ignoreResourceType(String resourceType) {
JoinPoint var3 = Factory.makeJP(ajc$tjp_0, this, this, resourceType);
SpringFrameworkClassAspect var10000 = SpringFrameworkClassAspect.aspectOf();
Object[] var4 = new Object[]{this, resourceType, var3};
var10000.adviceAround((new CommonAnnotationBeanPostProcessor$AjcClosure1(var4)).linkClosureAndJoinPoint(69648));
}
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.10</version>
<configuration>
<showWeaveInfo/>
<source>1.8</source>
<target>1.8</target>
<complianceLevel>${java.version}</complianceLevel>
<Xlint>ignore</Xlint>
<forceAjcCompile>true</forceAjcCompile>
<sources/>
<weaveDirectories>
<weaveDirectory>${project.build.directory}/classes</weaveDirectory>
</weaveDirectories>
<weaveDependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</weaveDependencies>
<aspectLibraries>
<aspectLibrary>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>