Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
spring启动前的AspectJ_Spring_Spring Boot_Aop_Aspectj_Spring Aop - Fatal编程技术网

spring启动前的AspectJ

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

假设我有一个spring启动应用程序

@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类中拦截方法执行。为此,您有两种选择:

  • 使用加载时编织(
    -javaagent:/path/to/aspectjweaver-.jar
    作为JVM参数)
  • 在构建时编织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
    消息
    
弹簧AOP 运行时编织 由于Spring框架基于代理的特性,Spring AOP基于运行时编织。这意味着在Spring运行时将目标类转换为代理

在大多数情况下,Spring框架不会对其框架类进行代理。您感兴趣的类,
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>