Spring spring 启动 2.1.6 应用程序中未调用 AOP

Spring AOP not getting invoked in spring boot 2.1.6 application

在 google 上关注了很多关于这个主题的搜索结果后,我的方面仍然无法在我的 spring 启动应用程序上工作

我使用的是spring引导版本2.1.6,好像已经springaop、aspectjweaver和aspectjrt(有待更正)。我创建了一个注解,方面组件并在目标上使用我的注解 class 但没有成功。

这是我的注释class

    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;

    import static java.lang.annotation.ElementType.*;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;

    @Retention(RUNTIME)
    @Target({TYPE, METHOD})
    public @interface AopAudit {
    }

我的方面class

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

    @Aspect
    @Component
    public class AuditAnnotationAspect {
        @Before("execution(* com.rainestech.hrm.modules.settings.entity.ABC.set*(..))")
        public void before(JoinPoint joinPoint) {
    System.out.println("Audit Works!!! = ");
        }
    }

class ABC

@Entity
@AopAudit
public class ABC {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @NotEmpty
    @NotNull
    @Column
    private String name;

    //... getters and setters
}

配置class

@Configuration
@EnableWebSecurity
@EnableAspectJAutoProxy
public class WebSecurity extends WebSecurityConfigurerAdapter {

}

运行 应用程序和 运行 在 class ABC 上设置方法没有效果,而我希望在控制台中看到 Audit Works

首先,确保您的 pom.xml 包含所有这些:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>aspectj-maven-plugin</artifactId>
                <version>1.4</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

其次,使用 @EnableAspectJAutoProxy 注释您的配置,这将启用它。

第三,确保更新切入点:

@Pointcut("@annotation(com.path.to.your.annotation.AopAudit)")
private void auditable() {}

然后在您的 @Before 中使用它。

@Before("auditable()")

另一个需要注意的重要事项是您不能执行位于同一 class 上的方法切入点。更多信息 here.

只是一个非常愚蠢的评论,因为它花了我一天的时间:-(。 不要忘记 @Autowire 你是带注释的对象。 AOP 通常只有在您通过 @Component 扫描的上下文解析所有内容时才有效!

//This will work : Resolve everything trough the @Component container context
@Autowired
FeatureAnnotationAspect aspspectTest;

@Test
public void testAnnotationIntersception() 
{
    log.debug("TestFeatureFlagAspect::testAnnotationIntersception");
   //This wont work! You need to Autowire the object to get all annotations and AOP working!
    //aspcetTest = new FeatureAnnotationAspect();
    aspectTest.Annotate(0);
}