对于使用 Spring AOP 的独立 Java 应用程序,是否需要 JVM 参数,例如-javaagent:pathto/aspectjweaver.jar
“打开”AOP 支持?您什么时候想要或需要这样做?
需要明确的是,“独立”是指 Maven 构建的、可执行的 .jar;这将在各种平台上调用。
这取决于。如果您使用 Spring AOP 仅进行粗粒度拦截(意味着您只想拦截对 bean 的外部调用,但不拦截 bean 内部的调用),则根本不需要 JVM 参数。只需使用如下代码:
<bean id="myInterceptor" class="com.company.interceptors.MyInterceptor"></bean>
<aop:config>
<aop:pointcut id="myPointcut"
expression="execution(* com.company.services..MyService.*(..))" />
<aop:advisor pointcut-ref="myPointcut"
advice-ref="myInterceptor" />
</aop:config>
如果这还不够,并且您需要加载时编织来建议 bean 内调用,那么您需要添加一个 JVM 参数,如 Spring 3.0 文档中所述:
通用 Java 应用程序
您可以通过使用 Spring 提供的检测代理在任何 Java 应用程序(独立的以及基于应用程序服务器的)中启用 Spring 对 LTW 的支持。为此,请通过指定 -javaagent:path/to/spring-agent.jar 选项来启动 VM。请注意,这需要修改 VM 启动脚本,这可能会阻止您在应用程序服务器环境中使用它(取决于您的操作策略)。
考虑通过 maven 使用编译时编织:
<properties>
<aspectj.version>1.6.12</aspectj.version>
</properties>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.4</version>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
<configuration>
<source>1.7</source>
<target>1.7</target>
<complianceLevel>1.7</complianceLevel>
<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>
</plugin>
这样做涵盖了所有疯狂的 Spring AOP 案例,甚至是私有事务方法。
在此处查看更多文档http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-aj-ltw。这取决于。
通常,只在类路径中包含 weaver jar 就足够了。