切面和OGNL简单使用记录备忘

使用自定义方法注解,获取入参中的某字段进行方法增强(如路由等)

添加依赖

<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();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值