-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
426 lines (409 loc) · 18.7 KB
/
atom.xml
File metadata and controls
426 lines (409 loc) · 18.7 KB
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
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<id>https://wilde3.github.io</id>
<title>wilde的博客</title>
<updated>2021-04-04T13:07:25.813Z</updated>
<generator>https://github.com/jpmonette/feed</generator>
<link rel="alternate" href="https://wilde3.github.io"/>
<link rel="self" href="https://wilde3.github.io/atom.xml"/>
<subtitle>wilde的博客</subtitle>
<logo>https://wilde3.github.io/images/avatar.png</logo>
<icon>https://wilde3.github.io/favicon.ico</icon>
<rights>All rights reserved 2021, wilde的博客</rights>
<entry>
<title type="html"><![CDATA[Spring01基础知识]]></title>
<id>https://wilde3.github.io/post/Spring/</id>
<link href="https://wilde3.github.io/post/Spring/">
</link>
<updated>2021-04-04T04:37:48.000Z</updated>
<content type="html"><![CDATA[<h2 id="1-spring框架的引言">1. Spring框架的引言</h2>
<p><code>spring</code>(春天),生于在2002年,由<code>Rod Johnson</code>创作。Spring框架是一个集众多设计模式于一身的<code>开源的</code>、<code>轻量级</code>的<code>项目管理</code>框架。致力于JAVAEE轻量级解决方案。相对于原来学过的框架而言,spring框架和之前学习的struts2 、 mybatis 框架有了本质的区别,不是替换原来的某个框架,而是对其进行<code>整合管理</code>。</p>
<p><code>轻量级解决方案</code>:提供一个以简单的、统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。</p>
<hr>
<h2 id="2spring框架的核心作用">2.Spring框架的核心作用</h2>
<p>Spring 框架用来<code>管理</code><strong>[创建|使用|销毁]<strong>项目中的组件,由于spring 框架可以帮我们生产项目中组件对象,因此也习惯称spring是一个</strong>工厂|容器</strong>。</p>
<blockquote>
<p><strong><code>组件</code>:</strong> 项目中的service,dao,action,都是项目中的组件</p>
<p><strong><code>注意</code>:</strong> spring框架通常<strong>不管理对实体类对象创建</strong></p>
</blockquote>
<hr>
<h2 id="3第一个环境搭建">3.第一个环境搭建</h2>
<figure data-type="image" tabindex="1"><img src="https://cdn.jsdelivr.net/gh/wilde3/Image-Hosting@master/blog-gridea/Spring/1%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84.png" alt="" loading="lazy"></figure>
<p>步骤:<br>
新建一个模块,maven,选择webapp,取名为spring——day1。</p>
<blockquote>
<p><code>a. 引入依赖</code></p>
</blockquote>
<p>在xml文件中引入依赖</p>
<pre><code class="language-xml"> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
</code></pre>
<blockquote>
<p><code>b. 引入配置文件</code></p>
</blockquote>
<pre><code class="language-markdown"># 配置文件名称: 任意名称
# 配置文件位置: 项目中根下任意位置
# 配置文件的内容:
```java
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd ">
</beans>
</code></pre>
<blockquote>
<p><code>c.创建组件</code></p>
</blockquote>
<p>新建directory——java,java目录下新建接口UserDAO.</p>
<pre><code class="language-java">public interface UserDAO {
void save(String name);
}
</code></pre>
<p>新建一个实现类UserDAOImpl实现接口</p>
<pre><code class="language-java">public class UserDAOImpl implements UserDAO {
public void save(String name) {
System.out.println("name = " + name);
}
}
</code></pre>
<blockquote>
<p><code>d.工厂管理</code><br>
在resources目录下也建立一个directory——init,在init目录下新建一个spring配置文件,名为spring.xml</p>
</blockquote>
<pre><code class="language-xml"><?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--通过spring管理组件
bean:用来管理组件对象的创建
class:用来指定管理组件对象的全限定名 包.类
id:用来指定spring框架创建的当前组件对象在spring中唯一标识
推荐id写成接口的首字母小写 如:userDAO
-->
<!--通过bean标签管理组件对象-->
<bean class="init.UserDAOImpl" id="aa"></bean>
</beans>
</code></pre>
<blockquote>
<p><code>e.启动工厂</code>测试<br>
在main-java-init目录下建立TestSpring的java文件用于测试。</p>
</blockquote>
<pre><code class="language-java"> public class TestSpring {
public static void main(String[] args) {
//启动工厂
ApplicationContext context = new ClassPathXmlApplicationContext("init/spring.xml");
//获取工程中创建好的对象 参数:获取工厂中指定对应的唯一标识
UserDAO userDAO = (UserDAO) context.getBean("aa");
userDAO.save("xiaochen");
}
}
</code></pre>
<p>若不采用spring,而采用传统方式new对象,则建立的测试为TestUserDAO:</p>
<pre><code class="language-java">public class TestUserDAO{
public static void main(String[] args){
//创建组件对象
UserDAOImpl userDAO = new UserDAOImpl();
//使用组件对象
userDAO.save("小陈");
//销毁jvm
}
}
</code></pre>
<hr>
<h2 id="4spring框架中的核心思想">4.Spring框架中的核心思想</h2>
<h4 id="41-ioc控制反转">4.1 IOC[控制反转]</h4>
<ul>
<li>
<p><code>IOC**(inversion of controll)控制反转</code></p>
<pre><code class="language-markdown"># 1.定义
将对象的创建由原来(new)的方式转移到配置文件中,交给spring工厂来创建对象
将原来手动通过new关键字创建对象的权利交给spring,由spring工厂创建对象过程,当然spring不仅要创建对象还要在创建对象的同时通过DI的方式为组件与组件调用关系
</code></pre>
</li>
<li>
<p><code>DI(dependcy Injection)依赖注入</code></p>
<pre><code class="language-markdown"># 1.定义
Spring不仅要创建对象,还要建立类与类之间的关系,因此在控制反转的基础上又提出了依赖注入的概念。为组件中成员变量完成赋值过程,这个过程就叫做依赖注入。
# 2.语法
两个步骤:
1.组件对象中需要哪个组件|谁 将谁声明为成员变量并提供公开的SET方法
2.在spring的配置文件中对应的组件标签内使用property标签去完成属性的赋值操作
</code></pre>
</li>
</ul>
<p>DI基本语法:</p>
<p>DAO组件:</p>
<pre><code class="language-java"> public class DeptDAOImpl implements DeptDAO{
@Override
public void save(String name){
System.out.println("DAO name:" + name);
}
}
</code></pre>
<p>Service组件:</p>
<pre><code class="language-java">public class DeptServiceImpl implements DeptService{
//需要DAO组件对象 依赖DAO组件
private DeptDAO deptDAO;
//公开的SET方法
public void setDeptDAO(DeptDAO deptDAO){
this.deptDAO = deptDAO;
}@Override
public void save(String name){
System.out.println("deptService name:" + name);
deptDAO.save(name);
}
}
</code></pre>
<p>xml配置文件赋值:</p>
<!--管理DAO组件-->
<p><bean class="di.DeptDAOImpl" id="aa"></bean></p>
<!--管理service组件-->
<p><bean class="di.DeptServiceImpl" id="deptService"></bean></p>
<pre><code><!--依赖的注入
property:用来给组件中的属性进行赋值操作
name:用来指定给组件中那个属性名进行赋值
ref:用来指定赋值对象在工厂中唯一标识 bean的id
-->
<property name="deptDAO" ref="aa"/>
</code></pre>
</bean>
<p>启动工程测试:<br>
ApplicationContext context = new ClassPathXmlApplicationContext("di/spring.xml");<br>
//获取service组件<br>
DeptService deptService = (DeptService) context.getBean("deptService");<br>
deptService.save("百知教育")</p>
<h4 id="42-aop面向切面编程">4.2 AOP[面向切面编程]</h4>
<p><strong>AOP</strong>( Aspect Oriental Programing ) <strong>面向切面的编程</strong></p>
<hr>
<h2 id="5-set方式注入">5. SET方式注入</h2>
<p>spring中注入方式</p>
<p>a.SET注入 使用成员变量SET方式为属性完成赋值的过程 重点</p>
<p>b.构造注入 使用构造方法形式进行属性的赋值 了解</p>
<p>c.自动注入 就是通过在配置文件中完成类中属性自动赋值 了解</p>
<h3 id="51-八种基本类型string类型-日期类型的注入">5.1 八种基本类型+String类型 +日期类型的注入</h3>
<blockquote>
<p><code>基本类型注入</code></p>
</blockquote>
<pre><code class="language-xml"><property name="name" value="zhagnsan"/>
<property name="age" value="21"/>
<property name="id" value="100063"/>
<property name="bir" value="2012/12/12"/>
<!--在spring技术栈中日期格式默认yyyy/MM/dd HH:mm:ss-->
<property name="price" value="23.23"/>
</code></pre>
<blockquote>
<p><code>数组类型注入</code></p>
</blockquote>
<pre><code class="language-xml"><!--注入数组类型数据-->
<property name="qqs">
<array>
<value>xxx</value>
<value>qqq</value>
<value>vvvv</value>
</array>
</property>
</code></pre>
<blockquote>
<p><code>注入引用类型和集合类型</code></p>
</blockquote>
<pre><code class="language-xml"><!--注入引用类型和对象-->
<property name="userDAO" ref="userDAO"/>
<!--注入list集合 list-->
<property name="lists">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
<!--注入map entry-->
<property name="maps">
<map>
<entry key="aa" value="xiaohei"/>
<entry key="bb" value="xiaoming"/>
<entry key="cc" value="xiaosan"/>
</map>
</property>
<!--注入properties 集合使用props标签-->
<property name="props">
<props>
<prop key="url">jdbc:mysql://localhost:3306/test</prop>
<prop key="driver">com.mysql.jdbc.Driver</prop>
<prop key="username">hr</prop>
<prop key="password">hr</prop>
</props>
</property>
</code></pre>
<blockquote>
<p><code>**注意**: 引用类型使用ref属性注入,基本类型使用value属性注入</code></p>
</blockquote>
<hr>
<h2 id="6构造注入">6.构造注入</h2>
<p>1.定义:使用类中构造方法为类中成员变量赋值的过程</p>
<p>2.语法:<br>
1.需要哪个组件属性将谁声明为成员变量,并提供公开的构造方法<br>
2.在配置文件中对应的组件标签内部使用<constructor-arg>标签进行注入</p>
<pre><code class="language-xml"><!--管理DAO组件
1. SET方式注入 注入时使用property标签
2. 构造方法注入 注入时使用<constructor-arg>标签
-->
<bean class="cdi.EmpDAOImpl" id="empDAO">
<!-- 使用构造注入 -->
<constructor-arg index="0" name="id" value="1"/>
<constructor-arg index="1" name="name" value="xiaohei"/>
<constructor-arg index="2" name="age" value="12"/>
<!-- 注入数组 -->
<constructor-arg index="3" name="qqs">
<array>
<value>xxx</value>
<value>222</value>
<value>333</value>
</array>
</constructor-arg>
<!-- 注入list -->
<constructor-arg index="4" name="habbys">
<list>
<value>haoren</value>
<value>huairen</value>
<value>xiaodoudou</value>
</list>
</constructor-arg>
</bean>
</code></pre>
<blockquote>
<p><code>注意:构造注入并不常用,不过在一些框架类中必须使用构造注入,这里先了解其注入语法即可。</code></p>
</blockquote>
<h2 id="7自动注入">7.自动注入</h2>
<p>1.自动注入【了解】<br>
在spring工厂配置文件中通过制定自动注入的方式开启组件属性的自动赋值</p>
<p>注意:<br>
1. 底层使用原理也是SET方式注入<br>
2. 自动注入需要在对应组件标签开启才能使用<br>
3. 只能用于引用类型的注入|对象类型|组件类型的注入</p>
<p>2.自动注入语法<br>
1.需要哪个组件属性将谁声明为成员变量,并提供公开的构造方法<br>
2.在对应的组件标签上加入autowired属性并制定自动注入方式即可完成注入</p>
<p>3.注入示例</p>
<pre><code class="language-xml"> <!-- 管理DAO组件 -->
<bean CLASS= "adi.StudentDAOImpl" id="studentDAO"/>
<bean CLASS= "adi.StudentDAONewImpl" id="studentNewDAO"/>
<!-- 管理Service组件 -->
autowise:用来给组件中成员变量完成自动赋值操作
byType:根据类型完成自动注入,根据成员变量类型去工厂中找,找到对应类型完成赋值,找不到不赋值
byName:根据名称完成自动注入,根据成员变量名字去工厂中获取与之一致的名字,找到对应类型完成赋值,找不到不赋值
</code></pre>
<blockquote>
<ul>
<li><strong>autowire=”byName”</strong></li>
</ul>
<blockquote>
<p><code>根据注入的属性名与配置文件中bean的id匹配,一致则注入,不一致报错</code></p>
</blockquote>
<ul>
<li><strong>autowire=”byType”</strong></li>
</ul>
<blockquote>
<p><code>根据注入的属性类型,与配置文件中的类型匹配,类型一致注入(在多个实现类时,会产生歧义)</code></p>
</blockquote>
<p><code>注意: 无论使用以上那种方式注入都需要为属性提供set方法</code></p>
</blockquote>
<hr>
<h2 id="8bean的创建模式">8.bean的创建模式</h2>
<p>spring中工厂创建对象的模式:工厂默认在管理对象都是单例方式,无论在工程获取多少次始终获取的是同一个对象</p>
<p><strong>singleton:单例 默认</strong><br>
service dao 单例形式管理</p>
<pre><code> 在工厂中`全局唯一,只创建一次`
</code></pre>
<p><strong>prototype: 多例</strong><br>
struts2 action 必须以多例形式管理</p>
<pre><code> `全局不唯一,每次使用都会创建一个新的对象`
</code></pre>
<pre><code class="language-java"><!-- 管理DAO组件
scope:用来指定工程创建对象的模式
默认值: singleton 单例
prototype 多例
-->
<bean id="tagDAO" class="scope.TagDAOImpl" scope="prototype"></bean>
service,dao -----> singleton
struts2 action -----> prototype
</code></pre>
<blockquote>
<p><code>注意:在项目开发中service,dao组件单例,struts2的Action必须为:多例</code></p>
</blockquote>
<hr>
<h2 id="9bean的生产原理">9.bean的生产原理</h2>
<blockquote>
<p><code>原理</code>: <code>反射+构造方法</code></p>
</blockquote>
<pre><code class="language-java"> UserDAOImpl userDAO = (UserDAOImpl) Class.forName("com.baizhi.dao.UserDAOImpl").newInstance();
System.out.println(userDAO);
</code></pre>
<hr>
<h2 id="10bean的生命周期">10.bean的生命周期</h2>
<blockquote>
<ul>
<li>
<p><code>何时创建</code></p>
<p>随着工厂启动, <strong><code>所有单例bean随之创建 非单例的bean,每次使用时创建</code></strong></p>
</li>
<li>
<p><code>何时销毁</code></p>
<p>工厂**<code>关闭,所有bean随之销毁</code>** ( 注意: <code>spring对多例bean管理松散,不会负责多例bean的销毁</code>)</p>
</li>
</ul>
</blockquote>
<h2 id="11bean工厂创建对象的好处">11.bean工厂创建对象的好处</h2>
<blockquote>
<ol>
<li><code>使用配置文件管理java类,再生产环境中更换类的实现时不需要重新部署,修改文件即可</code></li>
<li><code>spring默认使用单例的模式创建bean,减少内存的占用</code></li>
<li><code>通过依赖注入建立了类与类之间的关系(使java之间关系更为清晰,方便了维护与管理)</code></li>
</ol>
</blockquote>
]]></content>
</entry>
</feed>