当 AspectJExpressionPointcutAdvisor 以编程方式创建时不会触发切入点

问题描述

我正在根据应用程序属性文件中存在的切入点数量创建 AspectJExpressionpointcutAdvisor。它正在创建没有错误的对象,但没有触发切入点。

注意:需要根据属性文件中的切入点表达式的数量(不同)动态创建bean。

应用属性文件

pointcut.expression.projectUpdate[0]= execution(* com.abc.app.service.impl.TestServiceImpl.updateProjectDetails(..))
pointcut.expression.projectUpdate[1]= execution(* com.abc.app.service.impl.TestServiceImpl.cancelProject(..))
pointcut.expression.projectUpdate[2]= execution(* com.abc.app.service.impl.TestCSATratingServiceImpl.saveratingDetails(..))

TestConfig.class

@Configuration
public class TestConfig implements beanfactoryAware {
    
    @Autowired
    private pointcutExprProperties pcExprProp;
    
    @Autowired(required=false)
    private ProjectUpdateAspect projectUpdateAdvice;

     private beanfactory beanfactory;
    
    @Override
    public void setbeanfactory(beanfactory beanfactory) {
        this.beanfactory = beanfactory;
    }
    
    @postconstruct
    public void configure() {
        Configurablebeanfactory configurablebeanfactory = (Configurablebeanfactory) beanfactory;
        int i=1;
        for(String pointcut : pcExprProp.getProjectUpdate()) {
            AspectJExpressionpointcutAdvisor projectUpdateAdvisor = new AspectJExpressionpointcutAdvisor();
            projectUpdateAdvisor.setExpression(pointcut);
            projectUpdateAdvisor.setAdvice(projectUpdateAdvice);
            configurablebeanfactory.registerSingleton("beanName_"+i,projectUpdateAdvisor);
            i++;
        }
    }
}

ProjectUpdateAspect.class

@Component
@Aspect
public class ProjectUpdateAspect implements AfterReturningAdvice {

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

    @Override
    public void afterReturning(Object returnValue,Method method,Object[] args,Object target) throws Throwable {
        try {
            // some thing
        }catch (Exception exception) {
            log.error("Error while processing ProjectUpdateAspect",exception);
        }

    }
}

pointcutExprProperties

@Configuration
@ConfigurationProperties(prefix = "pointcut.expression")
@Validated
public class pointcutExprProperties {

    @NotNull
    private List<String> projectCreate;
    
    @NotNull
    private List<String> projectUpdate;

    public List<String> getProjectCreate() {
        return projectCreate;
    }

    public void setProjectCreate(List<String> projectCreate) {
        this.projectCreate = projectCreate;
    }

    public List<String> getProjectUpdate() {
        return projectUpdate;
    }

    public void setProjectUpdate(List<String> projectUpdate) {
        this.projectUpdate = projectUpdate;
    }
}

请建议我如何摆脱这个问题。

解决方法

我建议你这样做:

  • 您没有将您的“方面”定义为 @Component @Aspect,而是让它实现 MethodInterceptor
  • 您使用属性文件中的值创建 AspectJExpressionPointcut
  • 您将 DefaultPointcutAdvisor(使用切入点和拦截器配置)注册为 bean。

另请参阅 my answer here (update 3) 和我刚刚为您更新的 GitHub sample repository,以便包括从 application.properties 读取切入点。