随笔分类 - spring 原理
spring 如何实现的相关底层知识
摘要:常见的返回值处理器演示 点击查看代码 /* 目标: 解析控制器方法的返回值 常见的返回值处理器 org.springframework.web.servlet.mvc.method.annotation.ModelAndViewMethodReturnValueHandler@4c9e38 org.
阅读全文
摘要:** @ModelAttribute** 在整个 HandlerAdapter 调用过程中所处的位置 收获💡 RequestMappingHandlerAdapter 初始化时会解析 @ControllerAdvice 中的 @ModelAttribute 方法 RequestMappingHan
阅读全文
摘要:图1 classDiagram class ServletInvocableHandlerMethod { +invokeAndHandle(ServletWebRequest,ModelAndViewContainer) } HandlerMethod <|-- ServletInvocableH
阅读全文
摘要:准备 @InitBinder 准备 @InitBinder 在整个 HandlerAdapter 调用过程中所处的位置 sequenceDiagram participant adapter as HandlerAdapter participant bf as WebDataBinderFacto
阅读全文
摘要:底层第一套转换接口与实现 classDiagram Formatter --|> Printer Formatter --|> Parser class Converters { Set~GenericConverter~ } class Converter class ConversionServ
阅读全文
摘要:两种方法获取参数名 如果编译时添加了 -parameters 可以生成参数表, 反射时就可以拿到参数名 如果编译时添加了 -g 可以生成调试信息, 但分为两种情况 普通类, 会包含局部变量表, 用 asm 可以拿到参数名 接口, 不会包含局部变量表, 无法获得参数名 这也是 MyBatis 在实现
阅读全文
摘要:初步了解 RequestMappingHandlerAdapter 的调用过程 控制器方法被封装为 HandlerMethod 准备对象绑定与类型转换 准备 ModelAndViewContainer 用来存储中间 Model 结果 解析每个参数值 点击查看代码 private static voi
阅读全文
摘要:RequestMappingHandlerMapping 与 RequestMappingHandlerAdapter 俩是一对,分别用来 处理 @RequestMapping 映射 调用控制器方法、并处理方法参数与方法返回值 DispatcherServlet 初始化 点击查看代码 public
阅读全文
摘要:带参数绑定的通知方法调用 点击查看代码 @Aspect static class MyAspect { @Before("execution(* foo(..))") // 静态通知调用,不带参数绑定,执行时不需要切点 public void before1() { System.out.print
阅读全文
摘要:静态通知调用 代理对象调用流程如下(以 JDK 动态代理实现为例) 从 ProxyFactory 获得 Target 和环绕通知链,根据他俩创建 MethodInvocation,简称 mi 首次执行 mi.proceed() 发现有下一个环绕通知,调用它的 invoke(mi) 进入环绕通知1,执
阅读全文
摘要:代理创建器 点击查看代码 package org.springframework.aop.framework.autoproxy; // 包名与 AnnotationAwareAspectJAutoProxyCreator 一致,方便调用方法。 import org.aopalliance.inte
阅读全文
摘要:切点匹配规则 点击查看代码 public class S15 { public static void main(String[] args) throws Exception { //根据切点表达式判断当前方法是否匹配 AspectJExpressionPointcut pointcut1 = n
阅读全文
摘要:Spring 中对切点、通知、切面的抽象如下 切点:接口 Pointcut,典型实现 AspectJExpressionPointcut 通知:典型接口为 MethodInterceptor 代表环绕通知 切面:Advisor,包含一个 Advice 通知,PointcutAdvisor 包含一个
阅读全文
摘要:cglib 如何避免反射 点击查看模拟代码 /** * 模拟 methodProxy invoke() 方法调用生成的代理类,和代理对象配合使用 * 为什么类名是 FastClass 呢,因为动态生成的代理类的父接口就是它 */ public class S13ProxyFastClass { pr
阅读全文
摘要:cglib 代理进阶 模拟 cglib 代理 示例 public static void main(String[] args) { S12Target target = new S12Target(); S12Proxy s12Proxy = new S12Proxy(new MethodInte
阅读全文
摘要:jdk 动态代理进阶 模拟 jdk 动态代理 点击查看代码 public static void main(String[] args) { B b = new B(); A proxyInstance = (A) new $Proxy0(new InvocationHandler() { @Ove
阅读全文
摘要:jdk 动态代理 jdk 动态代理要求目标必须实现接口,生成的代理类实现相同接口,因此代理与目标之间是平级兄弟关系 点击查看代码 //注意包别导错了,一般我们使用的类都在 lang 包下,是基础类。 `import java.lang.reflect.Proxy;` interface A{ voi
阅读全文
摘要:AOP 实现之 ajc 编译器 aspectj 编译器 编译器也能修改 class 实现增强,直接通过修改字节码实现增强。 编译器增强能突破代理仅能通过方法重写增强的限制:可以对构造方法、静态方法等实现增强 3.在编译阶段进行增强 注意 版本选择了 java 8, 因为目前的 aspectj-mav
阅读全文
摘要:Scope 在当前版本的 Spring 和 Spring Boot 程序中,支持五种 Scope singleton,容器启动时创建(未设置延迟),容器关闭时销毁 prototype,每次使用时创建,不会自动销毁,需要调用 DefaultListableBeanFactory.destroyBean
阅读全文
摘要:初始化销毁顺序 Spring 提供了多种初始化手段,除了课堂上讲的 @PostConstruct,@Bean(initMethod) 之外,还可以实现 InitializingBean 接口来进行初始化,如果同一个 bean 用了以上手段声明了 3 个初始化方法,那么它们的执行顺序是 @PostCo
阅读全文