<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Spring on 蓝尾蜂鸟</title><link>https://clibing.com/categories/spring/</link><description>Recent content in Spring on 蓝尾蜂鸟</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>Copyright © 2011-2026 clibing. All Rights Reserved.</copyright><lastBuildDate>Sat, 28 Oct 2023 15:58:19 +0800</lastBuildDate><atom:link href="https://clibing.com/categories/spring/index.xml" rel="self" type="application/rss+xml"/><item><title>Spring MVC</title><link>https://clibing.com/posts/java/spring/spring_mvc/</link><pubDate>Sat, 28 Oct 2023 15:58:19 +0800</pubDate><guid>https://clibing.com/posts/java/spring/spring_mvc/</guid><description></description></item><item><title>Spring Spring Boot 杂项</title><link>https://clibing.com/posts/java/spring/spring_many/</link><pubDate>Thu, 20 Aug 2020 14:05:12 +0800</pubDate><guid>https://clibing.com/posts/java/spring/spring_many/</guid><description><![CDATA[<h4 id="spring-springboot小的细节总结记录" data-numberify>Spring SpringBoot小的细节总结记录<a class="anchor ms-1" href="#spring-springboot小的细节总结记录"></a></h4>
<ul>
<li>
<p>spring mvc</p>
<p>采用SPI技术，注入Spring的Servlet类，具体是实现了javax.servlet.ServletContainerInitializer接口的SpringServletContainerInitializer类,在这个类上注解@HandlesTypes传递的参数给Servlet中进行扩展使用</p>]]></description></item><item><title>Spring bean创建过程</title><link>https://clibing.com/posts/java/spring/spring_bean/</link><pubDate>Thu, 20 Aug 2020 13:49:56 +0800</pubDate><guid>https://clibing.com/posts/java/spring/spring_bean/</guid><description><![CDATA[<h4 id="bean初始化过程" data-numberify>bean初始化过程：<a class="anchor ms-1" href="#bean初始化过程"></a></h4>
<p>大体分为三个过程bean的对象创建、属性填充、初始化事件</p>
<ol>
<li>bean的创建前事件，其中bean的创建前事件主要场景是在aop(AnnotationAwareAspectJAutoProxyCreator主要实现了InstantiationAwareBeanPostProcessor)通过对bean的创建前拦截，</li>
</ol>
<p>将adviser方法加入到aop包下的的ProxyFactory产生一个代理类,并且会被cache。</p>]]></description></item><item><title>Controller方法上自定义注解</title><link>https://clibing.com/posts/java/spring/controller-annotation/</link><pubDate>Thu, 16 Apr 2020 17:31:56 +0800</pubDate><guid>https://clibing.com/posts/java/spring/controller-annotation/</guid><description><![CDATA[<h3 id="定义自定义注解" data-numberify>定义自定义注解<a class="anchor ms-1" href="#定义自定义注解"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln">1</span><span class="cl"><span class="nd">@Retention</span><span class="p">(</span><span class="n">RetentionPolicy</span><span class="p">.</span><span class="na">RUNTIME</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nd">@Target</span><span class="p">(</span><span class="n">ElementType</span><span class="p">.</span><span class="na">PARAMETER</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="nd">@interface</span><span class="w"> </span><span class="n">Logined</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="注解处理器" data-numberify>注解处理器<a class="anchor ms-1" href="#注解处理器"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="nd">@Component</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="nd">@Slf4j</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">LoginedArgumentResolver</span><span class="w"> </span><span class="kd">implements</span><span class="w"> </span><span class="n">HandlerMethodArgumentResolver</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w">    </span><span class="nd">@Override</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kt">boolean</span><span class="w"> </span><span class="nf">supportsParameter</span><span class="p">(</span><span class="n">MethodParameter</span><span class="w"> </span><span class="n">parameter</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w">        </span><span class="k">return</span><span class="w"> </span><span class="n">CurrentRequest</span><span class="p">.</span><span class="na">class</span><span class="p">.</span><span class="na">isAssignableFrom</span><span class="p">(</span><span class="n">parameter</span><span class="p">.</span><span class="na">getParameterType</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">    </span><span class="nd">@Override</span><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="n">Object</span><span class="w"> </span><span class="nf">resolveArgument</span><span class="p">(</span><span class="n">MethodParameter</span><span class="w"> </span><span class="n">parameter</span><span class="p">,</span><span class="w"> </span><span class="n">ModelAndViewContainer</span><span class="w"> </span><span class="n">mavContainer</span><span class="p">,</span><span class="w"> </span><span class="n">NativeWebRequest</span><span class="w"> </span><span class="n">webRequest</span><span class="p">,</span><span class="w"> </span><span class="n">WebDataBinderFactory</span><span class="w"> </span><span class="n">binderFactory</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Exception</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="w">        </span><span class="n">HttpServletRequest</span><span class="w"> </span><span class="n">request</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">HttpServletRequest</span><span class="p">)</span><span class="w"> </span><span class="n">webRequest</span><span class="p">.</span><span class="na">getNativeRequest</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="w">        </span><span class="n">CurrentRequest</span><span class="w"> </span><span class="n">currentRequest</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">CurrentRequest</span><span class="p">)</span><span class="w"> </span><span class="n">request</span><span class="p">.</span><span class="na">getAttribute</span><span class="p">(</span><span class="n">CurrentRequest</span><span class="p">.</span><span class="na">requestAttributeName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="w">        </span><span class="k">return</span><span class="w"> </span><span class="n">currentRequest</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="使用" data-numberify>使用<a class="anchor ms-1" href="#使用"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln">1</span><span class="cl"><span class="w">    </span><span class="nd">@RequestMapping</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="s">&#34;...&#34;</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="n">Object</span><span class="w"> </span><span class="nf">create</span><span class="p">(</span><span class="n">HttpServletRequest</span><span class="w"> </span><span class="n">request</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="w">                         </span><span class="nd">@Logined</span><span class="w"> </span><span class="n">CurrentRequest</span><span class="w"> </span><span class="n">user</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="w">                             </span><span class="p">......</span><span class="w">
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>]]></description></item><item><title>HandlerMapping</title><link>https://clibing.com/posts/java/spring/handlermapping/</link><pubDate>Thu, 16 Apr 2020 17:31:56 +0800</pubDate><guid>https://clibing.com/posts/java/spring/handlermapping/</guid><description><![CDATA[<h1 id="spring-handlermapping" data-numberify>Spring HandlerMapping<a class="anchor ms-1" href="#spring-handlermapping"></a></h1>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="kn">package</span><span class="w"> </span><span class="nn">org.springframework.web.servlet</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">javax.servlet.http.HttpServletRequest</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.springframework.lang.Nullable</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">interface</span> <span class="nc">HandlerMapping</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">    </span><span class="c1">// 省略一下常量配置.....</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">	</span><span class="cm">/**
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="cm">	 * 返回此请求的处理程序和任何拦截器。可以根据请求URL、会话状态或实现类选择的任何因素做出选择。
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="cm">     * 返回的HandlerExecutionChain包含一个处理程序对象，而不是标记接口，因此处理程序不受任何约束。
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="cm">     * 例如，可以编写HandlerAdapter来允许使用其他框架的处理程序对象。
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="cm">	 */</span><span class="w">
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="w">	</span><span class="nd">@Nullable</span><span class="w">
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="w">	</span><span class="n">HandlerExecutionChain</span><span class="w"> </span><span class="nf">getHandler</span><span class="p">(</span><span class="n">HttpServletRequest</span><span class="w"> </span><span class="n">request</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Exception</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>根据Request查找Handler和 Interceptors 。获取Handler的过程是通过实现AbstractHandlerMapping的<code>getHandlerInternal</code>模板方法的子类处理。AbstractHandlerMapping中保存了所有配置（interceptors集合、HandlerInterceptor集合、排序、bean的名字等)，在获取到Handler后内部会从Request中提取lookupPath将对应的Interceptors装配。同时也暴露给子类设置自己的Interceptors。</p>]]></description></item><item><title>DispatcherServlet</title><link>https://clibing.com/posts/java/spring/dispatcherservlet/</link><pubDate>Thu, 16 Apr 2020 17:18:56 +0800</pubDate><guid>https://clibing.com/posts/java/spring/dispatcherservlet/</guid><description><![CDATA[<h3 id="dispatcherservlet" data-numberify>DispatcherServlet<a class="anchor ms-1" href="#dispatcherservlet"></a></h3>
<p><picture><img class="img-fluid " alt="" src="https://clibing.com/images/java/DispatcherServlet.png?v=fba7934f280e05fe331658c7d7767396" loading="lazy" width="963" height="443" />
</picture>

</p>
<ol>
<li>关系说明</li>
</ol>
<ul>
<li>DispatcherServlet 继承了FrameworkServlet;</li>
<li>FrameworkServlet 继承了HttpServletBean并实现了ApplicationContextAware(设置上下文);</li>
<li>HttpServletBean继承了HttpServletu(抽象类)，并实现了获取环境变量的设置和获取接口; HttpServlet实现了为Java EE Servlet的标准</li>
</ul>
<ol start="2">
<li>启动流程</li>
</ol>
<ul>
<li>当容器启动时，容器(tomcat、jetty、undertow)，启动后会依次加载HttpServlet的实现类</li>
<li>Spring MVC中DispatcherServlet为实现类，并作为默认的启动HttpServlet</li>
<li>加载init()，init方法在HttpServletBean中实现了init方法，主要方法是执行一个抽象方法initServletBean， 这个initServletBean方法有子类实现(模板方法)</li>
<li>initServletBean有FrameworkServlet实现，是Spring MVC初始化核心方法， initWebApplicationContext()中主要方法是实现onRefresh(), 这个onRefresh()为方法为（策略模式）有子类实现，最终出事化上下文</li>
<li>DispatcherServlet中的实现了onRefresh方法。内部调用了initStrategies()方法。initStrategies()内部方法实现了Spring MVC的9大组件</li>
</ul>
<ol start="3">
<li>Spring MVC 9大组件</li>
</ol>
<ul>
<li>
<p>initMultipartResolver(context);
用于处理上传请求。处理方法是将普通的request包装成MultipartHttpServletRequest，后者可以直接调用getFile方法获取File，如果上传多个文件，还可以调用getFileMap得到FileName-&gt;File结构的Map。此组件中一共有三个方法，作用分别是判断是不是上传请求，将request包装成MultipartHttpServletRequest、处理完后清理上传过程中产生的临时资源。</p>]]></description></item><item><title>Spring_aop 事务 mapper</title><link>https://clibing.com/posts/java/spring/spring_aop/</link><pubDate>Mon, 13 Apr 2020 21:52:07 +0800</pubDate><guid>https://clibing.com/posts/java/spring/spring_aop/</guid><description><![CDATA[<h3 id="spring-aop" data-numberify>Spring AOP<a class="anchor ms-1" href="#spring-aop"></a></h3>

<h3 id="aop-原理" data-numberify>AOP 原理<a class="anchor ms-1" href="#aop-原理"></a></h3>

<h3 id="mapper" data-numberify>mapper<a class="anchor ms-1" href="#mapper"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="ln">1</span><span class="cl"> 此处可以查看 mapper
</span></span><span class="line"><span class="ln">2</span><span class="cl"> org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization
</span></span><span class="line"><span class="ln">3</span><span class="cl"> org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary
</span></span><span class="line"><span class="ln">4</span><span class="cl"> org.springframework.aop.support.AopUtils#findAdvisorsThatCanApply
</span></span></code></pre></div>
<h3 id="事务" data-numberify>事务<a class="anchor ms-1" href="#事务"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="n">Supplier</span><span class="w"> </span><span class="n">afterCommit</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="w">    </span><span class="n">executorService</span><span class="p">.</span><span class="na">execute</span><span class="p">(()</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">CreateHandlerWithContext</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="n">processor</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">afterCommitHandlerList</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w">            </span><span class="k">try</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="w">                </span><span class="n">processor</span><span class="p">.</span><span class="na">handle</span><span class="p">(</span><span class="n">t</span><span class="p">,</span><span class="w"> </span><span class="n">context</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w">                </span><span class="n">e</span><span class="p">.</span><span class="na">printStackTrace</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">                </span><span class="n">log</span><span class="p">.</span><span class="na">error</span><span class="p">(</span><span class="s">&#34;create observer after commit handle&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">e</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="w">    </span><span class="p">});</span><span class="w">
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="p">};</span><span class="w">
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">TransactionSynchronizationManager</span><span class="p">.</span><span class="na">isActualTransactionActive</span><span class="p">())</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="w">    </span><span class="c1">//如果事务开启</span><span class="w">
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="w">    </span><span class="n">TransactionSynchronizationManager</span><span class="p">.</span><span class="na">registerSynchronization</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">TransactionSynchronizationAdapter</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="w">        </span><span class="nd">@Override</span><span class="w">
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">afterCommit</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="w">            </span><span class="n">afterCommit</span><span class="p">.</span><span class="na">get</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="w">    </span><span class="p">});</span><span class="w">
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="w">    </span><span class="c1">//如果事务没有开启</span><span class="w">
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="w">    </span><span class="n">afterCommit</span><span class="p">.</span><span class="na">get</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="参考" data-numberify>参考<a class="anchor ms-1" href="#参考"></a></h3>
<ul>
<li><a href="https://my.oschina.net/guangshan/blog/1808373" target="_blank" rel="noopener noreferrer">https://my.oschina.net/guangshan/blog/1808373<i class="fas fa-external-link-square-alt ms-1"></i></a></li>
<li><a href="https://www.cnblogs.com/study-everyday/p/7429298.html" target="_blank" rel="noopener noreferrer">https://www.cnblogs.com/study-everyday/p/7429298.html<i class="fas fa-external-link-square-alt ms-1"></i></a></li>
<li><a href="https://blog.csdn.net/Evankaka/article/details/45394409" target="_blank" rel="noopener noreferrer">https://blog.csdn.net/Evankaka/article/details/45394409<i class="fas fa-external-link-square-alt ms-1"></i></a></li>
<li><a href="https://my.oschina.net/scipio/blog/224224" target="_blank" rel="noopener noreferrer">https://my.oschina.net/scipio/blog/224224<i class="fas fa-external-link-square-alt ms-1"></i></a></li>
<li><a href="https://my.oschina.net/guangshan/blog/1808373" target="_blank" rel="noopener noreferrer">https://my.oschina.net/guangshan/blog/1808373<i class="fas fa-external-link-square-alt ms-1"></i></a></li>
<li><a href="https://blog.ahao.moe/posts/Spring_uses_@Autowired_in_three_ways.html" target="_blank" rel="noopener noreferrer">https://blog.ahao.moe/posts/Spring_uses_@Autowired_in_three_ways.html<i class="fas fa-external-link-square-alt ms-1"></i></a></li>
</ul>]]></description></item></channel></rss>