在@Bean方法上带有自定义注释的Spring AOP

在@Bean方法上带有自定义注释的Spring AOP,spring,spring-aop,Spring,Spring Aop,我试图使用AOP和注释触发,正如您在这个切入点中看到的那样 package mypackage.aop; // ... @Aspect @Component public class ErrorHandlerAspect { private final static Logger LOGGER = LoggerFactory.getLogger(ErrorHandlerAspect.class); @Pointcut("within(mypackage.config.st

我试图使用AOP和注释触发,正如您在这个切入点中看到的那样

package mypackage.aop;

// ...

@Aspect
@Component
public class ErrorHandlerAspect {

    private final static Logger LOGGER = LoggerFactory.getLogger(ErrorHandlerAspect.class);

    @Pointcut("within(mypackage.config.steps..*) && @annotation(mypackage.aop.SaveAndErrors)")
    private void pointcut(){ }

    @Around("pointcut()")
    private Object errorHandler(ProceedingJoinPoint pjp) throws Throwable{
        try{
            return pjp.proceed();
        } catch (Throwable e){
            LOGGER.error("Handling error");
            throw e;
        }
    }
}
以下是注释声明:

package mypackage.aop;

// ...

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SaveAndErrors { }
。。。和@Configuration类中的用法(用于spring批处理步骤配置):

不幸的是,这是行不通的。 从切入点删除&&@annotation(mypackage.aop.SaveAndErrors),我的aop代理正在工作


错误在哪里?

我不是Spring用户,我使用纯AspectJ。但据我所知,我认为SpringAOP只适用于
@组件。如果它也适用于
@Configuration
实体,我不能说,但这可能就是问题所在。当您说在删除第二个条件时该方面起作用时,您是否确实验证过(例如,使用日志语句)它也会为方法
xFileReader
触发?嗨。当我删除该语句时,调试器将在我的停止点停止:return pjp.procedure();我还尝试了另一种方法,仅使用
@annotation
和bean的方法(仅使用我的SaveAndErrors注释)(在
@configuration
classe之外)。这个相位也被称为相位。我不理解你最后的评论。对不起,我不知道你想告诉我什么。什么是“陈述”,哪里是“你的停止点”,什么是“方法”?也许你应该在GitHub.Hi上创建一个。我配置这个切入点:
@pointcut(@annotation(mypackage.aop.savenderrors)”)
并且我在
@Component公共类A{@savenderrors public void operation()抛出xException{try{//return…}捕获(YeException e){抛出新的xException上设置了
@savenderrors
(“新异常:”,e);}}
在本例中,我的aspect被调用。正如我所说,类
StepConfiguration
不是
@Component
。我不是Spring用户,我使用纯AspectJ。但据我所知,我认为Spring AOP只适用于
@Component
s。如果它也适用于
@Configuration
实体,我不能说,但这可能是真的这可能是问题所在。当您说在删除第二个条件时,方面可以工作时,您是否真的验证过(例如,使用日志语句)它也会为方法
xFileReader
触发?您好。当我删除该语句时,调试器会在我的停止点停止:return pjp.continue();我还尝试了另一种方法,仅使用
@annotation
和bean的方法(仅使用我的SaveAndErrors注释)(在
@configuration
classe之外)。aspect也被调用。我不理解你最后的评论。对不起,我不知道你想告诉我什么。什么是“语句”,哪里是“你的停止点”,什么是一个方法“?也许你应该创建一个,可能是在GitHub.Hi上。我配置这个切入点:
@pointcut(@annotation(mypackage.aop.savenderrors)”)
,我在
@Component公共类a{@savenderrors public void operation()上设置
@savenderrors
,抛出xException{try{//return…}catch(yException e){throw new xException(“new Exception:,e);}}}}}
在本例中,调用了我的方面。正如我所说,类
StepConfiguration
不是
@组件。
package mypackage.config.steps;

// ...

@Configuration
public class StepConfiguration {

    public final static String STEP_NAME = "xStep";

    // ...

    @SaveAndErrors
    @Bean(name="xFileReader")
    @StepScope
    public ItemStreamReader<Object> xFileReader(@Value("#{stepExecutionContext['fileName']}") String resourceName // Inside a partitionner) throws xException {
        try {
            // ...
            // return ...
        } catch (yException e) {
            throw new xException("new Exception :", e);
        }
    }

    // ...

}
@SpringBootApplication
public class Application { //...
}