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);
}
在 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);
}