我在Tomcat 6 webapp中使用Spring进行加载时编织时遇到了一些问题.我只想将它用于事务(因此自我调用遵循事务注释,而不是AOP代理).似乎正在加载织布工,但我的注释类实际上并没有被编织.当我单步执行代码时,我在SQL日志中看不到任何事务边界,正如我在常规AOP代理配置中看到的那样.这是我的设置:
在server.xml中:
<Context path="/api" allowLinking="true" reloadable="false" docBase="/usr/local/apache-tomcat-6.0.18/webapps/API/ROOT" workDir="/usr/local/apache-tomcat-6.0.18/webapps/API/ROOT/work">
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>
Run Code Online (Sandbox Code Playgroud)
我有tom-tomcat-weaver.jar tomcat/lib目录,以及我的Tomcat类路径上的以下jar:
tomcat/webapps/API/ROOT/WEB-INF/lib/aspectjweaver.jar tomcat/webapps/API/ROOT/WEB-INF/lib/spring-aspects.jar
这是在bean配置文件中定义带注释的服务类:
<tx:annotation-driven transaction-manager="txManager" mode="aspectj"/>
Run Code Online (Sandbox Code Playgroud)
在我的上下文中的许多其他bean配置文件之一:
<aop:aspectj-autoproxy>
<aop:include name="methodTimer"/>
</aop:aspectj-autoproxy>
<context:load-time-weaver aspectj-weaving="on"/>
<context:annotation-config />
<bean name="methodTimer" class="tv.current.web.aop.MethodTimer" />
Run Code Online (Sandbox Code Playgroud)
我希望MethodTimer使用常规AOP代理,而不是LTW - LTW应该仅适用于@Transactional注释.如下所述:http://static.springsource.org/spring/docs/2.5.x/reference/aop.html#aop-aj-configure.如果我注释掉<aop:aspectj-autoproxy>元素,我不会得到任何我看到的编织信息日志消息.说到这里,他们在这里; 你可以看到方面正在加载,但实际上没有任何东西被编织:
Aug 28, 2009 6:34:42 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
[TomcatInstrumentableClassLoader@34fe7e0e] info AspectJ Weaver Version 1.6.5 built on Thursday Jun 18, 2009 at 03:42:32 GMT
[TomcatInstrumentableClassLoader@34fe7e0e] info register classloader org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader@34fe7e0e
[TomcatInstrumentableClassLoader@34fe7e0e] info using configuration …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用@Controller,基于注释的方法设置Spring 3 Web MVC项目.
package my.package
@Controller
@RequestMapping("/admin/*")
public class AdminMultiActionController {
@RequestMapping(value = "admin.htm", method = RequestMethod.GET)
public String showAdminSection() {
return "admin";
}
Run Code Online (Sandbox Code Playgroud)
我的dispatcher-servlet具有以下Controller处理程序:
<context:component-scan base-package="my.package" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
Run Code Online (Sandbox Code Playgroud)
使用提供的maven工件,webapp运行良好:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.0.2.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
现在我想添加@AspectJ AOP.我得到了libs:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.9</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
添加到我的applicationContext.xml:
<aop:aspectj-autoproxy/>
Run Code Online (Sandbox Code Playgroud)
确保在applicationContext.xml中创建相关的bean:
<bean id="securityInterceptor" class="my.package.service.SecurityInterceptor"/>
Run Code Online (Sandbox Code Playgroud)
并开始充实@Aspect:
package my.package.service
@Aspect
public class SecurityInterceptor {
@Pointcut("execution(* showAdminSection(..))")// the pointcut expression
private void foo() {
System.out.println("fooo");
}// the pointcut …Run Code Online (Sandbox Code Playgroud) 我一直在为我的创业公司广泛使用Java + AspectJ.我想切换到Scala,但我有一个共同的设计模式,我不确定完全是在Scala中实现的最佳方式.
我们的大量应用程序使用注释作为标记使用AspectJ切入点.这与Python的装饰者非常相似,并在此博客.
我曾尝试在Scala中使用此技术但遇到了AspectJ + Scala的问题.即使我确实让它工作,似乎unScala喜欢.
我已经看到一些项目做了一些名称封闭魔术(我认为这就是他们正在做的事情).
替换@Transaction的示例:
transaction {
// code in here.
}
Run Code Online (Sandbox Code Playgroud)
我不得不说,虽然我更喜欢注释,因为它似乎更具说明性. 什么是声明式"装饰"代码块的Scala方式?
我是AspectJ的初学者,所以请指导我按照以下方法解决发生的问题.
@Aspect
public class TestAop {
@Pointcut("execution(public * com.packg.foo.ClassOne.*(..))")
public void fooPoint()
@Pointcut("execution(public * com.packg.cat.ClassTwo.*(..))")
public void catPoint()
@Pointcut("execution(public * com.packg.roo.ClassThree.*(..))")
public void rooPoint()
@Around("fooPoint() || catPoint() || rooPoint()")
public Object myAdvice(ProceedingJoinPoint joinPoint) {
//do something like joint proceed and all
}
Run Code Online (Sandbox Code Playgroud)
什么时候不工作?如果我将所有三个切入点与OR组合在一起.
什么时候工作?如果我只保留两个切入点就可以了.
我违反了@around建议的任何规则.是否可以有多个执行/切入点?
希望得到答案......
使用maven和纯java项目,我能够使用codehaus的aspectj-maven-plugin来编织(编译时)方面(从我构建的库)到我的带注释的类.
我想用android项目(gradle build)做同样的事情,但似乎找不到太多的文档.
我已经找到了Android的贴切项目在这里,但不能换我围绕着如何用AspectJ织使用它的头.
任何帮助赞赏.
所以我想在我的libgdx游戏中注入一些测试和日志记录功能.
所以我在主桌面gradle依赖项中添加了以下内容.
compile 'org.aspectj:aspectjweaver:1.8.2'
compile "org.aspectj:aspectjrt:1.8.2"
Run Code Online (Sandbox Code Playgroud)
最初它没有找到依赖项,但是通过关闭离线模式并关闭并重新打开我的IntelliJ项目(Gradle同步按钮不起作用)解决了这个问题.
我的理解是aspectjweaver必须作为java代理加载.所以我找到gradle下载它的地方,并将以下内容添加到我的VM运行时配置选项中
-javaagent:/Users/daniel/.gradle/caches/modules-2/files-2.1/org.aspectj/aspectjweaver/1.8.2/4963c0bef4748d5ad039cc26c1ac32a082eb755e/aspectjweaver-1.8.2.jar
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,这给了我以下警告信息
objc[66447]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.
Run Code Online (Sandbox Code Playgroud)
没有-javaagent行,该消息不存在.
我试图按照这个例子来进行加载编织示例. http://andrewclement.blogspot.co.uk/2009/02/load-time-weaving-basics.html
但是,我不需要单独的可重用方面,因此我只是在src目录中创建了一个基本的aop.xml文件,其中包含以下内容.
<aspectj>
<weaver options="-verbose"/>
</aspectj>
Run Code Online (Sandbox Code Playgroud)
显然我还没有设置任何东西,我只想确认设置是否正常.该教程与我的目标环境之间存在足够的差异,我认为很多可能会出错.
我不介意解决方案是编译时还是类加载,只要它在libgdx/gradle环境中可预测地工作即可.由于我不熟悉libgdx/gradle的建筑环境和要求,我选择了查看类加载解决方案.
Thanx提前.
更新:将尝试通过这个http://www.breskeby.com/2010/02/using-gradle-with-aspectj/
...但是教程中没有提到真正熟悉的iajc,并且知道如何在libgdx构建脚本中使用它也似乎很复杂.
所以我对使用以下表达式声明的方法有一个方面:
@Before("execution(* aaa.bbb.ccc.*.*(..))")
Run Code Online (Sandbox Code Playgroud)
这适用于包中的所有类aaa.bbb.ccc.但是,现在,我想要捕获所有类aaa.bbb,包括那些类aaa.bbb.ccc.所以我试着把它备份到这里:
@Before("execution(* aaa.bbb.*.*(..))")
Run Code Online (Sandbox Code Playgroud)
aaa.bbb但是,这只会从中获取类,并忽略来自的类aaa.bbb.ccc.有没有办法让表达式递归搜索所有子包?
我在我的Web应用程序中使用Spring 4.2.4.RELEASE,我想从中删除对aspectjweaver.jar的依赖.我不直接使用AOP,我当然不使用AspectJ.但我的应用程序失败,出现以下异常:
java.lang.ClassNotFoundException: org.aspectj.util.PartialOrder$PartialComparable
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:450)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:403)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at org.eclipse.jetty.webapp.WebAppClassLoader.findClass(WebAppClassLoader.java:510)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:441)
at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:403)
at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.sortAdvisors(AspectJAwareAdvisorAutoProxyCreator.java:73)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:91)
at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:69)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:346)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:298)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422)
Run Code Online (Sandbox Code Playgroud)
有什么方法可以完全删除对aspectjweaver.jar的依赖吗?
我试图在IntelliJ IDEA中的示例项目中使用AspectJ.我有使用Spring AOP的经验,但这是我第一次使用AspectJ,并且无法使其工作.
我想按照此处的描述进行操作:https://www.jetbrains.com/help/idea/2017.1/aspectj.html
我的build.gradle:
apply plugin: 'java'
repositories
{
mavenCentral()
}
dependencies
{
compile "org.projectlombok:lombok:+"
compile "org.aspectj:aspectjrt:+"
compile "org.aspectj:aspectjweaver:+"
compile "org.aspectj:aspectjtools:+"
}
buildscript
{
repositories
{
maven
{
url "https://maven.eveoh.nl/content/repositories/releases"
}
}
dependencies
{
classpath "nl.eveoh:gradle-aspectj:+"
}
}
project.ext
{
aspectjVersion = '+'
}
apply plugin: 'aspectj'
Run Code Online (Sandbox Code Playgroud)
我的方面:
package aspects;
import lombok.SneakyThrows;
import lombok.experimental.FieldDefaults;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import java.util.Arrays;
@Aspect
@FieldDefaults(makeFinal = true)
public aspect LoggingAspect
{
Journal journal = Journal.INSTANCE;
pointcut all(ProceedingJoinPoint …Run Code Online (Sandbox Code Playgroud) 我需要使用测微计@Timed 注释来测量方法度量。因为它不适用于任意方法;我在 spring 配置中明确添加了 @TimedAspect 的配置。已经参考这篇文章以获得精确的配置注意:已经尝试为此添加一个单独的配置类,以及将 TimedAspect bean 作为我现有配置 bean 的一部分
然而,不幸的是它不起作用。Bean 已注册,并且从配置类调用在启动时成功通过。调试的时候发现的。但是,@Around 中的代码似乎永远不会执行。不会抛出任何错误;并且我能够在 /metrics 和 /prometheus 端点上查看默认的“系统”指标。
注意:这是在通过执行业务流多次调用“方法”之后。我知道如果根本没有调用该方法,它可能不会出现在指标中
版本:弹簧靴 2.1.1、弹簧 5.3、千分尺 1.1.4、执行器 2.1
尝试了以下帖子的所有内容:
https://github.com/izeye/sample-micrometer-spring-boot/tree/timed-annotation
https://github.com/micrometer-metrics/micrometer/issues/361
更新:因此,问题似乎仅在 Timed 位于抽象方法上时才出现,该方法通过另一种方法调用。能够通过一个简单的例子重现它。请参阅@Timed("say_hello_example") 注释。当我点击 prometheus 端点时,它只会被忽略并且不会出现。
代码:抽象类
public abstract class AbstractUtil {
public abstract void sayhello();
public void sayhellowithtimed(String passedVar) {
System.out.println("Passed var =>"+passedVar);
System.out.println("Calling abstract sayhello....");
sayhello();
}
}
Run Code Online (Sandbox Code Playgroud)
实现类
@Component
@Scope("prototype")
public class ExampleUtil extends AbstractUtil {
public static final String HELLO = "HELLO";
@Timed("dirwatcher_handler")
public void handleDirectoryWatcherChange(WatchEvent event){ …Run Code Online (Sandbox Code Playgroud) aspectj ×10
aop ×6
java ×6
spring ×3
gradle ×2
spring-aop ×2
android ×1
aspects ×1
execution ×1
expression ×1
libgdx ×1
micrometer ×1
pointcuts ×1
prometheus ×1
python ×1
scala ×1
spring-boot ×1
transactions ×1