technology-note/java/spring/1.spring基础.md

182 lines
5.0 KiB
Markdown
Raw Normal View History

2018-11-25 12:37:20 +08:00
---
2019-02-21 23:34:11 +08:00
id: "2018-10-20-10-38-05"
2019-02-23 20:44:31 +08:00
date: "2018/10/20 10:38:05"
2019-02-21 23:34:11 +08:00
title: "spring基础"
tags: ["java", "spring"]
categories:
- "java"
- "spring学习"
2018-11-25 12:37:20 +08:00
---
2019-01-07 10:31:40 +08:00
  spring 是为了解决企业级应用开发的复杂性而创建的spring 最根本的使命是:简化 Java 开发。为降低开发复杂性有以下四种关键策略。
2018-11-25 12:37:20 +08:00
2019-01-07 10:31:40 +08:00
- 基于 POJO 的轻量级和最小侵入性编程
2018-11-25 12:37:20 +08:00
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式编程
- 通过切面和模板减少样板式代码
#### 1.依赖注入
2019-01-07 10:31:40 +08:00
  假设类 A 依赖类 B通常做法是在类 A 中声明类 B然后使用这样一方面具有极高的耦合性将类 A 与类 B 绑定在一起;另一方面也让单元测试变得很困难,无法在 A 外部获得 B 的执行情况。
2018-11-25 12:37:20 +08:00
  通过依赖注入,对象的依赖管理将不用对象本身来管理,将由一个第三方组件在创建对象时设定,依赖关系将被自动注入到对应的对象中去。
#### 2.创建应用上下文
- `ClassPathXmlApplicationContext()`从类路径创建
2019-01-07 10:31:40 +08:00
- `FileSystemXmlApplicationContext()`读取文件系统下的 xml 配置
- `XmlWebApplicationContext()` 读取 web 应用下的 XML 配置文件并装载上下文定义
2018-11-25 12:37:20 +08:00
2019-01-07 10:31:40 +08:00
#### 3.声明 Bean
2018-11-25 12:37:20 +08:00
2019-02-23 16:59:40 +08:00
<!-- more -->
2018-11-25 12:37:20 +08:00
1. 最简单
`<bean id="bean1" class="com.example.Class"/>`
2. 带构造器
```xml
<bean id="bean1" class="com.example.Class">
<contructor-arg value="12"/> //基本数据类型使用value
<contructor-arg ref="bean2"/> //对象使用ref
</bean>
```
3. 通过工厂方法创建
2019-01-07 10:31:40 +08:00
如果想声明的 Bean 没有一个公开的构造函数,通过 factory-method 属性来装配工厂生产的 Bean
2018-11-25 12:37:20 +08:00
```xml
<bean id="bean1" class="com.example.class" factory-method="getInstance"/>//getInstance为获取实例的静态方法。
```
2019-01-07 10:31:40 +08:00
#### 4.Bean 的作用域
2018-11-25 12:37:20 +08:00
2019-01-07 10:31:40 +08:00
所有 Spring Bean 默认都是单例的。通过配置 scope 属性为 prototype 可每次请求产生一个新的实例。
2018-11-25 12:37:20 +08:00
```xml
<bean id="bean3" class="com.example.class" scope="prototype">
```
2019-01-07 10:31:40 +08:00
scope 可选值:
2018-11-25 12:37:20 +08:00
2019-01-07 10:31:40 +08:00
- `singleton`:每个容器中,一个 Bean 对象只有一个实例。(**默认**
2018-11-25 12:37:20 +08:00
- `prototype`:允许实例化任意次 ,每次请求都会创建新的
2019-01-07 10:31:40 +08:00
- `request`:作用域为一次 http 请求
- `session`:作用域为一个 http session 会话
- `global-session`:作用域为一个全局 http session仅在 Protlet 上下文中有效
2018-11-25 12:37:20 +08:00
2019-01-07 10:31:40 +08:00
#### 5.初始化和销毁 Bean
2018-11-25 12:37:20 +08:00
2019-01-07 10:31:40 +08:00
当实例化需要执行初始化操作,或者销毁时需要执行清理工作。两种实现方式:
2018-11-25 12:37:20 +08:00
2019-01-07 10:31:40 +08:00
1. xml 配置,类中编写初始化方法和销毁方法,在 bean 中定义。
2018-11-25 12:37:20 +08:00
```xml
<bean id="bean4" class="com.example.Class" init-method="start" destroy-method="destroy"/>
```
2019-01-07 10:31:40 +08:00
也可在 Beans 中定义默认初始化和销毁方法。
2018-11-25 12:37:20 +08:00
```xml
<beans . . . default-init-method="" default-destroy-method=""/>
```
2019-01-07 10:31:40 +08:00
2. 实现`InitializingBean``DisposableBean`接口
2018-11-25 12:37:20 +08:00
2019-01-07 10:31:40 +08:00
#### 6.setter 注入
2018-11-25 12:37:20 +08:00
2019-01-07 10:31:40 +08:00
在 bean 中使用`<property>`元素配置属性,使用方法类似于`<constructor-arg>`
2018-11-25 12:37:20 +08:00
```xml
<property name="name" value="fxg"/> //注入基本数据类型
<property name="sex" ref="sex"/> //注入类
```
2019-01-07 10:31:40 +08:00
可使用 p 简写,**-ref**后缀说明装配的是一个引用
2018-11-25 12:37:20 +08:00
```xml
2019-01-07 10:31:40 +08:00
<bean id="bean5" class="com.example.class"
p:name="fxb"
2018-11-25 12:37:20 +08:00
p:sex-ref="sex"/>
```
2019-01-07 10:31:40 +08:00
#### 7.注入内部 Bean
2018-11-25 12:37:20 +08:00
2019-01-07 10:31:40 +08:00
既定义其他 Bean 内部的 Bean避免共享问题可在属性节点或者构造器参数节点上使用。
2018-11-25 12:37:20 +08:00
```xml
<property name="sex">
<bean class="com.example.sex"/> //没有id属性因为不会被其他bean使用
</property>
<constructor-arg>
<bean class="com.example.sex"/>
</constructor-arg>
```
#### 8.装配集合
2019-01-07 10:31:40 +08:00
| 集合元素 | 用途 |
| --------- | -------------------------------- |
| \<list\> | 装配 list 类型,允许重复 |
| \<set\> | set不能重复 |
| \<map\> | map 类型 |
| \<props\> | properties 类型,键值都为 String |
2018-11-25 12:37:20 +08:00
- list
```xml
<property name="instruments">
<list>
<ref bean="guitar"/>
<ref bean="cymbal"/>
<ref bean="harmonica"/>
</list>
</property>
<ref>用来定义上下文中的其他引用,还可使用<value>,<bean>,<null/>
```
- set
```xml
<set>
<ref bean="fasdf"/>
</set>
```
2019-01-07 10:31:40 +08:00
用法和 list 相同,只是不能重复
2018-11-25 12:37:20 +08:00
- Map
```XML
<map>
<entry key="GUITAR" value-ref="guitar"/>
</map>
```
2019-01-07 10:31:40 +08:00
entry 元素由一个 key一个 value 组成,分别有两种形式。
2018-11-25 12:37:20 +08:00
2019-01-07 10:31:40 +08:00
| key | 键为 String |
| :-------- | ---------------- |
| key-ref | 键为 Bean 的引用 |
| value | 值为 String |
| value-ref | 值为 Bean 的引用 |
2018-11-25 12:37:20 +08:00
- props
```xml
<props>
<prop key="GUITAR">guitar</prop>
</props>
```
2019-01-07 10:31:40 +08:00
键值都是 String
2018-11-25 12:37:20 +08:00
#### 9.装配空值
```xml
<property name="name"><null/></property>
```