<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[u012222011的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/u012222011</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; u012222011]]></copyright><item><title><![CDATA[事物执行流程分析]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130428725</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130428725</guid><author>u012222011</author><pubDate>Fri, 28 Apr 2023 16:27:19 +0800</pubDate><description><![CDATA[ConnectionHolder存放了数据源，最终存放在DataSourceTransactionObject。此时ConnectionHolder为null。将自动提交设置为false。]]></description><category></category></item><item><title><![CDATA[spring事物初始化过程分析]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130425927</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130425927</guid><author>u012222011</author><pubDate>Fri, 28 Apr 2023 15:48:46 +0800</pubDate><description><![CDATA[3.执行org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization。获取beanname->判断beanname是否有长度并且没有被处理过->是否遍历放入advisedBeans->1.首先去类对应的方法中寻找是否有@Transaction。4.接口方法找不到再去接口找，3.类上找不到再去接口方法找。是否是基础类->是否该跳过。2.方法找不到去类上找。]]></description><category></category></item><item><title><![CDATA[Spring事物执行流程分析]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130420419</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130420419</guid><author>u012222011</author><pubDate>Fri, 28 Apr 2023 10:32:17 +0800</pubDate><description><![CDATA[获取事物管理器，开发者会配置一个事物管理器，让后放入spring人容器中。拿到@Transaction注解上面的属性。targetSource是什么？从容器里获取，然后放入cache中。cacheKey包括目标方法和目标类。获取拦截链，一般就一个事物拦截链。获取targetClass。]]></description><category></category></item><item><title><![CDATA[aop执行顺序]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130407689</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130407689</guid><author>u012222011</author><pubDate>Thu, 27 Apr 2023 15:52:17 +0800</pubDate><description><![CDATA[顺序：around，before先执行，然后拦截链上的执行完后，执行目标方法，最后根据执行结果来执行throwing,returning,一定会执行after.注意around和before顺序不是固定的，根据拓扑排序来确定。啥也不做，回到拦截链上，如果有异常，然后不会异常，又抛出异常。先去执行before里面的方法然后回到拦截链上。此时拦截链已经执行完了，然后就去执行目标方法。回到拦截链，最后一定会执行,finally。又回到拦截链上，然后获取到返回值。第二行又回到拦截链上了。啥也不做，回到拦截链上。]]></description><category></category></item><item><title><![CDATA[Spring aop如何寻找advisor]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130405518</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130405518</guid><author>u012222011</author><pubDate>Thu, 27 Apr 2023 15:05:51 +0800</pubDate><description><![CDATA[==================下面开始解析after===============2.第四个是我们之前开启的注解@EnableAspectJAutoProxy。1.bean的生命周期第一步回去解析所有的advisor。判断当前bean上是否有@Aspect。]]></description><category></category></item><item><title><![CDATA[SpringBoot tomcat核心参数]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130338134</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130338134</guid><author>u012222011</author><pubDate>Mon, 24 Apr 2023 11:21:16 +0800</pubDate><description><![CDATA[后续的请求一直处于等待状态。下面这两个参数：可以根据操作系统的性能调大一点，让tomcat有更多的线程来处理请求，如果线程不够多，且程序处理比较耗时，后续的请求就会一直处于等待状态。jmeter发起100个请求，发现有10%的错误率，也就是有10个不能处理，也就是说，一次性只能处理90个请求，也就是80+10.第一个参数底层tomcat默认开启20个请求，第二个参数表示一次只能处理200个请求，等200个请求处理完在处理下一个请求。看第二个参数：如果我发起了220个请求，用jmeter发起压测看看效果。]]></description><category></category></item><item><title><![CDATA[Spring优雅停机]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130336422</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130336422</guid><author>u012222011</author><pubDate>Mon, 24 Apr 2023 10:07:08 +0800</pubDate><description><![CDATA[1.增加addShutdownHook，只要kill 进程号就会触发该方法，不能kill-9。2.使用ApplicationContext的close方法关闭服务,之前文章也介绍过。3.通过ApplicationListener监听容器关闭事件。4.@PreDestroy之前文章介绍过。]]></description><category></category></item><item><title><![CDATA[手写tomcat逻辑]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130288074</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130288074</guid><author>u012222011</author><pubDate>Fri, 21 Apr 2023 14:38:24 +0800</pubDate><description><![CDATA[获取url后，根据映射uri和处理类的映射关系，获取对应的处理类，反射执行目标方法。1.所有的接口都继承一个父类接口。]]></description><category></category></item><item><title><![CDATA[mybatis入参和parameterType不一致分析]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130265200</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130265200</guid><author>u012222011</author><pubDate>Thu, 20 Apr 2023 14:21:25 +0800</pubDate><description><![CDATA[答案： ps set值得时候发现类型不匹配，报错了，所以一定要把入参和ParameterType匹配对，否则会报错。1.如果数据库中id为int类型，而java代码层面入参给个String，此时会发生什么？问题2：如果入参给String类型，而parameterType写成int会发生什么？代码入参为String。]]></description><category></category></item><item><title><![CDATA[resultMap如何处理结果映射]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130264514</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130264514</guid><author>u012222011</author><pubDate>Thu, 20 Apr 2023 14:03:40 +0800</pubDate><description><![CDATA[主要是数据库中的字段是否包括映射column字段，如果包括那么直接 获取对应的数值，进行反射给目标对象。答案：可以，底层就是通过column获取数据库的值，然后反射，跟jdbcType没关系。问题2：resultMap 对应的result可以不带jdbcType吗？2.根据column获取数据库中对应的值，然后反射给空值对象。1.获取type类型，然后实例化一个空值对象，]]></description><category></category></item><item><title><![CDATA[Springboot如何启动内嵌tomcat]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130237232</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130237232</guid><author>u012222011</author><pubDate>Wed, 19 Apr 2023 10:23:18 +0800</pubDate><description><![CDATA[就这样制动注入一个tomcat的工厂结束了，整个web启动就结束了。这里为什么能拿到tomcat的容器：，后续自动装配详细解释。1.首先判断容器的类型，这里是servlet类型。我们看看如何自动注入tomcat的？到此tomcat启动结束。自然是调用父类的刷新方法。]]></description><category></category></item><item><title><![CDATA[mybatis面试题（阅读源代码后原创）]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130216739</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130216739</guid><author>u012222011</author><pubDate>Tue, 18 Apr 2023 11:29:22 +0800</pubDate><description><![CDATA[可以，此时的key就是不带全路径的类名。由于setting里面没有配置cacheEnable的属性，这里默认为true,所以默认开启，报错，settings的属性在这个类里面体现了，如果乱写，检测不到set方法反射报错了。从图中可以看到，能得到一个事物工厂和一个数据源，最后构建成一个environment。这种方式定义mapper，命名空间可以和类路径不一样吗？4.一级缓存为什么默认是开启的，二级缓存默认是关闭的？二级缓存：从图中可以看出，如果没有配置就get不到。如果不能，那有哪些值？]]></description><category></category></item><item><title><![CDATA[Spring-Web spi机制解析]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130010944</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130010944</guid><author>u012222011</author><pubDate>Fri, 07 Apr 2023 14:59:55 +0800</pubDate><description><![CDATA[看着核心的8行，就能启动一个mvc项目，主要是初始化一个DispacherServlet,刷新容器等操作，和mvc的流程一样。将符合条件的加入list中，非接口，非抽象，是WebApplicationInitializer类型的，然后排序，回调。先看启动类：tomcat.start(),后就会去调用spring-web里面spi机制。这里的操作和之前手动注入DispatcherServlet一样。可以发现程序进来了：主要spi机制，看看这里做了什么操作？在这里打个断点，查看程序是否会进来。]]></description><category></category></item><item><title><![CDATA[SpringBoot启动类]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130010383</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130010383</guid><author>u012222011</author><pubDate>Fri, 07 Apr 2023 13:45:05 +0800</pubDate><description><![CDATA[会根据Order的顺序来排序，先是Order的大小，小的优先，如果相同那就ApplicationRunner优先。获取容器中所有的ApplicationRunner和CommandLineRunner，排好序后进行回调。容器启动后还有最后一步操作：回到Runner。]]></description><category></category></item><item><title><![CDATA[SpringBoot监听器的几种写法]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130007560</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130007560</guid><author>u012222011</author><pubDate>Fri, 07 Apr 2023 11:31:29 +0800</pubDate><description><![CDATA[org.springframework.boot.SpringApplication#prepareEnvironment只要事件是环境准备好的事件就会进入if条件获取配置文件中的context.listener.classes和初始化器一样的逻辑。注意这种写法只能监听ApplicationEnvironmentPreparedEvent这种事件。1.之前讲的在spring.factories写监听器对应的全路径。3.在属性文件中添加属性配置。]]></description><category></category></item><item><title><![CDATA[SpringBoot事件的选取原理]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130007177</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130007177</guid><author>u012222011</author><pubDate>Fri, 07 Apr 2023 10:58:47 +0800</pubDate><description><![CDATA[故第一个监听器监听的是ApplicationStartedEvent该时间，和实际发布的事件ApplicationStartingEvent不一样。故不会执行业务逻辑。如果是smart类型的监听器则直接判断重写得方法，不是的话，直接判断发布事件类型和监听事件类型是否一致。如果不是GenericApplicationListener则new一个，是否重新了这两个方法。遍历我们注册的监听器，但这里有个判断条件，supportsEvent。容器发布一个正在启动的事件。]]></description><category></category></item><item><title><![CDATA[SpringBoot监听器]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130005507</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130005507</guid><author>u012222011</author><pubDate>Fri, 07 Apr 2023 10:49:33 +0800</pubDate><description><![CDATA[org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider 5个值。org.springframework.boot.autoconfigure.AutoConfigurationImportListener  1个值。org.springframework.boot.diagnostics.FailureAnalysisReporter  1个值。]]></description><category></category></item><item><title><![CDATA[SpringBoot初始化器解析]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/130004918</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/130004918</guid><author>u012222011</author><pubDate>Fri, 07 Apr 2023 09:58:45 +0800</pubDate><description><![CDATA[3.第三种： 在application.properties里面添加如下属性，注意这里有个DelegatingApplicationContextInitializer的初始化器回去寻找配置文件下的。1.容器初始化，会读取所有jar包下的META-INF/spring.factories路径的ApplicationContextInitializer然后初始化为对象。context.initializer.classes属性对应的class，然后实例化，然后进行回调。2.第二种：手动添加监听器。]]></description><category></category></item><item><title><![CDATA[aop拦截器链执行流程]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/129994386</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/129994386</guid><author>u012222011</author><pubDate>Thu, 06 Apr 2023 17:42:57 +0800</pubDate><description><![CDATA[等所有链路执行完了，执行目标方法，然后根据是否报错，报错执行报错逻辑，有返回值则执行返回值逻辑，顺便可以吧返回值带进业务逻辑，无论如何都是执行after逻辑，应为是finally包裹的。执行第5个执行链MethodBeforeAdviceInterceptor，会先执行业务逻辑，然后回到链路上。总结：记住这5个执行链的顺序，实际打出来的结果和这个不一样，原因是链路执行顺序并不是业务执行的顺序，before是由业务逻辑的，执行完后才会去执行链路，也就是先于链路执行，所有链路上的拦截器执行完后，执行目标方法。]]></description><category></category></item><item><title><![CDATA[Aop分析]]></title><link>https://blog.youkuaiyun.com/u012222011/article/details/129993450</link><guid>https://blog.youkuaiyun.com/u012222011/article/details/129993450</guid><author>u012222011</author><pubDate>Thu, 06 Apr 2023 17:12:12 +0800</pubDate><description><![CDATA[总结：开启该注解@EnableAspectJAutoProxy会注入一个AnnotationAwareAspectJAutoProxyCreator bpp,before会解析所有的advisor放入缓存中，after会根据bean来创建代理对象。遍历我们刚刚注入的8个bpp,主要是第四个动态代理的核心逻辑。会遍历所有的advisor然后放入缓存供后续使用。是否还记的bean的生命周期第一步，发现执行完后又注册了4个bpp.最后会加一个系统的advisor。判断当前的bean是否需要代理。]]></description><category></category></item></channel></rss>