我有一个由Maven管理的Spring项目。而不是使用execution
pointcut指示符,如下所示:
@Before("execution(* my.app.TestUtil.myStaticClass(..))")
public void logBeforeTestUtil(JoinPoint joinPoint) {
System.out.println("*** hijacked : " + joinPoint.getSignature().getName());
}
我想使用调用
点切指示符,如下所示:
@Before("call(* my.app.TestUtil.myStaticClass(..))")
public void logBeforeTestUtil(JoinPoint joinPoint) {
System.out.println("*** hijacked : " + joinPoint.getSignature().getName());
}
但是,我的IDE(IntelliJ)告诉我,调用切入点指示符不受Spring
支持,即使我删除了pom.xml
中的spring-aop
。
我想提到上面的例子,execution
pointcut designator正在工作,而Spring AOP并不支持所有的AspectJ pointcut designator。
这个答案展示了如何在不使用Spring的情况下使用加载时间编织。我想知道我们是否可以在没有Spring AOP的情况下使用Spring+AspectJ。如果有,怎么做?
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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>my.app</groupId>
<artifactId>myapp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<spring.version>4.3.4.RELEASE</spring.version>
<jackson.version>2.7.3</jackson.version>
<aspectj.version>1.8.4</aspectj.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<aspectj.version>1.8.4</aspectj.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!--<dependency>-->
<!--<groupId>org.springframework</groupId>-->
<!--<artifactId>spring-aop</artifactId>-->
<!--<version>${spring.version}</version>-->
<!--</dependency>-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
application-context.xml
package my.app;
import org.springframework.context.annotation.*;
@Configuration
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED)
public class AppConfig {
}
META-INF/AOP.xml
<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
<weaver>
<include within="my.app.utils.*"/>
<include within="my.app.aspect.*"/>
</weaver>
<aspects>
<aspect name="my.app.aspect.LoggingAspect" />
</aspects>
</aspectj>
对于执行
,必须通知调用的代码。对于呼叫
,必须通知呼叫代码。调用代码是否在my.app.utils.*
或my.app.aspect.*
的范围内?这些是您配置的weaver要包含的唯一包。如果调用者来自org.springframework...或您的申请的其他部分,将不会被告知。
我想从类列表(可能属于不同的包)中记录所有方法的条目。注意,这些方法应该只属于指定的类。 我尝试了以下方法,但这些都不起作用 (1) 在这里使用if()切入点,我得到一个错误 (2) 使用切入点和aop的组合。xml在这里我得到一个错误 这里出了什么问题? 当然可以通过在切入点中单独指定每个类来实现,但这对于数百个类来说是不可扩展的。理想情况下,如果可以从外部文本文件中提取类列表(便于配置),那就
问题内容: 我有针对特定软件包的此工作代码,但我想针对所有 controllers , service 和 dao 软件包进行配置 com.abc.xyz.content.controller com.abc.xyz.content.service com.abc.xyz.content.dao com.abc.xyz.category.controller com.abc.xyz.categor
我有@tenatable注释来决定切入点: 这是我的观点: 这对于这个服务类来说没有任何问题: 当我调用doSomething()方法时,我的方面正在运行,这没问题,但我想为属于spring数据的CrudRepository接口实现方面。 我已经改变了我的Aspect来实现这一点,如下所示: 这是存储库: 但当我调用MyRepository中的任何方法时,它都不起作用。 有什么办法吗? 编辑:当我
主要内容:切入点,语法,运行项目切入点(JoinPoint)代表示您的应用程序中可以插入AOP方面的某个点。 您也可以说,这是应用程序中使用Spring AOP框架执行操作的实际位置。 请考虑以下示例: 包中包含的所有方法类。 一个类的特定方法。 切入点 切入点()是一组一个或多个连接点,其中它用来执行通知。可以使用表达式或模式指定切入点,我们将在下面AOP示例中看到。 在Spring,切入点有助于使用特定的连接点来应用通知。
在Spring中将一个方面配置为: 是: } 如果我使用注释实现方法,正在按预期工作。但是如果注释在接口上,它就不起作用。这是正常行为还是我做错了什么?