如何解决当 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
读取切入点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。