第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Spring aop:為子類(lèi)定義了切入點(diǎn)但只調(diào)用了一個(gè)子類(lèi)

Spring aop:為子類(lèi)定義了切入點(diǎn)但只調(diào)用了一個(gè)子類(lèi)

蝴蝶不菲 2023-07-19 15:34:21
Object process( JobContext jobContext );我使用名為 JobProcessImpl 的 impl 的方法定義 JobProcess 。每當(dāng)執(zhí)行此 JobProcessImpl.process 方法時(shí),我都想監(jiān)視多個(gè)子類(lèi)。我希望所有這些子類(lèi)都被執(zhí)行。間諜類(lèi)被定義為基類(lèi)Task來(lái)查找 JobProcessImpl.process 調(diào)用。在輸出中,我總是看到僅從 AnnotationTask 記錄,而不從 ReviewTask 記錄。請(qǐng)告訴我,如果可能的話,問(wèn)題是什么。我嘗試了兩天通過(guò)關(guān)注各種帖子來(lái)解決這個(gè)問(wèn)題。package com.spring.aspect.dynamicflow.activity;import com.spring.aspect.dynamicflow.entity.JobContext;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;@Component@Aspectpublic abstract class Task {    private static final Logger log = LoggerFactory.getLogger( Task.class );    @Around ( "execution(public java.lang.Object com.spring.aspect.dynamicflow.process.JobProcessImpl.process(..)) " + "&& args(context)" )    public Object task( JobContext context ) {        log.info( "This is the base task and needs to overridden by the derived task for the job id: {} ", context.getJobId() );        return  context;    }}基類(lèi):AnnotationTaskpackage com.spring.aspect.dynamicflow.activity;import com.spring.aspect.dynamicflow.entity.JobContext;import com.spring.aspect.dynamicflow.entity.TaskStatus;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;@Componentpublic class AnnotationTask extends Task {    private static final Logger log = LoggerFactory.getLogger( AnnotationTask.class );    @Override    public Object task( JobContext context ) {        log.info( "AnnotationTask's task" );        /*         * do some validation if annotation is completed or not         */        log.info( "Setting that the annotation is done." );        context.setAnnotationTaskStatus( TaskStatus.COMPLETED );        return "AnnotationTask Completed";    }
查看完整描述

2 回答

?
倚天杖

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊

我一發(fā)布這個(gè),我就嘗試用以下命令更改 ReviewTask 和 AnnotationTask


@Override

    public Object task( ProceedingJoinPoint proceedingJoinPoint, JobContext context ) throws Throwable {

        log.info( "ReviewTask's task" );


        /*

         * do some validation if annotation is completed or not

         */

        log.info( "not completing the review task due to some reason" );

        context.setReviewTaskStatus( TaskStatus.IN_PROGRESS );

        return proceedingJoinPoint.proceed();

    }

這解決了我的問(wèn)題。


查看完整回答
反對(duì) 回復(fù) 2023-07-19
?
溫溫醬

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊

你是對(duì)的,我剛剛注意到 TaskAspects 根本沒(méi)有被觸發(fā)。我沒(méi)有看到來(lái)自 TaskAspects 的任何日志。我可以在沒(méi)有任何 spring-aop 的情況下在 spring-boot 中使用 AspectJ 嗎?感謝您的查看并通知。非常贊賞。


基本上,您只需從要通過(guò) AspectJ 使用的方面中刪除@Component注釋?zhuān)⑦@些方面添加到文件src/main/resources/org/aspectj/aop.xml(假設(shè)您使用 Maven 來(lái)構(gòu)建項(xiàng)目):


<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">

<aspectj>


? <weaver options="-verbose -showWeaveInfo">

? ? <!-- only weave classes in our application-specific packages -->

? ? <include within="com.spring.aspect.dynamicflow..*"/>

? </weaver>


? <aspects>

? ? <aspect name="com.spring.aspect.dynamicflow.aspect.TaskAspects"/>

? ? <aspect name="com.spring.aspect.dynamicflow.activity.AnnotationTask"/>

? ? <aspect name="com.spring.aspect.dynamicflow.activity.ReviewTask"/>

? </aspects>


</aspectj>

然后你開(kāi)始你的應(yīng)用程序-javaagent:/path/to/aspectjweaver.jar,例如:

-javaagent:"c:\Users\me\.m2\repository\org\aspectj\aspectjweaver\1.9.4\aspectjweaver-1.9.4.jar"

您還可以在 Java 命令行上同時(shí)使用 AspectJ Weaver 和 Spring Instrument 這兩個(gè)代理,例如

-javaagent:"c:\Users\me\.m2\repository\org\aspectj\aspectjweaver\1.9.4\aspectjweaver-1.9.4.jar"?-javaagent:"c:\Program?Files\Java\spring-framework-5.1.9.RELEASE\libs\spring-instrument-5.1.9.RELEASE.jar"

為了您的方便,并且為了自己擁有一個(gè)示例項(xiàng)目,我在GitHub 存儲(chǔ)庫(kù)中共享了我的工作示例。有一個(gè)Spring AOP 分支和另一個(gè)AspectJ LTW 分支。這些分支之間的差異如下所示:

diff --git a/src/main/java/com/spring/aspect/dynamicflow/Application.java b/src/main/java/com/spring/aspect/dynamicflow/Application.java

index 2a7021e..3a7636f 100644

--- a/src/main/java/com/spring/aspect/dynamicflow/Application.java

+++ b/src/main/java/com/spring/aspect/dynamicflow/Application.java

@@ -8,6 +8,16 @@ import org.springframework.boot.SpringApplication;

?import org.springframework.boot.autoconfigure.SpringBootApplication;

?import org.springframework.context.ConfigurableApplicationContext;

?

+/**

+ * Run this from your IDE with

+ *

+ * a) either just -javaagent:/path/to/aspectjweaver.jar and without @EnableLoadTimeWeaving

+ *

+ * b) or with both -javaagent:/path/to/aspectjweaver.jar -javaagent:/path/to/spring-instrument.jar,

+ * either with or without @EnableLoadTimeWeaving. What benefit this has, I don't know.

+ *

+ * See also my extensive comment in Application class.

+ */

?@SpringBootApplication

?public class Application {

? ?private static final Logger log = LoggerFactory.getLogger(Application.class);

diff --git a/src/main/java/com/spring/aspect/dynamicflow/ApplicationConfig.java b/src/main/java/com/spring/aspect/dynamicflow/ApplicationConfig.java

index b4698e1..649a6ca 100644

--- a/src/main/java/com/spring/aspect/dynamicflow/ApplicationConfig.java

+++ b/src/main/java/com/spring/aspect/dynamicflow/ApplicationConfig.java

@@ -3,8 +3,34 @@ package com.spring.aspect.dynamicflow;

?import org.springframework.context.annotation.ComponentScan;

?import org.springframework.context.annotation.Configuration;

?import org.springframework.context.annotation.EnableAspectJAutoProxy;

+import org.springframework.context.annotation.EnableLoadTimeWeaving;

?

+import static org.springframework.context.annotation.EnableLoadTimeWeaving.AspectJWeaving.ENABLED;

+

+/**

+ * Remarks about AspectJ load-time weaving(LTW) in Spring:

+ *

+ * According to the Spring manual it should be enough to put spring-instrument.jar is on the JVM command line

+ * in combination with @EnableLoadTimeWeaving. Actually this does help Spring detect the AspectJ weaver,

+ * I can see the aspects loaded. But obviously this happens too late after the application classes are

+ * already loaded, so the aspects do not have any effect. I even added a static block

+ * static { logger.info("JobProcessImpl class was loaded"); } to JobProcessImpl in order to check it an

+ * the log output occurs right before the aspects are being activated, which of course is too late.

+ *

+ * LTW works if

+ *

+ * a) either I have both Java agents aspectjweaver.jar and spring-instrument.jar on JVM command line

+ * in combination with @EnableLoadTimeWeaving (but then it tries to weave twice, I can see errors in the log)

+ * or without @EnableLoadTimeWeaving (no errors in the log)

+ *

+ * b) or if I only use aspectjweaver.jar without @EnableLoadTimeWeaving.

+ *

+ * The latter is no surprise because AspectJ is independent of Spring and of course works even if Spring is

+ * unaware of its presence. But if I want to advertise its presence via @EnableLoadTimeWeaving, I do not

+ * understand why spring-instrument.jar is not enough, as described in the Spring manual.

+ */

?@Configuration

?@EnableAspectJAutoProxy

?@ComponentScan("com.spring.aspect.dynamicflow")

+//@EnableLoadTimeWeaving(aspectjWeaving = ENABLED)

?public class ApplicationConfig {}

diff --git a/src/main/java/com/spring/aspect/dynamicflow/activity/AnnotationTask.java b/src/main/java/com/spring/aspect/dynamicflow/activity/AnnotationTask.java

index 3c6d5c4..bbdd5b1 100644

--- a/src/main/java/com/spring/aspect/dynamicflow/activity/AnnotationTask.java

+++ b/src/main/java/com/spring/aspect/dynamicflow/activity/AnnotationTask.java

@@ -6,9 +6,7 @@ import org.aspectj.lang.ProceedingJoinPoint;

?import org.aspectj.lang.annotation.Aspect;

?import org.slf4j.Logger;

?import org.slf4j.LoggerFactory;

-import org.springframework.stereotype.Component;

?

-@Component

?@Aspect

?public class AnnotationTask extends Task {

? ?private static final Logger log = LoggerFactory.getLogger(AnnotationTask.class);

diff --git a/src/main/java/com/spring/aspect/dynamicflow/activity/ReviewTask.java b/src/main/java/com/spring/aspect/dynamicflow/activity/ReviewTask.java

index ece0ff6..f364da2 100644

--- a/src/main/java/com/spring/aspect/dynamicflow/activity/ReviewTask.java

+++ b/src/main/java/com/spring/aspect/dynamicflow/activity/ReviewTask.java

@@ -6,9 +6,7 @@ import org.aspectj.lang.ProceedingJoinPoint;

?import org.aspectj.lang.annotation.Aspect;

?import org.slf4j.Logger;

?import org.slf4j.LoggerFactory;

-import org.springframework.stereotype.Component;

?

-@Component

?@Aspect

?public class ReviewTask extends Task {

? ?private static final Logger log = LoggerFactory.getLogger(ReviewTask.class);

diff --git a/src/main/java/com/spring/aspect/dynamicflow/activity/Task.java b/src/main/java/com/spring/aspect/dynamicflow/activity/Task.java

index 3f1f9ce..93b3b73 100644

--- a/src/main/java/com/spring/aspect/dynamicflow/activity/Task.java

+++ b/src/main/java/com/spring/aspect/dynamicflow/activity/Task.java

@@ -6,9 +6,7 @@ import org.aspectj.lang.annotation.Around;

?import org.aspectj.lang.annotation.Aspect;

?import org.slf4j.Logger;

?import org.slf4j.LoggerFactory;

-import org.springframework.stereotype.Component;

?

-@Component

?@Aspect

?public abstract class Task {

? ?private static final Logger log = LoggerFactory.getLogger(Task.class);

diff --git a/src/main/java/com/spring/aspect/dynamicflow/aspect/TaskAspects.java b/src/main/java/com/spring/aspect/dynamicflow/aspect/TaskAspects.java

index 3bff7b5..a09d9d6 100644

--- a/src/main/java/com/spring/aspect/dynamicflow/aspect/TaskAspects.java

+++ b/src/main/java/com/spring/aspect/dynamicflow/aspect/TaskAspects.java

@@ -5,9 +5,7 @@ import org.aspectj.lang.annotation.Around;

?import org.aspectj.lang.annotation.Aspect;

?import org.slf4j.Logger;

?import org.slf4j.LoggerFactory;

-import org.springframework.stereotype.Component;

?

-@Component

?@Aspect

?public class TaskAspects {

? ?private static final Logger log = LoggerFactory.getLogger(TaskAspects.class);

diff --git a/src/main/resources/org/aspectj/aop.xml b/src/main/resources/org/aspectj/aop.xml

new file mode 100644

index 0000000..56342b4

--- /dev/null

+++ b/src/main/resources/org/aspectj/aop.xml

@@ -0,0 +1,15 @@

+<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">

+<aspectj>

+

+? <weaver options="-verbose -showWeaveInfo">

+? ? <!-- only weave classes in our application-specific packages -->

+? ? <include within="com.spring.aspect.dynamicflow..*"/>

+? </weaver>

+

+? <aspects>

+? ? <aspect name="com.spring.aspect.dynamicflow.aspect.TaskAspects"/>

+? ? <aspect name="com.spring.aspect.dynamicflow.activity.AnnotationTask"/>

+? ? <aspect name="com.spring.aspect.dynamicflow.activity.ReviewTask"/>

+? </aspects>

+

+</aspectj>

Task順便說(shuō)一句,我也很快嘗試獲得 Spring AOP 方面(子類(lèi))和 AspectJ 方面的組合( TaskAspects,真是一個(gè)可怕的名字,為什么不TasksAspect或TaskInterceptor?)。盡管 Spring 手冊(cè)和郵件列表上的許多用戶(hù)都說(shuō),即使沒(méi)有額外的配置,也很容易結(jié)合這兩種方法,但我無(wú)法讓它按照我想要的方式運(yùn)行。所以目前我還沒(méi)有解決方案。也許我只是犯了一個(gè)小錯(cuò)誤。我是一名 AspectJ 專(zhuān)家,但實(shí)際上從未使用過(guò) Spring 或 Spring AOP,抱歉。


更新:我忘了提及,在我的存儲(chǔ)庫(kù)中我還解決了我之前在評(píng)論中提到的這個(gè)問(wèn)題:


如果你真的使用 AspectJ LTW 場(chǎng)景,你的 TaskAspects 方面會(huì)被頻繁觸發(fā),因?yàn)閣ithin(com.spring.aspect.dynamicflow.activity.Task+)在 AspectJ 中不僅攔截方法執(zhí)行,還攔截對(duì)象和類(lèi)初始化、字段訪問(wèn)、對(duì)其他類(lèi)的方法調(diào)用等。所以要么你使用 AspectJ LTW,它也會(huì)打印很多或(...)


如果您使用該切入點(diǎn),這確實(shí)是正確的。日志輸出(時(shí)間戳、日志通道信息等,從日志輸出中切斷)將是:


Handling the task aspects.

? staticinitialization(com.spring.aspect.dynamicflow.activity.Task.<clinit>)

Handling the task aspects.

? call(Logger org.slf4j.LoggerFactory.getLogger(Class))

Handling the task aspects.

? set(Logger com.spring.aspect.dynamicflow.activity.Task.log)

Handling the task aspects.

? staticinitialization(com.spring.aspect.dynamicflow.activity.AnnotationTask.<clinit>)

Handling the task aspects.

? call(Logger org.slf4j.LoggerFactory.getLogger(Class))

Handling the task aspects.

? set(Logger com.spring.aspect.dynamicflow.activity.AnnotationTask.log)

Handling the task aspects.

? execution(com.spring.aspect.dynamicflow.activity.Task())

Handling the task aspects.

? execution(com.spring.aspect.dynamicflow.activity.AnnotationTask())

Handling the task aspects.

? execution(Object com.spring.aspect.dynamicflow.activity.AnnotationTask.task(ProceedingJoinPoint, JobContext))

Handling the task aspects.

? get(Logger com.spring.aspect.dynamicflow.activity.AnnotationTask.log)

Handling the task aspects.

? call(void org.slf4j.Logger.info(String))

AnnotationTask's task

Handling the task aspects.

? get(Logger com.spring.aspect.dynamicflow.activity.AnnotationTask.log)

Handling the task aspects.

? call(void org.slf4j.Logger.info(String))

? Setting that the annotation is done.

Handling the task aspects.

? get(TaskStatus com.spring.aspect.dynamicflow.entity.TaskStatus.COMPLETED)

Handling the task aspects.

? call(void com.spring.aspect.dynamicflow.entity.JobContext.setAnnotationTaskStatus(TaskStatus))

Handling the task aspects.

? call(Object org.aspectj.lang.ProceedingJoinPoint.proceed())

Handling the task aspects.

? staticinitialization(com.spring.aspect.dynamicflow.activity.ReviewTask.<clinit>)

Handling the task aspects.

? call(Logger org.slf4j.LoggerFactory.getLogger(Class))

Handling the task aspects.

? set(Logger com.spring.aspect.dynamicflow.activity.ReviewTask.log)

Handling the task aspects.

? execution(com.spring.aspect.dynamicflow.activity.Task())

Handling the task aspects.

? execution(com.spring.aspect.dynamicflow.activity.ReviewTask())

Handling the task aspects.

? execution(Object com.spring.aspect.dynamicflow.activity.ReviewTask.task(ProceedingJoinPoint, JobContext))

Handling the task aspects.

? get(Logger com.spring.aspect.dynamicflow.activity.ReviewTask.log)

Handling the task aspects.

? call(void org.slf4j.Logger.info(String))

ReviewTask's task

Handling the task aspects.

? get(Logger com.spring.aspect.dynamicflow.activity.ReviewTask.log)

Handling the task aspects.

? call(void org.slf4j.Logger.info(String))

? Setting that the review is done.

Handling the task aspects.

? get(TaskStatus com.spring.aspect.dynamicflow.entity.TaskStatus.IN_PROGRESS)

Handling the task aspects.

? call(void com.spring.aspect.dynamicflow.entity.JobContext.setReviewTaskStatus(TaskStatus))

Handling the task aspects.

? call(Object org.aspectj.lang.ProceedingJoinPoint.proceed())

Processing the job with jobid 11

我還從日志行之間刪除了 AspectJ weaver 日志消息(其中一些是錯(cuò)誤)。within(com.spring.aspect.dynamicflow.activity.Task+) && execution(* task(..))您會(huì)看到 29x“處理任務(wù)方面”,而不是僅 2x,這就是我為您更改切入點(diǎn)的原因?,F(xiàn)在日志輸出看起來(lái)符合預(yù)期:


Handling the task aspects.

? execution(Object com.spring.aspect.dynamicflow.activity.AnnotationTask.task(ProceedingJoinPoint, JobContext))

AnnotationTask's task

? Setting that the annotation is done.

Handling the task aspects.

? execution(Object com.spring.aspect.dynamicflow.activity.ReviewTask.task(ProceedingJoinPoint, JobContext))

ReviewTask's task

? Setting that the review is done.

Processing the job with jobid 11


查看完整回答
反對(duì) 回復(fù) 2023-07-19
  • 2 回答
  • 0 關(guān)注
  • 223 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)