springAop的几种使用案例

    1. 统一异常处理;

在程序中我们一般自定义异常,当程序出现异常时,前端需要我们报出和正常返回的一样的数据结构,这时候就要我们做到系统能随时监控程序中抛出的异常,不能把异常抛到前端页面,需要处理后以统一的格式返回给前端;在springboot中有一个注解@RestControllerAdvice,帮我们实现了这一种机制,时刻监控整个程序中抛出的异常;

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(SQLException.class)
    public RespBean sqlException(SQLException e) {
        if (e instanceof SQLIntegrityConstraintViolationException) {
            System.out.println("异常为"+e);
            return RespBean.error("该数据有关联数据,操作失败!");//统一格式返回给前端
        }
        //此处可以多个if接到不同的异常类型分类处理
        System.out.println("sql异常为"+e+e.getMessage());
        return RespBean.error("数据库异常,操作失败!");
    }
}  

2.Java动态代理

 public List<Orders> getList(Integer page,Integer size){
        // newProxyInstance的三个参数解释:
        // 参数1:代理类的类加载器,同目标类的类加载器
        // 参数2:代理类要实现的接口列表,同目标类实现的接口列表
        // 参数3:回调,是一个InvocationHandler接口的实现对象,当调用代理对象的方法时,执行的是回调中的invoke方法
        //proxy为代理对象


        OrderMapper orderMapper = (OrderMapper) Proxy.newProxyInstance(ordermapper.getClass().getClassLoader(), ordermapper.getClass().getInterfaces(), new InvocationHandler() {
            //必须重写invoke方法
            // 参数proxy:被代理的对象,这个对象就是ordermapper
            // 参数method:执行的方法,代理对象执行哪个方法,method就是哪个方法,比如下边的getList
            // 参数args:执行方法的参数:这里没有

            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                System.out.println("生活真的艰难");
                System.out.println(o.toString());
                System.out.println(objects);
                System.out.println(method.toString());
                Object result = method.invoke(ordermapper, objects);
                return result;
            }
        });
        List<Orders> ordersList = orderMapper.getList();
        System.out.println(ordersList);
        return ordersList;
    }

  3.动态代理实现的cglib

public class CglibProxy implements MethodInterceptor{
 private Enhancer enhancer = new Enhancer();
 public Object getProxy(Class clazz){
  //设置需要创建子类的类
  enhancer.setSuperclass(clazz);
  enhancer.setCallback(this);
  //通过字节码技术动态创建子类实例
  return enhancer.create();
 }
 //实现MethodInterceptor接口方法
 public Object intercept(Object obj, Method method, Object[] args,
   MethodProxy proxy) throws Throwable {
  System.out.println("前置代理");
  //通过代理类调用父类中的方法
  Object result = proxy.invokeSuper(obj, args);
  System.out.println("后置代理");
  return result;
 }

  

public class DoCGLib {
 public static void main(String[] args) {
  CglibProxy proxy = new CglibProxy();
  //通过生成子类的方式创建代理类
  SayHello proxyImp = (SayHello)proxy.getProxy(SayHello.class);
  proxyImp.say();
 }

  

 

posted @ 2020-11-05 16:28  瞌睡青年  阅读(203)  评论(0)    收藏  举报