-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathb8228d97.html
289 lines (264 loc) · 88.4 KB
/
b8228d97.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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
<!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>Spring 入门 | 实现一个小目标</title><meta name="keywords" content="Java,Spring"><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="BeanFactory 与 ApplicationContext 区别BeanFactory 是 Spring 框架中 IoC 容器的顶层接口,它只是用来定义一些基础功能,定义一些基础规范,而 ApplicationContext 是它的一个子接口,所以 ApplicationContext是具备 BeanFactory 提供的全部功能的。通常,我们称 BeanFactory 为 SpringIO">
<meta property="og:type" content="article">
<meta property="og:title" content="Spring 入门">
<meta property="og:url" content="https://blog.990304.xyz/b8228d97.html">
<meta property="og:site_name" content="实现一个小目标">
<meta property="og:description" content="BeanFactory 与 ApplicationContext 区别BeanFactory 是 Spring 框架中 IoC 容器的顶层接口,它只是用来定义一些基础功能,定义一些基础规范,而 ApplicationContext 是它的一个子接口,所以 ApplicationContext是具备 BeanFactory 提供的全部功能的。通常,我们称 BeanFactory 为 SpringIO">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://img-blog.csdnimg.cn/df0486e7b51f4b5aa1b9234b24dc266a.png">
<meta property="article:published_time" content="2022-03-09T08:50:29.000Z">
<meta property="article:modified_time" content="2022-10-09T05:53:16.473Z">
<meta property="article:author" content="我想打游戏">
<meta property="article:tag" content="Java">
<meta property="article:tag" content="Spring">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://img-blog.csdnimg.cn/df0486e7b51f4b5aa1b9234b24dc266a.png"><link rel="shortcut icon" href="/img/favicon.png"><link rel="canonical" href="https://blog.990304.xyz/b8228d97"><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: 'Spring 入门',
isPost: true,
isHome: false,
isHighlightShrink: false,
isToc: true,
postUpdate: '2022-10-09 13:53:16'
}</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/df0486e7b51f4b5aa1b9234b24dc266a.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">Spring 入门</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-03-09T08:50:29.000Z" title="发表于 2022-03-09 16:50:29">2022-03-09</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:53:16.473Z" title="更新于 2022-10-09 13:53:16">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/Spring-%E6%A1%86%E6%9E%B6/">Spring 框架</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">3.8k</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>16分钟</span></span><span class="post-meta-separator">|</span><span class="post-meta-pv-cv" id="" data-flag-title="Spring 入门"><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="BeanFactory-与-ApplicationContext-区别"><a href="#BeanFactory-与-ApplicationContext-区别" class="headerlink" title="BeanFactory 与 ApplicationContext 区别"></a>BeanFactory 与 ApplicationContext 区别</h1><p>BeanFactory 是 Spring 框架中 IoC 容器的顶层接口,它只是用来定义一些基础功能,定义一些基础规范,而 ApplicationContext 是它的一个子接口,所以 ApplicationContext是具备 BeanFactory 提供的全部功能的。<br>通常,我们称 BeanFactory 为 SpringIOC 的基础容器,ApplicationContext 是容器的高级接口,比 BeanFactory 要拥有更多的功能,比如说国际化支持和资源访问(xml,java配置类)等等。<br><img src="https://img-blog.csdnimg.cn/df0486e7b51f4b5aa1b9234b24dc266a.png"></p>
<h1 id="使用-Spring-IoC-容器的方式"><a href="#使用-Spring-IoC-容器的方式" class="headerlink" title="使用 Spring IoC 容器的方式"></a>使用 Spring IoC 容器的方式</h1><h2 id="XML-方式"><a href="#XML-方式" class="headerlink" title="XML 方式"></a>XML 方式</h2><h3 id="xml-文件头"><a href="#xml-文件头" class="headerlink" title="xml 文件头"></a>xml 文件头</h3><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><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"utf-8"</span> ?></span></span><br><span class="line"><span class="tag"><<span class="name">beans</span> <span class="attr">xmlns</span>=<span class="string">"http://www.springframework.org/schema/beans"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://www.springframework.org/schema/beans</span></span></span><br><span class="line"><span class="string"><span class="tag"> https://www.springframework.org/schema/beans/spring-beans.xsd"</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">beans</span>></span></span><br></pre></td></tr></table></figure>
<h3 id="实例化Bean的三种方式"><a href="#实例化Bean的三种方式" class="headerlink" title="实例化Bean的三种方式"></a>实例化Bean的三种方式</h3><ol>
<li>使用无参构造函数<br>在默认情况下,它会通过反射调用无参构造函数来创建对象。如果类中没有无参构造函数,将创建失败。</li>
</ol>
<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></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"accountDao"</span> <span class="attr">class</span>=<span class="string">"com.lagou.edu.dao.impl.JdbcAccountDaoImpl"</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"transferService"</span> <span class="attr">class</span>=<span class="string">"com.lagou.edu.service.impl.TransferServiceImpl"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"AccountDao"</span> <span class="attr">ref</span>=<span class="string">"accountDao"</span>/></span></span><br><span class="line"><span class="tag"></<span class="name">bean</span>></span></span><br></pre></td></tr></table></figure>
<ol start="2">
<li>使用静态方法创建<br>在实际开发中,我们使用的对象有些时候并不是直接通过构造函数就可以创建出来的,它可能在创建的过程中会做很多额外的操作。此时会提供一个创建对象的方法,恰好这个方法是 static 修饰的方法,即是此种情况。<br>例如,我们在做 Jdbc 操作时,会用到 java.sql.Connection 接口的实现类,如果是 mysql 数据库,那么用的就是 JDBC4Connection,但是我们不会去写 JDBC4Connection connection = new JDBC4Connection() ,因为我们要注册驱动,还要提供URL和凭证信息,用 DriverManager.getConnection 方法来获取连接。<br>那么在实际开发中,尤其早期的项目没有使用Spring框架来管理对象的创建,但是在设计时使用了工厂模式解耦,那么当接入 Spring 之后,工厂类创建对象就具有和上述例子相同特征,即可采用此种方式配置。</li>
</ol>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"connectionUtils"</span> <span class="attr">class</span>=<span class="string">"com.lagou.edu.utils.ConnectionUtils"</span> <span class="attr">factory-method</span>=<span class="string">"getInstance"</span>/></span></span><br></pre></td></tr></table></figure>
<ol start="3">
<li>使用实例化方法创建<br>此种方式和上面静态方法创建其实类似,区别是用于获取对象的方法不再是static修饰的了,而是类中的一个普通方法。此种方式比静态方法创建的使用几率要高一些。<br>在早期开发的项目中,工厂类中的方法有可能是静态的,也有可能是非静态方法,当是非静态方法时,即可采用此种方式配置。</li>
</ol>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"createBeanFactory"</span> <span class="attr">class</span>=<span class="string">"com.lagou.edu.factory.CreateBeanFactory"</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"connectionUtils2"</span> <span class="attr">factory-bean</span>=<span class="string">"createBeanFactory"</span> <span class="attr">factory-method</span>=<span class="string">"getInstant"</span>/></span></span><br></pre></td></tr></table></figure>
<h4 id="Bean-标签属性"><a href="#Bean-标签属性" class="headerlink" title="Bean 标签属性"></a>Bean 标签属性</h4><blockquote>
<p>在基于 xml 的 IoC 配置中,bean 标签是最基础的标签。它表示了 IoC 容器中的一个对象。换句话说,如果一个对象想让 spring 管理,在 XML 的配置中都需要使用此标签配置,Bean 标签的属性如下:</p>
<ul>
<li>id属性:用于给bean提供一个唯一标识。在一个标签内部,标识必须唯一。</li>
<li>class属性:用于指定创建Bean对象的全限定类名。</li>
<li>name属性:用于给bean提供一个或多个名称。多个名称用空格分隔。</li>
<li>factory-bean属性:用于指定创建当前bean对象的工厂bean的唯一标识。当指定了此属性之后, class属性失效。</li>
<li>factory-method属性:用于指定创建当前bean对象的工厂方法,如配合factory-bean属性使用, 则class属性失效。如配合class属性使用,则方法必须是static的。</li>
<li>scope属性:用于指定bean对象的作用范围。通常情况下就是singleton。当要用到多例模式时, 可以配置为prototype。</li>
<li>init-method属性:用于指定bean对象的初始化方法,此方法会在bean对象装配后调用。必须是 一个无参方法。</li>
<li>destory-method属性:用于指定bean对象的销毁方法,此方法会在bean对象销毁前执行。它只 能为scope是singleton时起作用。</li>
</ul>
</blockquote>
<h4 id="DI-依赖注入的-XML-配置"><a href="#DI-依赖注入的-XML-配置" class="headerlink" title="DI 依赖注入的 XML 配置"></a>DI 依赖注入的 XML 配置</h4><h4 id="依赖注入分类"><a href="#依赖注入分类" class="headerlink" title="依赖注入分类"></a>依赖注入分类</h4><blockquote>
<h5 id="按照注入的方式分类"><a href="#按照注入的方式分类" class="headerlink" title="按照注入的方式分类"></a>按照注入的方式分类</h5><p>构造函数注入:利用带参构造函数实现对类成员的数据赋值,使用标签 constructor-arg</p>
<ul>
<li>name:用于给构造函数中指定名称的参数赋值</li>
<li>index:用于给构造函数中指定索引位置的参数赋值</li>
<li>value:用于指定基本类型或者 String 类型的数据</li>
<li>ref:用于指定其他 bean 类型的数据,写的是其他 bean 的唯一标识</li>
</ul>
<p>set 方法注入:它是通过类成员的 set 方法实现数据的注入,使用标签 property</p>
<ul>
<li>name:指定注入时调用的set方法名称。(注:不包含set这三个字母) </li>
<li>value:指定注入的数据。它支持基本类型和String类型</li>
<li>ref:用于指定其他 bean 类型的数据,写的是其他 bean 的唯一标识</li>
</ul>
</blockquote>
<blockquote>
<h5 id="按照注入的数据类型分类"><a href="#按照注入的数据类型分类" class="headerlink" title="按照注入的数据类型分类"></a>按照注入的数据类型分类</h5><ul>
<li>基本类型和 String:注入的数据类型是基本类型或者是字符串类型的数据</li>
<li>其他 bean 类型:注入的数据类型是对象类型,这个对象要求在 IoC 容器中</li>
</ul>
</blockquote>
<p><img src="https://img-blog.csdnimg.cn/ba102828f4844dce9e6bb6fa4bd1629a.png"></p>
<h4 id="复杂类型(集合类型)"><a href="#复杂类型(集合类型)" class="headerlink" title="复杂类型(集合类型)"></a>复杂类型(集合类型)</h4><blockquote>
<p>注入的数据类型是 Aarry,List,Set,Map,Properties 中的一种类型。</p>
</blockquote>
<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><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><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"transferService"</span> <span class="attr">class</span>=<span class="string">"com.lagou.edu.service.impl.TransferServiceImpl"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">constructor-arg</span> <span class="attr">name</span>=<span class="string">"accountDao"</span> <span class="attr">ref</span>=<span class="string">"accountDao"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">constructor-arg</span> <span class="attr">name</span>=<span class="string">"age"</span> <span class="attr">value</span>=<span class="string">"18"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">constructor-arg</span> <span class="attr">name</span>=<span class="string">"name"</span> <span class="attr">value</span>=<span class="string">"adc"</span>/></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"myArray"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">array</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">value</span>></span>arr1<span class="tag"></<span class="name">value</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">value</span>></span>arr2<span class="tag"></<span class="name">value</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">value</span>></span>arr3<span class="tag"></<span class="name">value</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">array</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"myMap"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">map</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">entry</span> <span class="attr">key</span>=<span class="string">"key1"</span> <span class="attr">value</span>=<span class="string">"value1"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">entry</span> <span class="attr">key</span>=<span class="string">"key2"</span> <span class="attr">value</span>=<span class="string">"value2"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">entry</span> <span class="attr">key</span>=<span class="string">"key3"</span> <span class="attr">value</span>=<span class="string">"value3"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">map</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"mySet"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">set</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">value</span>></span>set1<span class="tag"></<span class="name">value</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">value</span>></span>set2<span class="tag"></<span class="name">value</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">value</span>></span>set3<span class="tag"></<span class="name">value</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">set</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"myProperties"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">props</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">prop</span> <span class="attr">key</span>=<span class="string">"key1"</span>></span>value1<span class="tag"></<span class="name">prop</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">prop</span> <span class="attr">key</span>=<span class="string">"key2"</span>></span>value2<span class="tag"></<span class="name">prop</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">prop</span> <span class="attr">key</span>=<span class="string">"key3"</span>></span>value3<span class="tag"></<span class="name">prop</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">props</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">property</span>></span></span><br><span class="line"><span class="tag"></<span class="name">bean</span>></span></span><br></pre></td></tr></table></figure>
<blockquote>
<p>在 List 结构的集合数据注入时,array , list , set 这三个标签通用,另外注值的 value<br>标签内部可以直接写值,也可以使用 bean 标签配置一个对象,或者用 ref 标签引用一个已经配合的 bean 的唯一标识。 在 Map<br>结构的集合数据注入时, map 标签使用 entry 子标签实现数据注入, entry 标签可以使用 key 和 value 属性指定存入<br>map 中的数据。使用 value-ref 属性指定已经配置好的 bean 的引用。 同时 entry 标签中也可以使用 ref<br>标签,但是不能使用 bean 标签。而 property 标签中不能使用 ref 或者 bean 标签引用对象。</p>
</blockquote>
<h2 id="XML-与注解结合的方式"><a href="#XML-与注解结合的方式" class="headerlink" title="XML 与注解结合的方式"></a>XML 与注解结合的方式</h2><h3 id="引入:"><a href="#引入:" class="headerlink" title="引入:"></a>引入:</h3><ol>
<li>实际企业开发中,纯 xml 模式使用已经很少了</li>
<li>引入注解功能,不需要引入额外的 jar</li>
<li>xml+注解结合模式,xml 文件依然存在,所以 Spring IoC 容器的启动仍然从加载 xml 开始</li>
<li>第三方 jar 中的 bean 定义在 xml,比如 druid 数据库连接池。自己开发的 bean 定义使用注解</li>
</ol>
<h3 id="xml-中标签与注解的对应"><a href="#xml-中标签与注解的对应" class="headerlink" title="xml 中标签与注解的对应"></a>xml 中标签与注解的对应</h3><table>
<thead>
<tr>
<th>xml 形式</th>
<th>对应的注解形式</th>
</tr>
</thead>
<tbody><tr>
<td>标签</td>
<td>@Component(“accountDao”),注解加在类上 bean 的 id 属性内容直接配置在注解后面如果不配置,默认定义个这个 bean 的 id 为类的类名首字母小写。另外,针对分层代码开发提供了 @Componenet 的三种别名 @Controller、 @Service、@Repository 分别用于控制层类、服务层类、dao 层类的 bean 定义,这四个注解的用法完全一样,只是为了更清晰的区分而已</td>
</tr>
<tr>
<td>标签的 scope 属性</td>
<td>@Scope(“prototype”),默认单例,注解加在类上</td>
</tr>
<tr>
<td>标签的 init-method 属性</td>
<td>@PostConstruct,注解加在方法上,该方法就是初始化后调用的方法</td>
</tr>
<tr>
<td>标签的 destory-method 属性</td>
<td>@PreDestory,注解加在方法上,该方法就是销毁前调用的方法</td>
</tr>
</tbody></table>
<h3 id="xml-里需要配置注解扫描"><a href="#xml-里需要配置注解扫描" class="headerlink" title="xml 里需要配置注解扫描"></a>xml 里需要配置注解扫描</h3><p>引入Spring Context 命名空间</p>
<blockquote>
<p>xmlns:context=”<a target="_blank" rel="noopener" href="http://www.springframework.org/schema/context"">http://www.springframework.org/schema/context"</a><br><a target="_blank" rel="noopener" href="http://www.springframework.org/schema/context">http://www.springframework.org/schema/context</a><br><a target="_blank" rel="noopener" href="https://www.springframework.org/schema/context/spring-context.xsd">https://www.springframework.org/schema/context/spring-context.xsd</a></p>
</blockquote>
<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><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></pre></td><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"utf-8"</span> ?></span></span><br><span class="line"><span class="tag"><<span class="name">beans</span> <span class="attr">xmlns</span>=<span class="string">"http://www.springframework.org/schema/beans"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:context</span>=<span class="string">"http://www.springframework.org/schema/context"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"</span></span></span><br><span class="line"><span class="string"><span class="tag"> http://www.springframework.org/schema/beans</span></span></span><br><span class="line"><span class="string"><span class="tag"> https://www.springframework.org/schema/beans/spring-beans.xsd</span></span></span><br><span class="line"><span class="string"><span class="tag"> http://www.springframework.org/schema/context</span></span></span><br><span class="line"><span class="string"><span class="tag"> https://www.springframework.org/schema/context/spring-context.xsd"</span>></span></span><br><span class="line"> </span><br><span class="line"> <span class="comment"><!--开启注解扫描--></span></span><br><span class="line"> <span class="tag"><<span class="name">context:component-scan</span> <span class="attr">base-package</span>=<span class="string">"com.lagou.edu"</span>/></span></span><br><span class="line"> </span><br><span class="line"> <span class="comment"><!--引入外部资源文件--></span></span><br><span class="line"> <span class="tag"><<span class="name">context:property-placeholder</span> <span class="attr">location</span>=<span class="string">"classpath:jdbc.properties"</span>/></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"dataSource"</span> <span class="attr">class</span>=<span class="string">"com.alibaba.druid.pool.DruidDataSource"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"driverClassName"</span> <span class="attr">value</span>=<span class="string">"${jdbc.driver}"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"url"</span> <span class="attr">value</span>=<span class="string">"${jdbc.url}"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"username"</span> <span class="attr">value</span>=<span class="string">"${jdbc.username}"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"password"</span> <span class="attr">value</span>=<span class="string">"${jdbc.password}"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">bean</span>></span></span><br><span class="line"> </span><br><span class="line"><span class="tag"></<span class="name">beans</span>></span></span><br></pre></td></tr></table></figure>
<h3 id="DI-依赖注入的注解实现方式"><a href="#DI-依赖注入的注解实现方式" class="headerlink" title="DI 依赖注入的注解实现方式"></a>DI 依赖注入的注解实现方式</h3><p><strong>@Autowired</strong><br>Spring 提供的注解,需要导入包 org.springframework.beans.factory.annotation.Autowired,按照类型注入。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Autowired</span></span><br><span class="line"><span class="keyword">private</span> AccountDao accountDao;</span><br></pre></td></tr></table></figure>
<p>如上代码所示,这样装配回去 Spring 容器中找到类型为 AccountDao 的类,然后将其注入进来。这样会产生一个问题,当一个类型有多个 bean 值的时候,会造成无法选择具体注入哪一个的情况,这个时候我们需要配合着 @Qualifier 使用。</p>
<p><strong>@Qualifier</strong> 告诉 Spring 具体去装配哪个对象</p>
<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></pre></td><td class="code"><pre><span class="line"><span class="meta">@Autowired</span></span><br><span class="line"><span class="meta">@Qualifier("jdbcAccountDaoImpl")</span></span><br><span class="line"><span class="keyword">private</span> AccountDao accountDao;</span><br></pre></td></tr></table></figure>
<p><strong>@Resource</strong><br>J2EE 提供的注解,需要导入包 javax.annotation.Resource。 默认按照 ByName 自动注入。</p>
<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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">TransferService</span> {</span><br><span class="line"> <span class="meta">@Resource</span></span><br><span class="line"> <span class="keyword">private</span> AccountDao accountDao;</span><br><span class="line"> <span class="meta">@Resource(name="studentDao")</span></span><br><span class="line"> <span class="keyword">private</span> StudentDao studentDao;</span><br><span class="line"> <span class="meta">@Resource(type="TeacherDao")</span></span><br><span class="line"> <span class="keyword">private</span> TeacherDao teacherDao;</span><br><span class="line"> <span class="meta">@Resource(name="manDao",type="ManDao")</span></span><br><span class="line"> <span class="keyword">private</span> ManDao manDao;</span><br><span class="line">} </span><br></pre></td></tr></table></figure>
<ul>
<li>如果同时指定了 name 和 type,则从 Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛出异常。</li>
<li>如果指定了 name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。</li>
<li>如果指定了 type,则从上下文中找到类似匹配的唯一 bean 进行装配,找不到或是找到多个, 都会抛出异常。 如果既没有指定 name,又没有指定 type,则自动按照 byName 方式进行装配。</li>
</ul>
<h2 id="纯注解方式"><a href="#纯注解方式" class="headerlink" title="纯注解方式"></a>纯注解方式</h2><p>将 xml 中的配置以注解的形式迁移到配置类中即可。</p>
<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></pre></td><td class="code"><pre><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="meta">@ComponentScan(basePackages = {"com.lagou.edu"})</span></span><br><span class="line"><span class="meta">@Import({DataSourceConfig.class})</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SpringConfig</span> {</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<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></pre></td><td class="code"><pre><span class="line"><span class="meta">@PropertySource({"classpath:jdbc.properties"})</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">DataSourceConfig</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Value("${jdbc.driver}")</span></span><br><span class="line"> <span class="keyword">private</span> String driverClassName;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Value("${jdbc.url}")</span></span><br><span class="line"> <span class="keyword">private</span> String url;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Value("${jdbc.username}")</span></span><br><span class="line"> <span class="keyword">private</span> String username;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Value("${jdbc.password}")</span></span><br><span class="line"> <span class="keyword">private</span> String password;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> DataSource <span class="title function_">dataSource</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">DruidDataSource</span> <span class="variable">dataSource</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DruidDataSource</span>();</span><br><span class="line"> dataSource.setDriverClassName(driverClassName);</span><br><span class="line"> dataSource.setUrl(url);</span><br><span class="line"> dataSource.setUsername(username);</span><br><span class="line"> dataSource.setPassword(password);</span><br><span class="line"> <span class="keyword">return</span> dataSource;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="对应注解"><a href="#对应注解" class="headerlink" title="对应注解"></a>对应注解</h3><p><strong>@Configuration</strong>:表名当前类是一个配置类<br><strong>@ComponentScan</strong>:替代 context:component-scan<br><strong>@PropertySource</strong>:引入外部属性配置文件<br><strong>@Import</strong>:引入其他配置类<br><strong>@Value</strong>:对变量赋值,可以直接赋值,也可以使用 ${} 读取资源配置文件中的信息 @Bean:将方法返回对象加入 SpringIoC 容器</p>
<h1 id="启动-IoC-容器的方式"><a href="#启动-IoC-容器的方式" class="headerlink" title="启动 IoC 容器的方式"></a>启动 IoC 容器的方式</h1><h2 id="Java-环境下启动-IoC-容器"><a href="#Java-环境下启动-IoC-容器" class="headerlink" title="Java 环境下启动 IoC 容器"></a>Java 环境下启动 IoC 容器</h2><ul>
<li>ClassPathXmlApplicationContext:从类的根路径下加载配置文件</li>
<li>FileSystemXmlApplicationContext:从磁盘路径上加载配置文件</li>
</ul>
<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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">test</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">ApplicationContext</span> <span class="variable">applicationContext</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ClassPathXmlApplicationContext</span>(<span class="string">"application-context.xml"</span>);</span><br><span class="line"> <span class="type">TransferService</span> <span class="variable">transferService</span> <span class="operator">=</span> (TransferService) applicationContext.getBean(<span class="string">"transferService"</span>);</span><br><span class="line"> System.out.println(transferService);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>AnnotationConfigApplicationContext:纯注解模式下启动 Spring 容器</li>
</ul>
<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></pre></td><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">test</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">ApplicationContext</span> <span class="variable">applicationContext</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AnnotationConfigApplicationContext</span>(SpringConfig.class);</span><br><span class="line"> <span class="type">TransferService</span> <span class="variable">transferService</span> <span class="operator">=</span> (TransferService) applicationContext.getBean(<span class="string">"transferServiceImpl"</span>);</span><br><span class="line"> System.out.println(transferService);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="Web-环境下启动-IoC-容器"><a href="#Web-环境下启动-IoC-容器" class="headerlink" title="Web 环境下启动 IoC 容器"></a>Web 环境下启动 IoC 容器</h2><h3 id="从-xml-启动容器"><a href="#从-xml-启动容器" class="headerlink" title="从 xml 启动容器"></a>从 xml 启动容器</h3><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><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></pre></td><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">web-app</span> <span class="keyword">PUBLIC</span></span></span><br><span class="line"><span class="meta"> <span class="string">"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</span></span></span><br><span class="line"><span class="meta"> <span class="string">"http://java.sun.com/dtd/web-app_2_3.dtd"</span> ></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">web-app</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">display-name</span>></span>Archetype Created Web Application<span class="tag"></<span class="name">display-name</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--配置 spring IoC 容器的配置文件--></span></span><br><span class="line"> <span class="tag"><<span class="name">context-param</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">param-name</span>></span>contextConfigLocation<span class="tag"></<span class="name">param-name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">param-value</span>></span>classpath:application-context.xml<span class="tag"></<span class="name">param-value</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">context-param</span>></span></span><br><span class="line"> <span class="comment"><!--使用监听器启动 spring 的 IoC 容器--></span></span><br><span class="line"> <span class="tag"><<span class="name">listener</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">listener-class</span>></span>org.springframework.web.context.ContextLoaderListener<span class="tag"></<span class="name">listener-class</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">listener</span>></span></span><br><span class="line"><span class="tag"></<span class="name">web-app</span>></span></span><br></pre></td></tr></table></figure>
<h3 id="从配置类启动容器"><a href="#从配置类启动容器" class="headerlink" title="从配置类启动容器"></a>从配置类启动容器</h3><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><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></pre></td><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">web-app</span> <span class="keyword">PUBLIC</span></span></span><br><span class="line"><span class="meta"> <span class="string">"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</span></span></span><br><span class="line"><span class="meta"> <span class="string">"http://java.sun.com/dtd/web-app_2_3.dtd"</span> ></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">web-app</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">display-name</span>></span>Archetype Created Web Application<span class="tag"></<span class="name">display-name</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--告诉 ContextLoaderListener 使用注解方式启动 IoC 容器--></span></span><br><span class="line"> <span class="tag"><<span class="name">context-param</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">param-name</span>></span>contextClass<span class="tag"></<span class="name">param-name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">param-value</span>></span>org.springframework.web.context.support.AnnotationConfigWebApplicationContext<span class="tag"></<span class="name">param-value</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">context-param</span>></span></span><br><span class="line"> <span class="comment"><!--配置启动类的全限定类名--></span></span><br><span class="line"> <span class="tag"><<span class="name">context-param</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">param-name</span>></span>contextConfigLocation<span class="tag"></<span class="name">param-name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">param-value</span>></span>com.lagou.edu.SpringConfig<span class="tag"></<span class="name">param-value</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">context-param</span>></span></span><br><span class="line"> <span class="comment"><!--使用监听器启动 spring 的 IoC 容器--></span></span><br><span class="line"> <span class="tag"><<span class="name">listener</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">listener-class</span>></span>org.springframework.web.context.ContextLoaderListener<span class="tag"></<span class="name">listener-class</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">listener</span>></span></span><br><span class="line"><span class="tag"></<span class="name">web-app</span>></span></span><br></pre></td></tr></table></figure>
<h4 id="servlet-中获取容器"><a href="#servlet-中获取容器" class="headerlink" title="servlet 中获取容器"></a>servlet 中获取容器</h4><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></pre></td><td class="code"><pre><span class="line"><span class="meta">@WebServlet(name = "transferServlet", urlPatterns = "/transferServlet")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">TransferServlet</span> <span class="keyword">extends</span> <span class="title class_">HttpServlet</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> TransferService transferService;</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_">init</span><span class="params">()</span> <span class="keyword">throws</span> ServletException {</span><br><span class="line"> <span class="type">WebApplicationContext</span> <span class="variable">webApplicationContext</span> <span class="operator">=</span> WebApplicationContextUtils.getWebApplicationContext(</span><br><span class="line"> <span class="built_in">this</span>.getServletContext());</span><br><span class="line"> <span class="type">TransactionProxyFactory</span> <span class="variable">transactionProxyFactory</span> <span class="operator">=</span> webApplicationContext.getBean(TransactionProxyFactory.class);</span><br><span class="line"> <span class="built_in">this</span>.transferService = transactionProxyFactory.getTarget(webApplicationContext.getBean(TransferService.class));</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">protected</span> <span class="keyword">void</span> <span class="title function_">doGet</span><span class="params">(HttpServletRequest req, HttpServletResponse resp)</span> <span class="keyword">throws</span> ServletException, IOException {</span><br><span class="line"></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">protected</span> <span class="keyword">void</span> <span class="title function_">doPost</span><span class="params">(HttpServletRequest req, HttpServletResponse resp)</span> <span class="keyword">throws</span> ServletException, IOException {</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>
<h1 id="SpringContextUtil——获取spring中的bean对象"><a href="#SpringContextUtil——获取spring中的bean对象" class="headerlink" title="SpringContextUtil——获取spring中的bean对象"></a>SpringContextUtil——获取spring中的bean对象</h1><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><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SpringContextUtil</span> <span class="keyword">implements</span> <span class="title class_">ApplicationContextAware</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//Spring应用上下文环境</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> ApplicationContext applicationContext;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 实现ApplicationContextAware接口的回调方法,设置上下文环境</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> applicationContext</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> BeansException</span></span><br><span class="line"><span class="comment"> */</span></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_">setApplicationContext</span><span class="params">(ApplicationContext applicationContext)</span> <span class="keyword">throws</span> BeansException {</span><br><span class="line"> System.out.println(<span class="string">"执行ApplicationContext对象注入!"</span>);</span><br><span class="line"> SpringContextUtil.applicationContext = applicationContext;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> ApplicationContext <span class="title function_">getApplicationContext</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> applicationContext;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取对象</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> Object 一个以类型</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> BeansException</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <T> T <span class="title function_">getBean</span><span class="params">(Class<T> requiredType)</span> <span class="keyword">throws</span> BeansException {</span><br><span class="line"> <span class="keyword">return</span> applicationContext.getBean(requiredType);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取对象</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> name</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> Object 一个以所给名字注册的bean的实例</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> BeansException</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">getBean</span><span class="params">(String name)</span> <span class="keyword">throws</span> BeansException {</span><br><span class="line"> <span class="keyword">return</span> applicationContext.getBean(name);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取类型为requiredType的对象</span></span><br><span class="line"><span class="comment"> * 如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException)</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> name bean注册名</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> requireType 返回对象类型</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> Object 返回requiredType类型对象</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> BeansException</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <T> T <span class="title function_">getBean</span><span class="params">(String name, Class<T> requireType)</span> <span class="keyword">throws</span> BeansException {</span><br><span class="line"> <span class="keyword">return</span> applicationContext.getBean(name, requireType);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> name</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> boolean</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">containsBean</span><span class="params">(String name)</span> {</span><br><span class="line"> <span class="keyword">return</span> applicationContext.containsBean(name);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。</span></span><br><span class="line"><span class="comment"> * 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> name</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> boolean</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> NoSuchBeanDefinitionException</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">isSingleton</span><span class="params">(String name)</span> <span class="keyword">throws</span> NoSuchBeanDefinitionException {</span><br><span class="line"> <span class="keyword">return</span> applicationContext.isSingleton(name);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> name</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> Class 注册对象的类型</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> NoSuchBeanDefinitionException</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> Class <span class="title function_">getType</span><span class="params">(String name)</span> <span class="keyword">throws</span> NoSuchBeanDefinitionException {</span><br><span class="line"> <span class="keyword">return</span> applicationContext.getType(name);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 如果给定的bean名字在bean定义中有别名,则返回这些别名</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> name</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> NoSuchBeanDefinitionException</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String[] getAliases(String name) <span class="keyword">throws</span> NoSuchBeanDefinitionException {</span><br><span class="line"> <span class="keyword">return</span> applicationContext.getAliases(name);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</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/b8228d97.html">https://blog.990304.xyz/b8228d97.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/Spring/">Spring</a></div><div class="post_share"><div class="social-share" data-image="https://img-blog.csdnimg.cn/df0486e7b51f4b5aa1b9234b24dc266a.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="/b2a79ee.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">Spring IoC 高级特性</div></div></a></div><div class="next-post pull-right"><a href="/b539f3fa.html"><img class="next-cover" src="https://img-blog.csdnimg.cn/c29e31f0bab84722983c71f6ce6144aa.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAcXFfMzAwODczOTU=,size_14,color_FFFFFF,t_70,g_se,x_16#pic_center" onerror="onerror=null;src='/img/404.jpg'" alt="cover of next post"><div class="pagination-info"><div class="label">下一篇</div><div class="next_info">给SpringCloud-Gateway加全局过滤器,添加请求日志</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="/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><a href="/cbde7b0b.html" title="Spring IoC 循环依赖问题"><img class="cover" src="https://img-blog.csdnimg.cn/3aa3e44f116944ef9b10b4dd735c156a.png" alt="cover"><div class="content is-center"><div class="date"><i class="far fa-calendar-alt fa-fw"></i> 2022-07-30</div><div class="title">Spring IoC 循环依赖问题</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="#BeanFactory-%E4%B8%8E-ApplicationContext-%E5%8C%BA%E5%88%AB"><span class="toc-number">1.</span> <span class="toc-text">BeanFactory 与 ApplicationContext 区别</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E4%BD%BF%E7%94%A8-Spring-IoC-%E5%AE%B9%E5%99%A8%E7%9A%84%E6%96%B9%E5%BC%8F"><span class="toc-number">2.</span> <span class="toc-text">使用 Spring IoC 容器的方式</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#XML-%E6%96%B9%E5%BC%8F"><span class="toc-number">2.1.</span> <span class="toc-text">XML 方式</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#xml-%E6%96%87%E4%BB%B6%E5%A4%B4"><span class="toc-number">2.1.1.</span> <span class="toc-text">xml 文件头</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%AE%9E%E4%BE%8B%E5%8C%96Bean%E7%9A%84%E4%B8%89%E7%A7%8D%E6%96%B9%E5%BC%8F"><span class="toc-number">2.1.2.</span> <span class="toc-text">实例化Bean的三种方式</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#Bean-%E6%A0%87%E7%AD%BE%E5%B1%9E%E6%80%A7"><span class="toc-number">2.1.2.1.</span> <span class="toc-text">Bean 标签属性</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#DI-%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E7%9A%84-XML-%E9%85%8D%E7%BD%AE"><span class="toc-number">2.1.2.2.</span> <span class="toc-text">DI 依赖注入的 XML 配置</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E5%88%86%E7%B1%BB"><span class="toc-number">2.1.2.3.</span> <span class="toc-text">依赖注入分类</span></a><ol class="toc-child"><li class="toc-item toc-level-5"><a class="toc-link" href="#%E6%8C%89%E7%85%A7%E6%B3%A8%E5%85%A5%E7%9A%84%E6%96%B9%E5%BC%8F%E5%88%86%E7%B1%BB"><span class="toc-number">2.1.2.3.1.</span> <span class="toc-text">按照注入的方式分类</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#%E6%8C%89%E7%85%A7%E6%B3%A8%E5%85%A5%E7%9A%84%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E5%88%86%E7%B1%BB"><span class="toc-number">2.1.2.3.2.</span> <span class="toc-text">按照注入的数据类型分类</span></a></li></ol></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%A4%8D%E6%9D%82%E7%B1%BB%E5%9E%8B%EF%BC%88%E9%9B%86%E5%90%88%E7%B1%BB%E5%9E%8B%EF%BC%89"><span class="toc-number">2.1.2.4.</span> <span class="toc-text">复杂类型(集合类型)</span></a></li></ol></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#XML-%E4%B8%8E%E6%B3%A8%E8%A7%A3%E7%BB%93%E5%90%88%E7%9A%84%E6%96%B9%E5%BC%8F"><span class="toc-number">2.2.</span> <span class="toc-text">XML 与注解结合的方式</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%BC%95%E5%85%A5%EF%BC%9A"><span class="toc-number">2.2.1.</span> <span class="toc-text">引入:</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#xml-%E4%B8%AD%E6%A0%87%E7%AD%BE%E4%B8%8E%E6%B3%A8%E8%A7%A3%E7%9A%84%E5%AF%B9%E5%BA%94"><span class="toc-number">2.2.2.</span> <span class="toc-text">xml 中标签与注解的对应</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#xml-%E9%87%8C%E9%9C%80%E8%A6%81%E9%85%8D%E7%BD%AE%E6%B3%A8%E8%A7%A3%E6%89%AB%E6%8F%8F"><span class="toc-number">2.2.3.</span> <span class="toc-text">xml 里需要配置注解扫描</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#DI-%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%E7%9A%84%E6%B3%A8%E8%A7%A3%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F"><span class="toc-number">2.2.4.</span> <span class="toc-text">DI 依赖注入的注解实现方式</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%BA%AF%E6%B3%A8%E8%A7%A3%E6%96%B9%E5%BC%8F"><span class="toc-number">2.3.</span> <span class="toc-text">纯注解方式</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%AF%B9%E5%BA%94%E6%B3%A8%E8%A7%A3"><span class="toc-number">2.3.1.</span> <span class="toc-text">对应注解</span></a></li></ol></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E5%90%AF%E5%8A%A8-IoC-%E5%AE%B9%E5%99%A8%E7%9A%84%E6%96%B9%E5%BC%8F"><span class="toc-number">3.</span> <span class="toc-text">启动 IoC 容器的方式</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#Java-%E7%8E%AF%E5%A2%83%E4%B8%8B%E5%90%AF%E5%8A%A8-IoC-%E5%AE%B9%E5%99%A8"><span class="toc-number">3.1.</span> <span class="toc-text">Java 环境下启动 IoC 容器</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Web-%E7%8E%AF%E5%A2%83%E4%B8%8B%E5%90%AF%E5%8A%A8-IoC-%E5%AE%B9%E5%99%A8"><span class="toc-number">3.2.</span> <span class="toc-text">Web 环境下启动 IoC 容器</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E4%BB%8E-xml-%E5%90%AF%E5%8A%A8%E5%AE%B9%E5%99%A8"><span class="toc-number">3.2.1.</span> <span class="toc-text">从 xml 启动容器</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E4%BB%8E%E9%85%8D%E7%BD%AE%E7%B1%BB%E5%90%AF%E5%8A%A8%E5%AE%B9%E5%99%A8"><span class="toc-number">3.2.2.</span> <span class="toc-text">从配置类启动容器</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#servlet-%E4%B8%AD%E8%8E%B7%E5%8F%96%E5%AE%B9%E5%99%A8"><span class="toc-number">3.2.2.1.</span> <span class="toc-text">servlet 中获取容器</span></a></li></ol></li></ol></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#SpringContextUtil%E2%80%94%E2%80%94%E8%8E%B7%E5%8F%96spring%E4%B8%AD%E7%9A%84bean%E5%AF%B9%E8%B1%A1"><span class="toc-number">4.</span> <span class="toc-text">SpringContextUtil——获取spring中的bean对象</span></a></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>