也许这里有人认识我。通常我是回答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使用其他方面。我真的很想看看这是否以及如何能结合在一起。
问题似乎是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 的应用程序来说,这过于简化了。 问题答案: 好吧,我将尝试解释我的经历。我不认为自己是专家,但是几天我都伤透了脑筋。 对于初学者来说,我很难理解示例和应用程序的工作流程。我认为从一个简单的示例开始应该会更好,但是将代码分成小块很难并且不