# Spring
**Repository Path**: weiaigewang/spring
## Basic Information
- **Project Name**: Spring
- **Description**: spring 项目学习
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-11-03
- **Last Updated**: 2021-11-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Spring个人学习
## 一、 spring概念
spring核心概念文档:[spring核心概念:https://docs.spring.io/spring-framework/docs/5.2.18.RELEASE/spring-framework-referenc](https://docs.spring.io/spring-framework/docs/5.2.18.RELEASE/spring-framework-referenc)
- IOC
- AOP
- 事务管理
- WebFlux
## 二、 spring IOC容器
- 控制反转:把对象创建和对象之间的调用过程,交给spring进行管理。
### 2.1、IOC概念:
IOC的出现是为了人让对象与对象之间的耦合度降低到最低的限度。
- 原始方式对象创建:
在调用对象类中,采用new关键字创建实例调用实例方法这种方式耦合度太高,不利于开发。
- 工厂模式对象创建:
采用工厂类创建对象降低了service和dao之间调用,但是还是需要借助工厂类耦合。
- IOC容器创建对象:
### 2.2、IOC实现原理:
spring ico实现:xml解析 + 工厂模式 + 反射
### 2.3、IOC目的:
`降低耦合度`
### 2.4、IOC底层实现过程:
```java
public class UserFactory {
public static UserDao getUserDao(){
/**
* 1、xml解析得到对象名称
* String classValue = Class.属性值;
* 2、反射:得到类的字节码文件
* Class class = Class.forName(classValue);
* 3、返回对象
* return (UserDao)class.newInstance();
*/
return new UserDao();
}
}
```
### 2.5、IOC容器:
底层就是上面一堆工厂类的实现类。
- BeanFactory:
* (1)、IOC容器的内部使用接口。
* (2)、加载配置文件的时候不会创建对象,在获取对象的时候才会去创建对象。
- ApplicationContext:
* (1)、BeanFactory的子接口,功能更加强大
* (2)、加载配置文件的时候就会把配置文件的对象进行创建。
* (3)、一般会把创建对象这种耗时操作放在加载阶段就进行创建。
- ClassPathXmlApplicationContext:
获取的是项目的src下面的路径。
- FileSystemXmlApplicationContext:
需要spring xml全路径。
```java
public class TestSpring {
@Test
public void test(){
// 1、加载spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
//需要xml全路径
//ApplicationContext context = new FileSystemXmlApplicationContext("bean1.xml");
// 2、获取配置创建对象(userDao:xml中的id属性名)
UserDao dao = context.getBean("UserDao", UserDao.class);
dao.create();
}
}
```
### 2.6、bean管理:
- 创建对象:两种方式
* (1)、基于xml配置:
xml配置创建对象的时候默认使用无参构造方法创建对象。
```xml
```
- 注入属性:
* (1)、基于xml配置:
- <1>、spring在xml通过bean中的property属性注入属性。
* (1)、DI:依赖注入,就是注入属性。
* (2)、spring 只支持`set方法注入`或者`有参构造方法注入`。
```xml
```
- <2>、通过有参构造注入属性
```xml
```
- <3>、p命名空间注入
```xml
```
- <4>、字面量属性注入空值
```xml
```
- <5>、字面量属性特殊字符处理,防止转义
```xml
>]]>
```
- <6>、对象类型注入
```xml
```
然后再java类中执行main函数
```java
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.test();
}
}
```
- 内部bean和级联属性 :
(1)一对多关系:部门和员工
```xml
或者
```
- 集合属性注入:
新建java类
```java
public class Student {
private List roles;
private String[] hobby;
private Map map;
private Set sets;
// ... there is ignore
}
```
然后在spring xml中配置
```xml
吃饭
睡觉
打豆豆
admin
custom
管理员
超级管理员
《java从入门到入院》
《C#从入门到入院》
《PHP从入门到入院》
《web从入门到入院》
```
## 三、 spring AOP
## 四、 spring 事务
## 五、 spring Webflux