背
景
使用自定义方法注解,获取入参中的某字段进行方法增强(如路由等)
添加依赖
<ognl.version>4.1.0</ognl.version>
<ognl.version>4.1.0</ognl.version>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-ognl</artifactId>
<version>${ognl.version}</version>
</dependency>
使用
定义注解
package com.xxx.arch.mw.nbp.ng.repos.component.advisor;
import com.xxx.arch.mw.nbp.ng.base.constants.CommonConstants;
import java.lang.annotation.*;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LindormAdvisor {
/**
* 顾问类型
*
* @return 顾问类型
*/
AdvisorType type() default AdvisorType.NONE;
/**
* 访问类型
*
* @return 访问类型
*/
AccessType accessType();
/**
* 字段位置
*
* @return 字段位置
*/
int fieldIndex() default 0;
/**
* 字段位置
*
* @return 字段位置
*/
String fieldExpression() default CommonConstants.EMPTY;
}
使用注解
@Override
@LindormAdvisor(type = AdvisorType.INSTANCE_ID, accessType = AccessType.CREATE, fieldExpression = "instanceId")
public int write(final InstanceDO instanceDO) throws NbpException {
...
}
添加切面
package com.xxx.arch.mw.nbp.ng.repos.component.advisor;
import org.aspectj.lang.annotation.Pointcut;
public class LindormAdvisorPointCuts {
@Pointcut("execution(* com.xxx.arch.mw.nbp.ng.repos.accessor.lindorm.*DAO.*(..))")
public void allLindormApi() {
}
}
切面处理
package com.xxx.arch.mw.nbp.ng.repos.component.advisor;
import com.xxx.arch.mw.nbp.ng.base.component.switcher.BizSwitcher;
import com.xxx.arch.mw.nbp.ng.base.utils.IdUtils;
import org.apache.ibatis.ognl.Ognl;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LindormAdvisorAspect {
@Around("LindormAdvisorPointCuts.allLindormApi()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
if (!BizSwitcher.LINDORM_ADVISOR_ENABLED) {
return joinPoint.proceed();
}
final MethodSignature signature = (MethodSignature) joinPoint.getSignature();
final LindormAdvisor advisor = signature.getMethod().getDeclaredAnnotation(LindormAdvisor.class);
if (advisor == null || advisor.type() == AdvisorType.NONE) {
return joinPoint.proceed();
}
Object target = joinPoint.getArgs()[advisor.fieldIndex()];
target = Ognl.getValue(advisor.fieldExpression(), target);
// TODO: 使用获取到的对象做一些事情
return joinPoint.proceed();
}
}

825

被折叠的 条评论
为什么被折叠?



