springAop的几种使用案例
- 统一异常处理;
在程序中我们一般自定义异常,当程序出现异常时,前端需要我们报出和正常返回的一样的数据结构,这时候就要我们做到系统能随时监控程序中抛出的异常,不能把异常抛到前端页面,需要处理后以统一的格式返回给前端;在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();
}

浙公网安备 33010602011771号