Java Spring
2021-08-05 本文已影响0人
bowen_wu
概述
- Java 世界应用的事实标准
- Spring 容器 => 一个 IoC 容器 => 自动化管理对象相关依赖的容器 => 模块之间的依赖越来越复杂,需要 Spring 容器帮助我们处理模块之间的依赖关系
- Spring MVC => 基于 Spring 和 Servlet 的 Web 应用框架 => 支持 Servlet 和网络请求的 Spring 程序
- Servlet => -let 小... => 小服务器 => 把外界的 http 请求封装成一个对象交给上层的 WebApp(网络应用) => WebApp 网络应用的事实标准就是 Spring MVC | Spring Boot => Tomcat | Jetty 框架
- booklet => 小册子
- applet => 小程序
- doclet =>
- Spring Boot => 集成度和自动化程度更高 => 内嵌了 Servlet => Servlet + Spring MVC
Spring 之前
一个 Main 程序
- 非常轻量,适用于非常简单的场景 => 易懂
- 一旦规模上来之后 => 难易维护
拆分并手动管理
- 方便测试 + 方便共同开发 + 方便维护
- 依赖关系纷繁复杂
Spring 容器核心概念
Bean
容器中的最小工作单元,通常为一个 Java 对象
BeanFactory | ApplicationContext
容器本身对应的 Java 对象
依赖注入 DI => Dependency Injection
容器负责注入所有依赖
控制反转 IoC => Inverse of Control
用户将控制权交给容器 => 不需要控制所有依赖的装配和运行,只需要声明之间的依赖,Spring 容器自动进行装配和运行 => 在 start 的时候就把所有依赖已经装配和运行,不是在运行代码时进行装配
手写一个简单的 IoC 实现
- 定义 Beand =>
resources/beans.properties
- 加载 Bean 的定义 =>
java.util.Properties.load
- 实例化 Bean => reflect =>
Map<beanClassName + beanInstance>
- 查找依赖,实现自动注入 =>
@Autowired
=>Field.set(<Object>, <beanInstance from Map>)
Spring IoC 实现
- 在 XML 里面定义 Bean
-
org.springframework.beans.factory.config.BeanDefinition.java
的载入和解析 - Bean 的实例化和依赖注入
知识点
-
wire
=> 电线 n. 装配 v. =>AutoWired
=> 自动装配 - 使用注解声明依赖,依赖如何被注入进去,是 Spring 容器来决定的
-
.properties
=> Java 原生支持的配置文件 =>java.util.Properties
# 注释 a: key 1: value a=1
- 默认情况下,反射不可以修改
private
成员变量,需要先field.setAccessible(true);
之后再field.set(<Class>, <Value>)
- 循环依赖的本质是在创造期的依赖,创造 A 的时候需要提供 B,但是创造 B 的时候需要提供 A。创造出来之后再分别对他们进行设值,这样的循环依赖容易解决
- 无状态的类是线程安全的,无状态的类结果更容易预测 => 相比于有状态的类
-
@Autowired
不推荐写在属性上,更加推荐构造器注入,即@Autowired
写在构造器上,Spring 容器可以识别,并且还可以 mock,进行单元测试。更推荐使用@Inject
,@Autowired
写在 Field 上,一旦当前类脱离 Spring 容器,他就不能正常工作,这个是通过反射注入,在写单元测试的时候,也需要使用反射注入 - 获取
/resources
文件流 =><fileName>
在/resources
目录下this.getClass().getClassLoader().getResourceAsStream(<fileName>);
MyClass.class.getResourceAsStream("/<fileName>")