自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 收藏
  • 关注

原创 SpringBoot自动配置

自动配置类本质上就是一个配置类而已,只是用 META-INF/spring.factories 管理,与应用配置类解耦@Enable 打头的注解本质是利用了 @Import@Import 配合 DeferredImportSelector 即可实现导入,selectImports 方法的返回值即为要导入的配置类名DeferredImportSelector 的导入会在最后执行,为的是让其它配置优先解析));//spring识别的import。

2024-07-02 16:40:08 754

原创 SpringBoot启动流程

这其中有异常,发布 application failed 事件7️⃣。这其中有异常,发布 application failed 事件7️⃣。发布 application context 已初始化事件3️⃣。发布 application context 已初始化事件3️⃣。发布 application starting 事件1️⃣。发布 application starting 事件1️⃣。发布 application started 事件5️⃣。发布 application started 事件5️⃣。

2024-06-29 17:05:04 709

原创 spring之HelloWord版

2024-06-28 14:57:25 533

原创 16AOP通知调用

通知共有五种类型,最终都是转换为环绕通知执行,其他几种通知就需要转换为环绕通知,因此就需要适配其他几种通知,转化为中间的类或者对象即为是适配器对象。进入环绕通知2,执行前增强,调用 mi.proceed() 发现没有环绕通知,调用 mi.invokeJoinPoint() 执行目标方法。进入环绕通知1,执行前增强,再次调用 mi.proceed() 发现有下一个环绕通知,调用它的 invoke(mi)环绕通知2继续将结果返回给环绕通知1,执行环绕通知1 的后增强。多个通知通过调用链执行,内部为递归调用。

2024-06-28 09:52:21 764

原创 15AOP从 @Aspect 到 Advisor

bean2依赖bean1的时候,并且bean1也依赖于bean2,即为循环依赖,bean1中有需要增强的方法,代理对象则是在bean1初始化之后创建,bea2则注入bea1的代理对象。bean2依赖注入bean1,由于bean1中的方法需要增强,因此需要注入代理对象,在bean实例化后,创建bean1的代理对象。有【资格】的 Advisor 一部分是低级的, 可以由自己编写, 如本例 A17 中的 advisor3。根据不同通知类型注解实现对应底层通知的实现,最终都是转化为环绕通知类型。

2024-06-26 09:58:22 754

原创 14jdk 和 cglib 在 Spring 中的统一

切面:Advisor,包含一个 Advice 通知,PointcutAdvisor 包含一个 Advice 通知和一个 Pointcut。如果指定了接口,且 proxyTargetClass = false,使用 JdkDynamicAopProxy。b. proxyTargetClass = false, 目标没有实现接口, 用 cglib 实现。a. proxyTargetClass = false, 目标实现了接口, 用 jdk 实现。Spring 中对切点、通知、切面的抽象如下。

2024-06-25 10:54:47 463

原创 CGlib动态代理进阶

和 jdk 动态代理原理查不多回调的接口换了一下,InvocationHandler 改成了 MethodInterceptor调用目标时有所改进,见下面代码片段method.invoke 是反射调用,必须调用到足够次数才会进行优化methodProxy.invoke 是不反射调用,它会正常(间接)调用目标对象的方法(Spring 采用)methodProxy.invokeSuper 也是不反射调用,它会正常(间接)调用代理对象的方法,可以省略目标对象。

2024-06-18 20:03:37 723

原创 12AOP-jdk代理实现及特点

jdk代理实现原理方法重写可以增强逻辑,只不过这【增强逻辑】千变万化,不能写死在代理内部通过接口回调将【增强逻辑】置于代理类之外配合接口方法反射(是多态调用),就可以再联动调用目标方法会用 arthas 的 jad 工具反编译代理类限制⛔:代理增强是借助多态来实现,因此成员变量、静态方法、final 方法均不能通过代理实现。

2024-06-18 11:28:20 472

原创 11AOP 实现之 proxy两种代理模式

jdk 动态代理要求目标必须实现接口,生成的代理类实现相同接口,因此代理与目标之间是平级兄弟关系newProxyInstance参数分别为类加载器,代理类需要实现的接口,具体的目标方法及增强逻辑目标类可以使用final修饰void foo();// jdk 只能针对接口代理// 目标对象//类加载器,因为使用反射需要将字节码加载到jvm中});foo.foo();

2024-06-13 19:52:24 197

原创 10AOP非代理增强

运行时需要在 VM options 里加入 -javaagent:C:/Users/manyh/.m2/repository/org/aspectj/aspectjweaver/1.9.7/aspectjweaver-1.9.7.jar 把其中 C:/Users/manyh/.m2/repository 改为你自己 maven 仓库起始地址。使用非代理的形式实现AOP即使用了ajc的编辑器,改写了目标对象的class文件,和spring没有联系。实现的话需要增加ajc编译插件的pom依赖。

2024-06-12 21:39:23 298

原创 08Scope

在当前版本的 Spring 和 Spring Boot 程序中,支持五种 Scopesingleton,容器启动时创建(未设置延迟),容器关闭时销毁prototype,每次使用时创建,不会自动销毁,需要调用 DefaultListableBeanFactory.destroyBean(bean) 销毁request,每次请求用到此 bean 时创建,请求结束时销毁session,每个会话用到此 bean 时创建,会话结束时销毁。

2024-06-01 17:19:40 369

原创 07bean的初始化和销毁

Spring 提供了多种初始化手段,除 @PostConstruct,@Bean(initMethod) 之外,还可以实现 InitializingBean 接口来进行初始化,如果同一个 bean 用了以上手段声明了 3 个初始化方法,那么它们的执行顺序是。与初始化类似,Spring 也提供了多种销毁手段,执行顺序为。@Bean(destroyMethod) 指定的销毁方法。@Bean(initMethod) 指定的初始化方法。@PostConstruct 标注的初始化方法。

2024-06-01 14:11:42 269

原创 06Aware接口

Java 配置类包含 BeanFactoryPostProcessor 的情况,因此要创建其中的 BeanFactoryPostProcessor 必须提前创建 Java 配置类,而此时的 BeanPostProcessor 还未准备好,导致 @Autowired 等注解失效。就如myconfig1类,需要先将Myconfig1解析创建,然后解析@Bean新增的bean工厂后置处理器,在创建的时候由于BeanPostProcessor 还未执行,因此Autowired也不执行,此时类已经创建完成。

2024-05-30 13:55:01 351

原创 05beanfactory后置处理器

获取componentScan注解的basepage属性值,即为包名,并将其转为路径获取类路径下的所有资源类文件,获取其元数据根据其元数据判断类中是否有component注解及其派生注解有的话注册bd到map中获取该类的元数据获取类中所有标注@bean注解的方法根据方法构造bd,注册到Map中单个mapper可以使用@bean注入多个mapper使用mapperscan获取mapperscan的包转为类路径,并获取资源获取资源的下类的元信息。

2024-05-29 20:26:33 556

原创 04bean后置处理器

AutowiredAnnotationBeanPostProcessor.findAutowiringMetadata 用来获取某个 bean 上加了 @Value @Autowired 的成员变量,方法参数的信息,表示为 InjectionMetadata。@Autowired 等注解的解析属于 bean 生命周期阶段(依赖注入, 初始化)的扩展功能,这些扩展功能由 bean 后处理器来完成。InjectionMetadata 可以完成依赖注入。每个后处理器各自增强什么功能。

2024-05-27 14:06:39 239

原创 03bean的生命周期

在容器的启动的时候,bean的加载等过程都是固定的,如bean后置处理器的加载,autowird注入已经实现,如果需要增加resource注入,就需要改变bean后置处理器加载的代码,此时需要对bean进行增强扩展,可能就要改动原流程的逻辑,但是使用模板方法设计,抽象出来一个接口,去实现不同的增强,相当于说给外界留下一个增强点,可以增加自定义的增强逻辑,如果要增加新resource注入功能,则在后在后置处理器接口。这里返回的对象会替换掉原本的 bean。这里返回的对象会替换掉原本的 bean。

2024-05-23 19:11:27 380 1

原创 spring02容器实现

另外要注意的是,后面这些带有 ApplicationContext 的类都是 ApplicationContext 接口的实现,但它们是。AnnotationConfigWebApplicationContext,传统 SSM 整合时,基于 java 配置类的容器(旧)ClassPathXmlApplicationContext,从类路径查找 XML 配置文件,创建容器(旧)XmlWebApplicationContext,传统 SSM 整合时,基于 XML 配置文件的容器(旧)

2024-05-18 08:47:44 302

原创 容器和bean-beanfactory和applicationcontext

本合集是学习课程【黑马程序员Spring视频教程,深度讲解spring5底层原理-哔哩哔哩】的笔记,主要为课程笔记、练习代码及自己的一些理解,目前计划在两个月内完成学习,暂不涉及web章节。

2024-05-17 10:51:56 192

原创 代码随想录刷题总结--栈和队列

使用一个队列模拟,每当移除元素,先移除队列中的前size-1个元素,然后将前size-1元素进入队列,此时最先进入的元素就在队列的最低前面了,然后移除队列元素。出队列则将第一个栈中的元素放入 第二个栈中,再弹出,此时先放入的元素,就已经在第二个队列的最前面,就可以实现先进先出的效果。可以使用栈,遍历符号,当符号口朝左边,则放入栈中对应的朝向右边的括号 ,当遍历的字符朝向右边,并且匹配则移除元素我匹配成功。给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

2024-01-06 16:37:19 1110 1

原创 代码随想录刷题总结--字符串类

给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。示例 1: 输入:["h","e","l","l","o"] 输出:["o","l","l","e","h"]注意返回需要返回一个处理过的字符串,将输入的字符串以字符处理,处理完成需要将字符串数组转为新的字符串对象返回。

2024-01-01 17:14:18 1011

原创 代码随想录刷题总结--哈希篇

题中为某个元素出现的次数等意思,考虑使用哈希法哈希表实际操作一般由三类,数组,元素有限且数量较小的情况使用,set,可以去重,数量大不确定适用,map适用于key:vaule的结构。

2023-12-27 20:22:10 960

原创 代码随想录刷题总结--链表篇

4.add的方法可以抽取出来一个公共的方法,插入头部和尾部可以根据预先定义插入的相对位置,插入节点的原理也是需要找到插入位置的前一个节点,让前一个节点指向该节点,该节点指向的前一个节点的下一个节点。3.开始遍历链表,当链表的值时val的时候,让前一个节点的next指向当前节点的next,否则,前一个节点就等于当前节点,然后让当前节点等于next节点继续遍历。2.开始遍历链表,只要当前节点不为空,操作当前节点指向前一个节点,前一个节点则等于当前节点,然后将当前节点定义为临时节点保存的下一个节点。

2023-12-24 18:03:27 1032

原创 「代码随想录」数组章节总结

当元素和目标元素一样的时候,不做处理,并且慢指针不动,当元素不一样说明中间的元素需要保留,不能处理,即为不同步停止时,慢指针停止的都为目标元素值,后续的元素值全都向前覆盖。3.开始遍历,判断如果尾指针的元素大于首指针,则尾指针对应的元素为当前元素,让尾指针--,如果小于的话则为头指针,头指针++,每次都让数组下标--双指针的思想,遍历右指针,固定左指针,当符合条件时候,固定右指针,左指针一致缩小,即可返回符合条件的最小的区间。2.定义变量,一个指针是0,另一个指针指向末尾,新定义一个返回的数组,和下标。

2023-12-19 19:44:49 344

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除