标签: aspectj

使用Tomcat和Spring配置AspectJ LTW时出现问题

我在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)

aop spring transactions aspectj load-time-weaving

7
推荐指数
2
解决办法
7281
查看次数

如何在Spring 3中将@Aspect与@Controller结合起来?

我正在尝试使用@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 model-view-controller aop spring aspectj

7
推荐指数
3
解决办法
1万
查看次数

Scala:围绕建议或Python装饰器实现Java的AspectJ

我一直在为我的创业公司广泛使用Java + AspectJ.我想切换到Scala,但我有一个共同的设计模式,我不确定完全是在Scala中实现的最佳方式.

我们的大量应用程序使用注释作为标记使用AspectJ切入点.这与Python的装饰者非常相似,并在此博客.

我曾尝试在Scala中使用此技术但遇到了AspectJ + Scala的问题.即使我确实让它工作,似乎unScala喜欢.

我已经看到一些项目做了一些名称封闭魔术(我认为这就是他们正在做的事情).

替换@Transaction的示例:

transaction {
// code in here.
}
Run Code Online (Sandbox Code Playgroud)

我不得不说,虽然我更喜欢注释,因为它似乎更具说明性. 什么是声明式"装饰"代码块的Scala方式?

python java aop scala aspectj

7
推荐指数
3
解决办法
969
查看次数

AspectJ:在@Around建议中组合多个切入点时出现问题

我是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建议的任何规则.是否可以有多个执行/切入点?

希望得到答案......

aop aspectj execution pointcuts

7
推荐指数
1
解决办法
1万
查看次数

是否有相当于gradle的aspectj-maven-plugin在android中有效?

使用maven和纯java项目,我能够使用codehaus的aspectj-maven-plugin来编织(编译时)方面(从我构建的库)到我的带注释的类.

我想用android项目(gradle build)做同样的事情,但似乎找不到太多的文档.

我已经找到了Android的贴切项目在这里,但不能换我围绕着如何用AspectJ织使用它的头.

任何帮助赞赏.

android aspectj gradle

7
推荐指数
1
解决办法
1773
查看次数

如何在Gradle上运行AspectJ加载编织(特别是libgdx构建)

所以我想在我的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构建脚本中使用它也似乎很复杂.

java aspectj gradle libgdx

7
推荐指数
1
解决办法
3055
查看次数

是否有一个AspectJ切入点表达式搜索所有子包?

所以我对使用以下表达式声明的方法有一个方面:

@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.有没有办法让表达式递归搜索所有子包?

java aop expression aspectj spring-aop

7
推荐指数
1
解决办法
4969
查看次数

java.lang.ClassNotFoundException:org.aspectj.util.PartialOrder $ PartialComparable

我在我的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的依赖吗?

java spring aspectj spring-aop

7
推荐指数
1
解决办法
1万
查看次数

IntelliJ IDEA + AspectJ

我试图在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)

java aop aspectj intellij-idea aspects

7
推荐指数
1
解决办法
4066
查看次数

尽管明确注册了 TimedAspect,@Timed 仍然无法工作 - spring boot 2.1

我需要使用测微计@Timed 注释来测量方法度量。因为它不适用于任意方法;我在 spring 配置中明确添加了 @TimedAspect 的配置。已经参考这篇文章以获得精确的配置注意:已经尝试为此添加一个单独的配置类,以及将 TimedAspect bean 作为我现有配置 bean 的一部分

如何使用弹簧靴2和千分尺测量服务方法

然而,不幸的是它不起作用。Bean 已注册,并且从配置类调用在启动时成功通过。调试的时候发现的。但是,@Around 中的代码似乎永远不会执行。不会抛出任何错误;并且我能够在 /metrics 和 /prometheus 端点上查看默认的“系统”指标。

注意:这是在通过执行业务流多次调用“方法”之后。我知道如果根本没有调用该方法,它可能不会出现在指标中

版本:弹簧靴 2.1.1、弹簧 5.3、千分尺 1.1.4、执行器 2.1

尝试了以下帖子的所有内容:

如何使用弹簧靴2和千分尺测量服务方法

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 spring-boot prometheus micrometer

7
推荐指数
1
解决办法
6537
查看次数