自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 事物执行流程分析

ConnectionHolder存放了数据源,最终存放在DataSourceTransactionObject。此时ConnectionHolder为null。将自动提交设置为false。

2023-04-28 16:27:19 972 1

原创 spring事物初始化过程分析

3.执行org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization。获取beanname->判断beanname是否有长度并且没有被处理过->是否遍历放入advisedBeans->1.首先去类对应的方法中寻找是否有@Transaction。4.接口方法找不到再去接口找,3.类上找不到再去接口方法找。是否是基础类->是否该跳过。2.方法找不到去类上找。

2023-04-28 15:48:46 878

原创 Spring事物执行流程分析

获取事物管理器,开发者会配置一个事物管理器,让后放入spring人容器中。拿到@Transaction注解上面的属性。targetSource是什么?从容器里获取,然后放入cache中。cacheKey包括目标方法和目标类。获取拦截链,一般就一个事物拦截链。获取targetClass。

2023-04-28 10:32:17 152

原创 aop执行顺序

顺序:around,before先执行,然后拦截链上的执行完后,执行目标方法,最后根据执行结果来执行throwing,returning,一定会执行after.注意around和before顺序不是固定的,根据拓扑排序来确定。啥也不做,回到拦截链上,如果有异常,然后不会异常,又抛出异常。先去执行before里面的方法然后回到拦截链上。此时拦截链已经执行完了,然后就去执行目标方法。回到拦截链,最后一定会执行,finally。又回到拦截链上,然后获取到返回值。第二行又回到拦截链上了。啥也不做,回到拦截链上。

2023-04-27 15:52:17 1102

原创 Spring aop如何寻找advisor

==================下面开始解析after===============2.第四个是我们之前开启的注解@EnableAspectJAutoProxy。1.bean的生命周期第一步回去解析所有的advisor。判断当前bean上是否有@Aspect。

2023-04-27 15:05:51 452

原创 SpringBoot tomcat核心参数

后续的请求一直处于等待状态。下面这两个参数:可以根据操作系统的性能调大一点,让tomcat有更多的线程来处理请求,如果线程不够多,且程序处理比较耗时,后续的请求就会一直处于等待状态。jmeter发起100个请求,发现有10%的错误率,也就是有10个不能处理,也就是说,一次性只能处理90个请求,也就是80+10.第一个参数底层tomcat默认开启20个请求,第二个参数表示一次只能处理200个请求,等200个请求处理完在处理下一个请求。看第二个参数:如果我发起了220个请求,用jmeter发起压测看看效果。

2023-04-24 11:21:16 1140

原创 Spring优雅停机

1.增加addShutdownHook,只要kill 进程号就会触发该方法,不能kill-9。2.使用ApplicationContext的close方法关闭服务,之前文章也介绍过。3.通过ApplicationListener监听容器关闭事件。4.@PreDestroy之前文章介绍过。

2023-04-24 10:07:08 128

原创 手写tomcat逻辑

获取url后,根据映射uri和处理类的映射关系,获取对应的处理类,反射执行目标方法。1.所有的接口都继承一个父类接口。

2023-04-21 14:38:24 44

原创 mybatis入参和parameterType不一致分析

答案: ps set值得时候发现类型不匹配,报错了,所以一定要把入参和ParameterType匹配对,否则会报错。1.如果数据库中id为int类型,而java代码层面入参给个String,此时会发生什么?问题2:如果入参给String类型,而parameterType写成int会发生什么?代码入参为String。

2023-04-20 14:21:25 283

原创 resultMap如何处理结果映射

主要是数据库中的字段是否包括映射column字段,如果包括那么直接 获取对应的数值,进行反射给目标对象。答案:可以,底层就是通过column获取数据库的值,然后反射,跟jdbcType没关系。问题2:resultMap 对应的result可以不带jdbcType吗?2.根据column获取数据库中对应的值,然后反射给空值对象。1.获取type类型,然后实例化一个空值对象,

2023-04-20 14:03:40 98

原创 Springboot如何启动内嵌tomcat

就这样制动注入一个tomcat的工厂结束了,整个web启动就结束了。这里为什么能拿到tomcat的容器:,后续自动装配详细解释。1.首先判断容器的类型,这里是servlet类型。我们看看如何自动注入tomcat的?到此tomcat启动结束。自然是调用父类的刷新方法。

2023-04-19 10:23:18 814

原创 mybatis面试题(阅读源代码后原创)

可以,此时的key就是不带全路径的类名。由于setting里面没有配置cacheEnable的属性,这里默认为true,所以默认开启,报错,settings的属性在这个类里面体现了,如果乱写,检测不到set方法反射报错了。从图中可以看到,能得到一个事物工厂和一个数据源,最后构建成一个environment。这种方式定义mapper,命名空间可以和类路径不一样吗?4.一级缓存为什么默认是开启的,二级缓存默认是关闭的?二级缓存:从图中可以看出,如果没有配置就get不到。如果不能,那有哪些值?

2023-04-18 11:29:22 118

原创 Spring-Web spi机制解析

看着核心的8行,就能启动一个mvc项目,主要是初始化一个DispacherServlet,刷新容器等操作,和mvc的流程一样。将符合条件的加入list中,非接口,非抽象,是WebApplicationInitializer类型的,然后排序,回调。先看启动类:tomcat.start(),后就会去调用spring-web里面spi机制。这里的操作和之前手动注入DispatcherServlet一样。可以发现程序进来了:主要spi机制,看看这里做了什么操作?在这里打个断点,查看程序是否会进来。

2023-04-07 14:59:55 343

原创 SpringBoot启动类

会根据Order的顺序来排序,先是Order的大小,小的优先,如果相同那就ApplicationRunner优先。获取容器中所有的ApplicationRunner和CommandLineRunner,排好序后进行回调。容器启动后还有最后一步操作:回到Runner。

2023-04-07 13:45:05 351

原创 SpringBoot监听器的几种写法

org.springframework.boot.SpringApplication#prepareEnvironment只要事件是环境准备好的事件就会进入if条件获取配置文件中的context.listener.classes和初始化器一样的逻辑。注意这种写法只能监听ApplicationEnvironmentPreparedEvent这种事件。1.之前讲的在spring.factories写监听器对应的全路径。3.在属性文件中添加属性配置。

2023-04-07 11:31:29 303

原创 SpringBoot事件的选取原理

故第一个监听器监听的是ApplicationStartedEvent该时间,和实际发布的事件ApplicationStartingEvent不一样。故不会执行业务逻辑。如果是smart类型的监听器则直接判断重写得方法,不是的话,直接判断发布事件类型和监听事件类型是否一致。如果不是GenericApplicationListener则new一个,是否重新了这两个方法。遍历我们注册的监听器,但这里有个判断条件,supportsEvent。容器发布一个正在启动的事件。

2023-04-07 10:58:47 299

原创 SpringBoot监听器

org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider 5个值。org.springframework.boot.autoconfigure.AutoConfigurationImportListener 1个值。org.springframework.boot.diagnostics.FailureAnalysisReporter 1个值。

2023-04-07 10:49:33 518

原创 SpringBoot初始化器解析

3.第三种: 在application.properties里面添加如下属性,注意这里有个DelegatingApplicationContextInitializer的初始化器回去寻找配置文件下的。1.容器初始化,会读取所有jar包下的META-INF/spring.factories路径的ApplicationContextInitializer然后初始化为对象。context.initializer.classes属性对应的class,然后实例化,然后进行回调。2.第二种:手动添加监听器。

2023-04-07 09:58:45 496

原创 aop拦截器链执行流程

等所有链路执行完了,执行目标方法,然后根据是否报错,报错执行报错逻辑,有返回值则执行返回值逻辑,顺便可以吧返回值带进业务逻辑,无论如何都是执行after逻辑,应为是finally包裹的。执行第5个执行链MethodBeforeAdviceInterceptor,会先执行业务逻辑,然后回到链路上。总结:记住这5个执行链的顺序,实际打出来的结果和这个不一样,原因是链路执行顺序并不是业务执行的顺序,before是由业务逻辑的,执行完后才会去执行链路,也就是先于链路执行,所有链路上的拦截器执行完后,执行目标方法。

2023-04-06 17:42:57 574

原创 Aop分析

总结:开启该注解@EnableAspectJAutoProxy会注入一个AnnotationAwareAspectJAutoProxyCreator bpp,before会解析所有的advisor放入缓存中,after会根据bean来创建代理对象。遍历我们刚刚注入的8个bpp,主要是第四个动态代理的核心逻辑。会遍历所有的advisor然后放入缓存供后续使用。是否还记的bean的生命周期第一步,发现执行完后又注册了4个bpp.最后会加一个系统的advisor。判断当前的bean是否需要代理。

2023-04-06 17:12:12 251

原创 aop的一些专业术语

跟Advice类似的还有一个Advisor的概念,一个Advisor是有一个Pointcut和一个Advice组成的,通。4. After (finally) advice:方法执行完finally之后执行,这是最后的,比return更后。过Pointcut可以指定要需要被代理的逻辑,上篇文章的代码分析也清晰的解释了Advisor里面包好了Advice。5. Around advice:这是功能最强大的Advice,可以自定义执行顺序。3. After throwing advice:方法抛异常后执行。

2023-04-06 15:01:16 335

原创 Spring封装的动态代理

构造对象,interceptorsAndDynamicMethodMatchers这个有值了,后续会使用到。下面回去执行我们写的代理逻辑,然后执行 invocation.proceed();再次进来就会去反射执行目标方法,目标方法执行完了,整个流程结束。这里会调用我们手写的方法,然后执行processor。2.代理对象使用哪种模式,jdk or cglib。如果是接口或者代理类直接返回jdk动态代理。这样就反射到目标方法了,整个流程结束。责任链模式,第一次肯定不会相等。看看如何创建代理对象。

2023-04-06 14:55:36 474

原创 动态代理2种方法

动态代理2种方法

2023-04-06 13:56:22 598

原创 Spring监听的另一种写法

在spring容器手动加了一个ApplicationListenerMethodAdapter,供后续使用。遍历所有bean里面的所有加了@EventListener注解的方法。执行目标方法的时候,这个监听器这正是我们注册的那个适配器。@EventListener在哪里解析的?找到后开始遍历,这里也是个适配器模式。最后反射进到监听的目标方法中。

2023-04-06 11:29:35 808

原创 spring容器监听

如果容器中没有就会注册一个SimpleApplicationEventMulticaster供后续使用。spring的默认事件:有6个,我们常用的就4个,如果我监听容器关闭事件,当容器刷新的时候能执行方法吗?这里会根据事件拿到所有的监听器。上图的执行流程是怎样的?发布一个容器刷新事件。这个广播器从哪里来?

2023-04-06 11:13:52 303

原创 Spring构造方法注入

如果手动设置了构造的方法,那么直接根据配置来装配就好了,这个是手动注入,指定那种就用那种来装配。1.如果没有手动设置构造的注入方法,直接跳过,进行下面的解析。这种情况下会使用哪个构造方法。2.直接使用无参的构造方法。

2023-04-06 11:02:24 496

原创 Spring依赖注入详解

启动容器后看看到底能不能拿到teacherService的值。我们具体来分析怎么注入的。会将set后面的方法去掉set,然后首字母小写放入缓存中,来获取对应的注入值,如果找不到直接报错。如果是这样会报错吗?不会,底层拿到set方法然后进行反射,故set方法和注入的属性一直就不会报错。发现pvs里面有一个我们自己set的值。问题1:如果set方法乱写可以注入吗?不行,会报错,我们看看具体在哪里报错。直接从容器中获取,然后进行属性赋值。

2023-04-06 10:14:06 717

原创 Spring Bean的详细生命周期

1.实现该类InstantiationAwareBeanPostProcessor,如果不返回null,则表示自己自己生成bean,不走spring的生命周期,但会走aop,如果返回null,则继续走生命周期。3.applyMergedBeanDefinitionPostProcessors,主要用于修改mbd,找到初始化,销毁方法,10. 执行beanpostprocess before。8.执行beanpostprocess before。依赖注入,初始化,销毁方法寻找等。6.进行mbd属性赋值。

2023-04-06 09:31:24 78

原创 Spring注入数组,map源码分析

Spring注入数组,map源码分析

2023-04-05 17:52:41 48

原创 Spring注入list源码分析

Spring注入list源码分析

2023-04-05 16:03:56 57

原创 spring能否什么类型的bean都能自动注入?

spring能否什么类型的bean都能自动注入?

2023-04-05 11:50:46 60

原创 @Autowired的解析流程1

@Autowired的解析流程1

2023-04-05 11:23:25 998

原创 spring中产生bean的几种方式

spring中产生bean的几种方式

2023-04-04 20:49:22 1048

原创 Spring销毁的几种实现

Spring销毁的几种实现

2023-04-04 20:11:33 1087

原创 Spring初始化实现的几种方式

Spring初始化实现的几种方式

2023-04-04 19:04:32 1386 1

原创 SpringMvc参数解析分析

这样就拿到了参数,其他的@Param的解析方式一样,也是从26个解析器中选择一个,然后进行解析,然后得到用户传递进来的参数,然后反射目标方法。通过策略模式找到参数对应的解析器进行解析,一共有26中解析器,并放入缓存中,下次要用的时候直接从缓存中获取。像这种请求response是如何传递进来的?

2023-03-31 16:51:46 39

原创 SpringMvc执行过程

2.根据url获取对应的HandlerMethod,如果匹配到多个,比如模糊匹配到多个,或者路径相同等,则会进行优先级判断,最终判断不了则报错。主要就是我们的类是否实现了Controller,HttpRequestHandler或者能找到对应的方法。8.刚刚我们在找处理器执行链的时候注入了一个拦截器,现在开始执行拦截器,为true就放行继续执行下面的步骤。3.找到后会根据方法找到对应的类,最后根据类从spring容器中获取bean。这种模式的处理器适配器,将handler强转直接执行目标方法就好了。

2023-03-31 16:35:31 227

原创 SpringMvc核心源码分析

然后看这个org.springframework.web.servlet.handler.AbstractHandlerMethodMapping类,会初始化所有的method,url关系到mappingRegistry中。将映射关系,url,方法注入到mappingRegistry中,后续doDispatcher的时候用得到。最后spring刷新的时候,会发布一个刷新的事件,之前已经注册了一个监听刷新事件,所以这时候会回调,注意:我们开启了这个注解,在启动spring的时候会解析对应的bean到容器中。

2023-03-31 14:53:01 126

原创 手写spring逻辑

主要是根据ioc容器上面如果有@Controller注解,然后遍历该类下所有方法上带有@RequestMapping的注解,然后把url和method映射关系存入到map中。主要是初始化spring容器,包括扫描路径下的所有bean,放入ioc容器中,doDispatcher,通过反射找到对应的method执行业务逻辑。4.当第三步初始化好后,最后会去执行。1.继承HttpServlet。//初始化请求映射关系。

2023-03-31 09:28:47 33

原创 Mybatis整合Spring原理与过程

核心在@MapperScan这个注解,ImportBeanDefinitionRegistrar这是一个bfpp,spring启动的时候一定会执行,这个类主要是用来将自定义的beandefinition注入到容器中,这两行,注意所有的class都是FactoryBean类型,有多少个mapper就有多少个factorybean,5.spring生命周期会调用getObject()最后注入到spring容器中,注意这里是一个代理对象。6.那么sqlSession的值怎么来的?主要是把接口注入到构造方法里面。

2023-03-31 09:26:49 157

空空如也

空空如也

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

TA关注的人

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