拦截接口上的注解

主要用于拦截service层,监听PO变化,实现PO到DTO的更新。
1.配置类

@Configuration
public class AnnotationAopConfig {

    @Bean
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
        return new DefaultAdvisorAutoProxyCreator();// 这个类就是自动代理创建器,能够自动的为每个bean生成代理
    }
}

2.aop父类

public abstract class AnnotationAop extends StaticMethodMatcherPointcutAdvisor implements MethodInterceptor {

    public AnnotationAop(){
        this.setAdvice(this);
        this.setOrder(1);//设置顺序,值越小,优先级越高,也就是越被先执行
    }

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        ReflectiveMethodInvocation in= (ReflectiveMethodInvocation) invocation;
        doBefore(in);
        Object object = invocation.proceed();
        doAfter(in,object);
        return object;
    }

    @Override
    public boolean matches(Method method, Class targetClass) {
        return method.isAnnotationPresent(pointCut()) || targetClass.isAnnotationPresent(pointCut());
    }

    //获取执行对象
    protected Object getTarget(ReflectiveMethodInvocation invocation){
        return invocation.getThis();
    }

    //获取方法
    protected Method getMethod(ReflectiveMethodInvocation invocation){
        return invocation.getMethod();
    }

    //获取参数
    protected Object[] getArgs(ReflectiveMethodInvocation invocation){
        return invocation.getArguments();
    }

    //获取注解
    protected A getAnnotation(ReflectiveMethodInvocation invocation){
        return invocation.getMethod().getAnnotation(pointCut());
    }

    abstract public Class pointCut();

    abstract public void doBefore(ReflectiveMethodInvocation invocation);

    abstract public void doAfter(ReflectiveMethodInvocation invocation,Object result);

}

3.自定义注解

@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ListenDBOperate {
    DBOperate value();
}

4.aop类

@Component
public class ListenDBOperateAop extends AnnotationAop {
    @Override
    public Class pointCut() {
        return ListenDBOperate.class;
    }

    @Override
    public void doBefore(ReflectiveMethodInvocation invocation) {
        System.out.printf("1:before:%s:%s:%s:%s%n"
                , getTarget(invocation).getClass().getName()
                , getMethod(invocation).getName()
                , JSON.toJSONString(getArgs(invocation))
                , getAnnotation(invocation).value());
    }

    @Override
    public void doAfter(ReflectiveMethodInvocation invocation, Object result) {
        System.out.printf("1:after:%s:%s:%s:%s%n"
                , getTarget(invocation).getClass().getName()
                , getMethod(invocation).getName()
                , JSON.toJSONString(getArgs(invocation))
                , getAnnotation(invocation).value());
    }

}

5.监听接口

public interface EntitySerFunction {
    //创建
    @ListenDBOperate(DBOperate.CREATE)
    T create(T entity);

    //删除
    @ListenDBOperate(DBOperate.DELETE)
    int delete(I id);

    //修改
    @ListenDBOperate(DBOperate.UPDATE)
    T update(T entity);

    //刷新
    @ListenDBOperate(DBOperate.FLUSH)
    T flush(T entity);
}

6.测试类

class CarTest extends BaseJunit {
    @Autowired
    private UserSer ser;

    @Test
    void case1(){
        User user=new User();
        user.setName("赵妹妹");
        user.setAge(33);
        user=ser.create(user);

        ser.select(user.getId());

        user.setName("赵姐姐");
        user.setAge(34);
        user=ser.update(user);

        user.setName("赵老婆");
        user=ser.flush(user);

        ser.delete(user.getId());

        User user1=new User();
        user1.setName("测试");
        user1.setAge(18);
        ser.create(user1);
    }
}

7.结果

1:before:com.o3gene.listen_jpa.entity.user.UserSerImp$$EnhancerBySpringCGLIB$$63f1ae0:create:[{"age":33,"name":"赵妹妹"}]:CREATE
1:after:com.o3gene.listen_jpa.entity.user.UserSerImp$$EnhancerBySpringCGLIB$$63f1ae0:create:[{"age":33,"id":70,"name":"赵妹妹"}]:CREATE
1:before:com.o3gene.listen_jpa.entity.user.UserSerImp$$EnhancerBySpringCGLIB$$63f1ae0:update:[{"age":34,"id":70,"name":"赵姐姐"}]:UPDATE
1:after:com.o3gene.listen_jpa.entity.user.UserSerImp$$EnhancerBySpringCGLIB$$63f1ae0:update:[{"age":34,"id":70,"name":"赵姐姐"}]:UPDATE
1:before:com.o3gene.listen_jpa.entity.user.UserSerImp$$EnhancerBySpringCGLIB$$63f1ae0:flush:[{"age":34,"id":70,"name":"赵老婆"}]:FLUSH
1:after:com.o3gene.listen_jpa.entity.user.UserSerImp$$EnhancerBySpringCGLIB$$63f1ae0:flush:[{"age":34,"id":70,"name":"赵老婆"}]:FLUSH
1:before:com.o3gene.listen_jpa.entity.user.UserSerImp$$EnhancerBySpringCGLIB$$63f1ae0:delete:[70]:DELETE
1:after:com.o3gene.listen_jpa.entity.user.UserSerImp$$EnhancerBySpringCGLIB$$63f1ae0:delete:[70]:DELETE
1:before:com.o3gene.listen_jpa.entity.user.UserSerImp$$EnhancerBySpringCGLIB$$63f1ae0:create:[{"age":18,"name":"测试"}]:CREATE
1:after:com.o3gene.listen_jpa.entity.user.UserSerImp$$EnhancerBySpringCGLIB$$63f1ae0:create:[{"age":18,"id":71,"name":"测试"}]:CREATE

你可能感兴趣的:(拦截接口上的注解)