我们知道java文件在编译期间会成为class字节码文件, 运行时加载对应的类到方法区
所以使用JDK实现的原理就是
-
在运行期间, 根据被代理类, 生成代理类的字节码文件, 将被代理类包装到代理类中
-
被代理类方法执行前后, 统一处理逻辑
-
使用的时候:, 使用的是代理类 不再使用被代理类 因为我们的被代理类以及被代理类包裹了
CGLIB的实现方式
-
MethodInterceptor完成方法执行前后的业务逻辑插入, 再通过ASM字节码技术, 生成代理类的字节码,
-
当然这个也有前提条件: 被代理类不需要实现接口, 但不能为final修饰
-
使用@ControllerAdvice 和 @ExceptionHandler 实现 然后指定要捕获的异常类就可以了 (可以有多个)
-
自定义一个异常
package todayTest.application.modle;
/**
-
Created with IntelliJ IDEA.
-
Description: If you don’t work hard, you will a loser.
-
User: Listen-Y.
-
Date: 2020-08-18
-
Time: 10:13
*/
public class DiyException extends Exception {
public DiyException(String message) {
super(message);
}
}
- 配置web请求返回异常
//访问test12直接返回自定义异常
@RequestMapping(value = “test12”)
public Object test12() throws DiyException {
throw new DiyException(“这是一个自定义异常”);
}
- 实现@ControllerAdvice统一处理异常
package todayTest.application.interceptor;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import todayTest.application.modle.DiyException;
/**
-
Created with IntelliJ IDEA.
-
Description: If you don’t work hard, you will a loser.
-
User: Listen-Y.
-
Date: 2020-08-18
-
Time: 10:24
*/
//指名身份, 这是一个拦截Control