Java Spring

2021-08-05  本文已影响0人  bowen_wu

概述

Spring 之前

一个 Main 程序

拆分并手动管理

Spring 容器核心概念

Bean

容器中的最小工作单元,通常为一个 Java 对象

BeanFactory | ApplicationContext

容器本身对应的 Java 对象

依赖注入 DI => Dependency Injection

容器负责注入所有依赖

控制反转 IoC => Inverse of Control

用户将控制权交给容器 => 不需要控制所有依赖的装配和运行,只需要声明之间的依赖,Spring 容器自动进行装配和运行 => 在 start 的时候就把所有依赖已经装配和运行,不是在运行代码时进行装配

手写一个简单的 IoC 实现

  1. 定义 Beand => resources/beans.properties
  2. 加载 Bean 的定义 => java.util.Properties.load
  3. 实例化 Bean => reflect => Map<beanClassName + beanInstance>
  4. 查找依赖,实现自动注入 => @Autowired => Field.set(<Object>, <beanInstance from Map>)

Spring IoC 实现

知识点

  1. wire => 电线 n. 装配 v. => AutoWired => 自动装配
  2. 使用注解声明依赖,依赖如何被注入进去,是 Spring 容器来决定的
  3. .properties => Java 原生支持的配置文件 => java.util.Properties
    # 注释 a: key 1: value
    a=1
    
  4. 默认情况下,反射不可以修改 private 成员变量,需要先 field.setAccessible(true); 之后再 field.set(<Class>, <Value>)
  5. 循环依赖的本质是在创造期的依赖,创造 A 的时候需要提供 B,但是创造 B 的时候需要提供 A。创造出来之后再分别对他们进行设值,这样的循环依赖容易解决
  6. 无状态的类是线程安全的,无状态的类结果更容易预测 => 相比于有状态的类
  7. @Autowired 不推荐写在属性上,更加推荐构造器注入,即 @Autowired 写在构造器上,Spring 容器可以识别,并且还可以 mock,进行单元测试。更推荐使用 @Inject@Autowired 写在 Field 上,一旦当前类脱离 Spring 容器,他就不能正常工作,这个是通过反射注入,在写单元测试的时候,也需要使用反射注入
  8. 获取 /resources 文件流 => <fileName>/resources 目录下
    • this.getClass().getClassLoader().getResourceAsStream(<fileName>);
    • MyClass.class.getResourceAsStream("/<fileName>")
上一篇下一篇

猜你喜欢

热点阅读