当前位置: 首页 > 知识库问答 >
问题:

如何在一个应用程序中结合使用Spring AOP+AspectJ LTW?

戈华茂
2023-03-14

也许这里有人认识我。通常我是回答AspectJ问题的人。我觉得自己是个专家。在许多情况下,即使我不是Spring用户,我也会回答Spring AOP问题。

>

  • SO上和web上的其他地方的许多资料来源声称,将Spring AOP与AspectJ(更准确地说,是与加载时编织(LTW))结合在一起是很容易的。只要AspectJ是通过编译时编织(CTW)应用的,我就不反对,因为一个(AspectJ)在Spring应用程序启动之前就已经应用了,所以在这种情况下不存在任何问题。但是,当我试图配置Spring以使用Spring AOP并同时在Java命令行上使用-javaagent:/path/to/AspectJweaver.jar启动应用程序时,我只能使加载时编织(LTW)工作,而不再使用Spring AOP,无论我尝试了@enableAspectJAutoproxy@enableLoadTimeWeaving的组合。

    作为附带说明,我还想知道为什么AspectJ LTW从未像Spring手册所宣传的那样工作,只使用-javaagent:/path/to/spring-instrument.jar或者甚至不应用任何代理。手册说Spring可以检测aop.xml,然后自动激活LTW。这对我没用。准确地说,使用spring-instrument代理,Spring确实检测我的方面并注册它们,但只有在目标类(由AspectJ编织并直接用于我的应用程序的主类)已经加载之后。即。AspectJ weaver初始化得太晚了。

    谁能在这里开导我,告诉我如何正确设置这个?这个问题与我在这里的回答相关,所以您可以方便地克隆那里提到的示例GitHub项目,切换到AspectJ-ltw分支并从那里取下,以便配置应用程序,从而只通过AspectJ LTW使用TaskAspects(因为它截取了其他方面,这在Spring AOP中是不可能的),而通过Spring AOP使用其他方面。我真的很想看看这是否以及如何能结合在一起。

  • 共有1个答案

    欧阳杰
    2023-03-14

    问题似乎是Spring Boot的配置扫描过程,所以不是Spring框架本身。它从各种autoconfiguration类评估条件,并在启用LoadTimeWeaver之前加载JobProcessImpl,因为它用@component进行了注释。

    我找到的使其工作的方法是从类中删除@component注释,并在applicationconfig中手工创建bean:

    @Bean
    public JobProcess jobProcess() {
        return new JobProcessImpl();
    }
    
    
    2019-09-20 12:10:26.985  INFO 1 --- [           main] AspectJ Weaver                           : [AspectJ] register aspect com.spring.aspect.dynamicflow.aspect.TaskAspects
    2019-09-20 12:10:27.155  INFO 1 --- [           main] AspectJ Weaver                           : [AspectJ] register aspect com.spring.aspect.dynamicflow.activity.AnnotationTask
    2019-09-20 12:10:27.166  INFO 1 --- [           main] AspectJ Weaver                           : [AspectJ] register aspect com.spring.aspect.dynamicflow.activity.ReviewTask
    2019-09-20 12:10:27.257  INFO 1 --- [           main] AspectJ Weaver                           : [AspectJ] Join point 'method-execution(java.lang.Object com.spring.aspect.dynamicflow.process.JobProcessImpl.process(com.spring.aspect.dynamicflow.entity.JobContext))' in Type 'com.spring.aspect.dynamicflow.process.JobProcessImpl' (JobProcessImpl.java:16) advised by around advice from 'com.spring.aspect.dynamicflow.activity.ReviewTask' (Task.java)
    2019-09-20 12:10:27.263  INFO 1 --- [           main] AspectJ Weaver                           : [AspectJ] Join point 'method-execution(java.lang.Object com.spring.aspect.dynamicflow.process.JobProcessImpl.process(com.spring.aspect.dynamicflow.entity.JobContext))' in Type 'com.spring.aspect.dynamicflow.process.JobProcessImpl' (JobProcessImpl.java:16) advised by around advice from 'com.spring.aspect.dynamicflow.activity.AnnotationTask' (Task.java)
    2019-09-20 12:10:27.378  INFO 1 --- [           main] AspectJ Weaver                           : [AspectJ] Join point 'method-execution(java.lang.Object com.spring.aspect.dynamicflow.activity.AnnotationTask.task(org.aspectj.lang.ProceedingJoinPoint, com.spring.aspect.dynamicflow.entity.JobContext))' in Type 'com.spring.aspect.dynamicflow.activity.AnnotationTask' (AnnotationTask.java:16) advised by around advice from 'com.spring.aspect.dynamicflow.aspect.TaskAspects' (TaskAspects.java)
    2019-09-20 12:10:27.390  INFO 1 --- [           main] AspectJ Weaver                           : [AspectJ] Join point 'method-execution(java.lang.Object com.spring.aspect.dynamicflow.activity.ReviewTask.task(org.aspectj.lang.ProceedingJoinPoint, com.spring.aspect.dynamicflow.entity.JobContext))' in Type 'com.spring.aspect.dynamicflow.activity.ReviewTask' (ReviewTask.java:16) advised by around advice from 'com.spring.aspect.dynamicflow.aspect.TaskAspects' (TaskAspects.java)
    2019-09-20 12:10:27.412  INFO 1 --- [           main] c.s.a.d.process.JobProcessImpl           : JobProcessImpl class was loaded
    2019-09-20 12:10:27.500  WARN 1 --- [           main] AspectJ Weaver                           : [AspectJ] javax.* types are not being woven because the weaver option '-Xset:weaveJavaxPackages=true' has not been specified
    2019-09-20 12:10:27.871  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
    2019-09-20 12:10:28.368  INFO 1 --- [           main] c.spring.aspect.dynamicflow.Application  : jobProcess = com.spring.aspect.dynamicflow.process.JobProcessImpl@4627a09d
    2019-09-20 12:10:28.379  INFO 1 --- [           main] c.s.a.dynamicflow.aspect.TaskAspects     : Handling the task aspects.
    2019-09-20 12:10:28.382  INFO 1 --- [           main] c.s.a.dynamicflow.aspect.TaskAspects     :   execution(Object com.spring.aspect.dynamicflow.activity.AnnotationTask.task(ProceedingJoinPoint, JobContext))
    2019-09-20 12:10:28.382  INFO 1 --- [           main] c.s.a.d.activity.AnnotationTask          : AnnotationTask's task
    2019-09-20 12:10:28.382  INFO 1 --- [           main] c.s.a.d.activity.AnnotationTask          :   Setting that the annotation is done.
    2019-09-20 12:10:28.395  INFO 1 --- [           main] c.s.a.dynamicflow.aspect.TaskAspects     : Handling the task aspects.
    2019-09-20 12:10:28.395  INFO 1 --- [           main] c.s.a.dynamicflow.aspect.TaskAspects     :   execution(Object com.spring.aspect.dynamicflow.activity.ReviewTask.task(ProceedingJoinPoint, JobContext))
    2019-09-20 12:10:28.395  INFO 1 --- [           main] c.s.a.dynamicflow.activity.ReviewTask    : ReviewTask's task
    2019-09-20 12:10:28.395  INFO 1 --- [           main] c.s.a.dynamicflow.activity.ReviewTask    :   Setting that the review is done.
    2019-09-20 12:10:28.395  INFO 1 --- [           main] c.s.a.d.process.JobProcessImpl           : Processing the job with jobid 11
    
     类似资料:
    • 这是我的聊天应用程序文件代码 这是我的服务器。js文件 在途中。js文件 我在写这段代码 TypeError:对象#在C:\Users\Sanjay1\Desktop\fmodule\login\app\routes没有方法“worker”。js:11:7在路由器的pass(C:\Users\Sanjay1\Desktop\node_modules\express\lib\router\index

    • 问题内容: 我发现有1条关于该问题的帖子,确实部分回答了该问题,但是我可能需要一些详细信息。 我目前正在尝试将BlobStore与我的android应用程序配合使用,除了501错误(HTTP服务器无法处理您的请求)之外,我什么也无法获得。 他是我的密码; 我通过运行良好的GET请求获得了URL。我还尝试了一个包含ByteArrayBody的FormBodyPart,并且还将ByteArrayBod

    • 问题内容: 我正在为我的游戏创建一个关卡编辑器,但在将LwjglCanvas与JFrame一起使用时遇到了问题。我使用JFrame(而不是LwjglFrame)来保持引擎和关卡编辑器尽可能独立。我有两个JAR:WorldEditor.jar和GameEngine.jar。在WorldEditor内部,我有一个名为“测试”的按钮,该按钮假设是将GameEngine.jar(如果尚未加载)加载并将其启

    • 我正在尝试使用Spring Security(spring-security-starter)在Spring boot(2.2.4)应用程序中实现身份验证和授权。 用例:基于用户名,我想将用户重定向到特定的身份验证提供者 > 如果用户名以“mit”结尾。com’使用数据库验证用户身份(我使用的是hibernate)——为此,我可以使用spring的UserDetailService 如果用户名以“

    • 问题内容: 在Android应用中实施应用内结算似乎非常复杂。我该怎么办?SDK中的示例应用程序只有一个Activity,对于像我这样的具有多个Activity的应用程序来说,这过于简化了。 问题答案: 好吧,我将尝试解释我的经历。我不认为自己是专家,但是几天我都伤透了脑筋。 对于初学者来说,我很难理解示例和应用程序的工作流程。我认为从一个简单的示例开始应该会更好,但是将代码分成几小段并且不知道是

    • 问题内容: 在Android应用中实施应用内结算似乎非常复杂。我该怎么办?SDK中的示例应用程序只有一个 Activity,对于像我这样的具有多个Activity 的应用程序来说,这过于简化了。 问题答案: 好吧,我将尝试解释我的经历。我不认为自己是专家,但是几天我都伤透了脑筋。 对于初学者来说,我很难理解示例和应用程序的工作流程。我认为从一个简单的示例开始应该会更好,但是将代码分成小块很难并且不