-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1b593aed.html
169 lines (159 loc) · 30.7 KB
/
1b593aed.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><title>开发 Mybatis 插件 | 实现一个小目标</title><meta name="keywords" content="Java,Mybatis"><meta name="author" content="我想打游戏,[email protected]"><meta name="copyright" content="我想打游戏"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="Mybatis 插件Mybatis 插件介绍Mybatis 借助于四大核心对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)对持久层的进行操作。支持用插件对四大核心对象进行拦截,增强核心对象的功能。增强功能本质上是借助于底层的动态代理实现的,所以 MyBatis 中的四大对象都是代理对象。MyBatis 所允许拦截的方法如">
<meta property="og:type" content="article">
<meta property="og:title" content="开发 Mybatis 插件">
<meta property="og:url" content="https://blog.990304.xyz/1b593aed.html">
<meta property="og:site_name" content="实现一个小目标">
<meta property="og:description" content="Mybatis 插件Mybatis 插件介绍Mybatis 借助于四大核心对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)对持久层的进行操作。支持用插件对四大核心对象进行拦截,增强核心对象的功能。增强功能本质上是借助于底层的动态代理实现的,所以 MyBatis 中的四大对象都是代理对象。MyBatis 所允许拦截的方法如">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://img-blog.csdnimg.cn/7030a1d9bbd44b708a3797128d232b8c.png">
<meta property="article:published_time" content="2022-09-28T08:30:44.000Z">
<meta property="article:modified_time" content="2022-10-09T05:56:42.888Z">
<meta property="article:author" content="我想打游戏">
<meta property="article:tag" content="Java">
<meta property="article:tag" content="Mybatis">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://img-blog.csdnimg.cn/7030a1d9bbd44b708a3797128d232b8c.png"><link rel="shortcut icon" href="/img/favicon.png"><link rel="canonical" href="https://blog.990304.xyz/1b593aed"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//hm.baidu.com"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.min.css" media="print" onload="this.media='all'"><script>var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?a6a8fe63a57ca303dd1117df5f602aec";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script><script>const GLOBAL_CONFIG = {
root: '/',
algolia: undefined,
localSearch: undefined,
translate: {"defaultEncoding":1,"translateDelay":0,"msgToTraditionalChinese":"繁","msgToSimplifiedChinese":"简"},
noticeOutdate: undefined,
highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false},
copy: {
success: '复制成功',
error: '复制错误',
noSupport: '浏览器不支持'
},
relativeDate: {
homepage: true,
post: true
},
runtime: '天',
date_suffix: {
just: '刚刚',
min: '分钟前',
hour: '小时前',
day: '天前',
month: '个月前'
},
copyright: undefined,
lightbox: 'fancybox',
Snackbar: undefined,
source: {
justifiedGallery: {
js: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.js',
css: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.css'
}
},
isPhotoFigcaption: true,
islazyload: false,
isAnchor: true
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
title: '开发 Mybatis 插件',
isPost: true,
isHome: false,
isHighlightShrink: false,
isToc: true,
postUpdate: '2022-10-09 13:56:42'
}</script><noscript><style type="text/css">
#nav {
opacity: 1
}
.justified-gallery img {
opacity: 1
}
#recent-posts time,
#post-meta time {
display: inline !important
}
</style></noscript><script>(win=>{
win.saveToLocal = {
set: function setWithExpiry(key, value, ttl) {
if (ttl === 0) return
const now = new Date()
const expiryDay = ttl * 86400000
const item = {
value: value,
expiry: now.getTime() + expiryDay,
}
localStorage.setItem(key, JSON.stringify(item))
},
get: function getWithExpiry(key) {
const itemStr = localStorage.getItem(key)
if (!itemStr) {
return undefined
}
const item = JSON.parse(itemStr)
const now = new Date()
if (now.getTime() > item.expiry) {
localStorage.removeItem(key)
return undefined
}
return item.value
}
}
win.getScript = url => new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = url
script.async = true
script.onerror = reject
script.onload = script.onreadystatechange = function() {
const loadState = this.readyState
if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
script.onload = script.onreadystatechange = null
resolve()
}
document.head.appendChild(script)
})
win.activateDarkMode = function () {
document.documentElement.setAttribute('data-theme', 'dark')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
}
}
win.activateLightMode = function () {
document.documentElement.setAttribute('data-theme', 'light')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
}
}
const t = saveToLocal.get('theme')
if (t === 'dark') activateDarkMode()
else if (t === 'light') activateLightMode()
const asideStatus = saveToLocal.get('aside-status')
if (asideStatus !== undefined) {
if (asideStatus === 'hide') {
document.documentElement.classList.add('hide-aside')
} else {
document.documentElement.classList.remove('hide-aside')
}
}
const detectApple = () => {
if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
document.documentElement.classList.add('apple')
}
}
detectApple()
})(window)</script><meta name="generator" content="Hexo 6.3.0"></head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="https://s2.loli.net/2022/09/28/iEBxunMYAGHODFz.jpg" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="sidebar-site-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">20</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">6</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">6</div></a></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page group" href="javascript:void(0);"><i class="fa-fw fas fa-list"></i><span> 清单</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/music/"><i class="fa-fw fas fa-music"></i><span> 音乐</span></a></li><li><a class="site-page child" href="/movies/"><i class="fa-fw fas fa-video"></i><span> 电影</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友情链接</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div></div></div><div class="post" id="body-wrap"><header class="post-bg" id="page-header" style="background-image: url('https://img-blog.csdnimg.cn/7030a1d9bbd44b708a3797128d232b8c.png')"><nav id="nav"><span id="blog_name"><a id="site-name" href="/">实现一个小目标</a></span><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page group" href="javascript:void(0);"><i class="fa-fw fas fa-list"></i><span> 清单</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/music/"><i class="fa-fw fas fa-music"></i><span> 音乐</span></a></li><li><a class="site-page child" href="/movies/"><i class="fa-fw fas fa-video"></i><span> 电影</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友情链接</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div><div id="toggle-menu"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></div></div></nav><div id="post-info"><h1 class="post-title">开发 Mybatis 插件</h1><div id="post-meta"><div class="meta-firstline"><span class="post-meta-date"><i class="far fa-calendar-alt fa-fw post-meta-icon"></i><span class="post-meta-label">发表于</span><time class="post-meta-date-created" datetime="2022-09-28T08:30:44.000Z" title="发表于 2022-09-28 16:30:44">2022-09-28</time><span class="post-meta-separator">|</span><i class="fas fa-history fa-fw post-meta-icon"></i><span class="post-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2022-10-09T05:56:42.888Z" title="更新于 2022-10-09 13:56:42">2022-10-09</time></span><span class="post-meta-categories"><span class="post-meta-separator">|</span><i class="fas fa-inbox fa-fw post-meta-icon"></i><a class="post-meta-categories" href="/categories/Java-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/">Java 学习笔记</a><i class="fas fa-angle-right post-meta-separator"></i><i class="fas fa-inbox fa-fw post-meta-icon"></i><a class="post-meta-categories" href="/categories/Java-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/Mybatis-%E6%A1%86%E6%9E%B6/">Mybatis 框架</a></span></div><div class="meta-secondline"><span class="post-meta-separator">|</span><span class="post-meta-wordcount"><i class="far fa-file-word fa-fw post-meta-icon"></i><span class="post-meta-label">字数总计:</span><span class="word-count">477</span><span class="post-meta-separator">|</span><i class="far fa-clock fa-fw post-meta-icon"></i><span class="post-meta-label">阅读时长:</span><span>1分钟</span></span><span class="post-meta-separator">|</span><span class="post-meta-pv-cv" id="" data-flag-title="开发 Mybatis 插件"><i class="far fa-eye fa-fw post-meta-icon"></i><span class="post-meta-label">阅读量:</span><span id="busuanzi_value_page_pv"><i class="fa-solid fa-spinner fa-spin"></i></span></span></div></div></div></header><main class="layout" id="content-inner"><div id="post"><article class="post-content" id="article-container"><h1 id="Mybatis-插件"><a href="#Mybatis-插件" class="headerlink" title="Mybatis 插件"></a>Mybatis 插件</h1><h2 id="Mybatis-插件介绍"><a href="#Mybatis-插件介绍" class="headerlink" title="Mybatis 插件介绍"></a>Mybatis 插件介绍</h2><p>Mybatis 借助于四大核心对象(Executor、StatementHandler、ParameterHandler、ResultSetHandler)对持久层的进行操作。支持用插件对四大核心对象进行拦截,增强核心对象的功能。<br>增强功能本质上是借助于底层的动态代理实现的,所以 MyBatis 中的四大对象都是代理对象。<br><img src="https://img-blog.csdnimg.cn/7030a1d9bbd44b708a3797128d232b8c.png"><br>MyBatis 所允许拦截的方法如下:</p>
<ul>
<li>执行器 Executor(update、query、commit、rollback等方法)</li>
<li>SQL语法构建器 StatementHandler(prepare、parameterize、batch、updates query 等方法)</li>
<li>参数处理器 ParameterHandler(getParameterObject、setParameters方法)</li>
<li>结果集处理器 ResultSetHandler(handleResultSets、handleOutputParameters等方法)</li>
</ul>
<h2 id="Mybatis-插件原理"><a href="#Mybatis-插件原理" class="headerlink" title="Mybatis 插件原理"></a>Mybatis 插件原理</h2><p>在四大对象创建的时候</p>
<ol>
<li>每个创建出来的对象不是直接返回的,而是通过 interceptorChain.pluginAll(parameterHandler) 方法的代理对象。</li>
<li>pluginAll 会调用所有的 Interceptor 的 plugin 方法,返回被重重代理后的对象。<br><img src="https://img-blog.csdnimg.cn/da2d48a62132481e898ecb5074296602.png"><br>四大组件都会调用 interceptorChain.pluginAll 生成代理对象<br><img src="https://img-blog.csdnimg.cn/6883a10b67784fa5a4c2d5648f670e77.png"></li>
</ol>
<h2 id="时序图"><a href="#时序图" class="headerlink" title="时序图"></a>时序图</h2><p><img src="https://img-blog.csdnimg.cn/fd24ddc79abd426784d021669c16fa75.png"></p>
<h2 id="自定义插件"><a href="#自定义插件" class="headerlink" title="自定义插件"></a>自定义插件</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Intercepts({ //大花括号,可以定义多个@Signature对多个地方拦截</span></span><br><span class="line"><span class="meta"> @Signature(type = StatementHandler.class, //这是指拦截哪个接口</span></span><br><span class="line"><span class="meta"> method = "prepare", //这个接口内的哪个方法名</span></span><br><span class="line"><span class="meta"> args = {Connection.class, Integer.class} // 这是拦截的方法的入参,按顺序写到这,如果方法重载通过方法名和入参来确定方法</span></span><br><span class="line"><span class="meta"> )</span></span><br><span class="line"><span class="meta">})</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyPlugin</span> <span class="keyword">implements</span> <span class="title class_">Interceptor</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> Object <span class="title function_">intercept</span><span class="params">(Invocation invocation)</span> <span class="keyword">throws</span> Throwable {</span><br><span class="line"> <span class="comment">//增强逻辑</span></span><br><span class="line"> System.out.println(<span class="string">"对方法进行了增强...."</span>);</span><br><span class="line"> <span class="keyword">return</span> invocation.proceed(); <span class="comment">//执行原方法</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> Object <span class="title function_">plugin</span><span class="params">(Object target)</span> {</span><br><span class="line"> System.out.println(<span class="string">"将要包装的目标对象: "</span> + target);</span><br><span class="line"> <span class="keyword">return</span> Interceptor.<span class="built_in">super</span>.plugin(target);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setProperties</span><span class="params">(Properties properties)</span> {</span><br><span class="line"> System.out.println(<span class="string">"插件配置的初始化参数: "</span> + properties);</span><br><span class="line"> Interceptor.<span class="built_in">super</span>.setProperties(properties);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<p>mybatis 配置文件中</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">plugins</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">plugin</span> <span class="attr">interceptor</span>=<span class="string">"com.li.plugin.MyPlugin"</span>></span></span><br><span class="line"> <span class="comment"><!--配置参数--></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"name"</span> <span class="attr">value</span>=<span class="string">"狗蛋"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">plugin</span>></span></span><br><span class="line"><span class="tag"></<span class="name">plugins</span>></span></span><br></pre></td></tr></table></figure></article><div class="post-copyright"><div class="post-copyright__author"><span class="post-copyright-meta">文章作者: </span><span class="post-copyright-info"><a href="https://blog.990304.xyz">我想打游戏</a></span></div><div class="post-copyright__type"><span class="post-copyright-meta">文章链接: </span><span class="post-copyright-info"><a href="https://blog.990304.xyz/1b593aed.html">https://blog.990304.xyz/1b593aed.html</a></span></div><div class="post-copyright__notice"><span class="post-copyright-meta">版权声明: </span><span class="post-copyright-info">本博客所有文章除特别声明外,均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">CC BY-NC-SA 4.0</a> 许可协议。转载请注明来自 <a href="https://blog.990304.xyz" target="_blank">实现一个小目标</a>!</span></div></div><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/tags/Java/">Java</a><a class="post-meta__tags" href="/tags/Mybatis/">Mybatis</a></div><div class="post_share"><div class="social-share" data-image="https://img-blog.csdnimg.cn/7030a1d9bbd44b708a3797128d232b8c.png" data-sites="facebook,twitter,wechat,weibo,qq"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/butterfly-extsrc/sharejs/dist/css/share.min.css" media="print" onload="this.media='all'"><script src="https://cdn.jsdelivr.net/npm/butterfly-extsrc/sharejs/dist/js/social-share.min.js" defer></script></div></div><nav class="pagination-post" id="pagination"><div class="prev-post pull-left"><a href="/708392e6.html"><img class="prev-cover" src="https://s2.loli.net/2022/09/28/JprRdkWTvwMh68u.jpg" onerror="onerror=null;src='/img/404.jpg'" alt="cover of previous post"><div class="pagination-info"><div class="label">上一篇</div><div class="prev_info">解决阿里云服务器中挖矿程序</div></div></a></div><div class="next-post pull-right"><a href="/cbde7b0b.html"><img class="next-cover" src="https://img-blog.csdnimg.cn/3aa3e44f116944ef9b10b4dd735c156a.png" onerror="onerror=null;src='/img/404.jpg'" alt="cover of next post"><div class="pagination-info"><div class="label">下一篇</div><div class="next_info">Spring IoC 循环依赖问题</div></div></a></div></nav><div class="relatedPosts"><div class="headline"><i class="fas fa-thumbs-up fa-fw"></i><span>相关推荐</span></div><div class="relatedPosts-list"><div><a href="/a5d2d7c3.html" title="Mybaits 架构原理"><img class="cover" src="https://s2.loli.net/2022/10/01/46p5Emr3uRMd7vo.png" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-10-01</div><div class="title">Mybaits 架构原理</div></div></a></div><div><a href="/aad19206.html" title="Bean 创建流程"><img class="cover" src="https://s2.loli.net/2022/10/08/8REn1yjfUVaKosF.png" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-06-21</div><div class="title">Bean 创建流程</div></div></a></div><div><a href="/7aea873f.html" title="BeanFactory 创建流程"><img class="cover" src="https://s2.loli.net/2022/10/08/1TbhpYeOIfgsU3Q.png" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-06-18</div><div class="title">BeanFactory 创建流程</div></div></a></div><div><a href="/690a266d.html" title="Spring IoC 容器初始化主体流程"><img class="cover" src="https://img-blog.csdnimg.cn/1b40502ab717476ba8ee7df0931ea527.png" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-06-15</div><div class="title">Spring IoC 容器初始化主体流程</div></div></a></div><div><a href="/655d86b3.html" title="Spring AOP"><img class="cover" src="https://s2.loli.net/2022/10/09/IoNOM4PifrBpZ67.png" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-03-21</div><div class="title">Spring AOP</div></div></a></div><div><a href="/adc3e213.html" title="Spring Bean 的作用范围及生命周期"><img class="cover" src="https://img-blog.csdnimg.cn/46d42e4c19b2427da2b3e31453263650.png" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-05-19</div><div class="title">Spring Bean 的作用范围及生命周期</div></div></a></div></div></div></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="is-center"><div class="avatar-img"><img src="https://s2.loli.net/2022/09/28/iEBxunMYAGHODFz.jpg" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/></div><div class="author-info__name">我想打游戏</div><div class="author-info__description">记录一些生活趣事</div></div><div class="card-info-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">20</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">6</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">6</div></a></div><a id="card-info-btn" target="_blank" rel="noopener" href="https://github.com/guziwen-lab"><i class="fab fa-github"></i><span>Follow Me</span></a><div class="card-info-social-icons is-center"><a class="social-icon" href="https://github.com/guziwen-lab/" target="_blank" title="Github"><i class="fab fa-github"></i></a><a class="social-icon" href="mailto:[email protected]" target="_blank" title="Email"><i class="fas fa-envelope"></i></a><a class="social-icon" href="https://blog.csdn.net/qq_30087395/" target="_blank" title="Csdn"><i class="fa-solid fa-rss"></i></a></div></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn fa-shake"></i><span>公告</span></div><div class="announcement_content">欢迎大家</div></div><div class="sticky_layout"><div class="card-widget" id="card-toc"><div class="item-headline"><i class="fas fa-stream"></i><span>目录</span><span class="toc-percentage"></span></div><div class="toc-content"><ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#Mybatis-%E6%8F%92%E4%BB%B6"><span class="toc-number">1.</span> <span class="toc-text">Mybatis 插件</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#Mybatis-%E6%8F%92%E4%BB%B6%E4%BB%8B%E7%BB%8D"><span class="toc-number">1.1.</span> <span class="toc-text">Mybatis 插件介绍</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Mybatis-%E6%8F%92%E4%BB%B6%E5%8E%9F%E7%90%86"><span class="toc-number">1.2.</span> <span class="toc-text">Mybatis 插件原理</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%97%B6%E5%BA%8F%E5%9B%BE"><span class="toc-number">1.3.</span> <span class="toc-text">时序图</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8F%92%E4%BB%B6"><span class="toc-number">1.4.</span> <span class="toc-text">自定义插件</span></a></li></ol></li></ol></div></div><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/6e9746c4.html" title="CentOS 安装翰高数据库"><img src="https://s2.loli.net/2023/03/13/UucfkBIRYxCd7Tm.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="CentOS 安装翰高数据库"/></a><div class="content"><a class="title" href="/6e9746c4.html" title="CentOS 安装翰高数据库">CentOS 安装翰高数据库</a><time datetime="2023-03-13T08:08:54.000Z" title="发表于 2023-03-13 16:08:54">2023-03-13</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/e56c5c4.html" title="可移动硬盘内的AppImage应用如何获取移动硬盘内的资源"><img src="https://s2.loli.net/2022/10/01/fnwLNigZCUG7bTd.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="可移动硬盘内的AppImage应用如何获取移动硬盘内的资源"/></a><div class="content"><a class="title" href="/e56c5c4.html" title="可移动硬盘内的AppImage应用如何获取移动硬盘内的资源">可移动硬盘内的AppImage应用如何获取移动硬盘内的资源</a><time datetime="2023-02-02T03:31:45.000Z" title="发表于 2023-02-02 11:31:45">2023-02-02</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/49140f59.html" title="把Java程序打包为AppImage格式"><img src="https://s2.loli.net/2023/01/12/SczgAwsmhU3ltF4.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="把Java程序打包为AppImage格式"/></a><div class="content"><a class="title" href="/49140f59.html" title="把Java程序打包为AppImage格式">把Java程序打包为AppImage格式</a><time datetime="2023-01-12T01:09:32.000Z" title="发表于 2023-01-12 09:09:32">2023-01-12</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/ff0917f7.html" title="流量控制与可靠传输"><img src="https://s2.loli.net/2022/10/04/EQqN6dK9YDFJmhj.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="流量控制与可靠传输"/></a><div class="content"><a class="title" href="/ff0917f7.html" title="流量控制与可靠传输">流量控制与可靠传输</a><time datetime="2022-10-04T15:00:44.000Z" title="发表于 2022-10-04 23:00:44">2022-10-04</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/a5d2d7c3.html" title="Mybaits 架构原理"><img src="https://s2.loli.net/2022/10/01/46p5Emr3uRMd7vo.png" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Mybaits 架构原理"/></a><div class="content"><a class="title" href="/a5d2d7c3.html" title="Mybaits 架构原理">Mybaits 架构原理</a><time datetime="2022-10-01T05:24:18.000Z" title="发表于 2022-10-01 13:24:18">2022-10-01</time></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">©2022 - 2023 By 我想打游戏</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="readmode" type="button" title="阅读模式"><i class="fas fa-book-open"></i></button><button id="translateLink" type="button" title="简繁转换">简</button><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button class="close" id="mobile-toc-button" type="button" title="目录"><i class="fas fa-list-ul"></i></button><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="/js/tw_cn.js"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.umd.min.js"></script><div class="js-pjax"></div><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html>