美文网首页
Java Spring

Java Spring

作者: bowen_wu | 来源:发表于2021-08-05 15:11 被阅读0次

    概述

    • 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 实现

    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 实现

    • 在 XML 里面定义 Bean
    • org.springframework.beans.factory.config.BeanDefinition.java 的载入和解析
    • Bean 的实例化和依赖注入

    知识点

    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>")

    相关文章

      网友评论

          本文标题:Java Spring

          本文链接:https://www.haomeiwen.com/subject/cgtpvltx.html