Spring全家桶:原理思想


Spring 常用注解: https://blog.csdn.net/xyc1211/article/details/119318980

Spring Core

IOC原理

  • 思想

把所有对象都当做Bean, 放在一个容器里管理
通过配置 Bean 及 Bean 之间的依赖关系,
然后利用 Java 语言的反射功能实例化 Bean 并建立 Bean 之间的依赖关系。

  • 原理

Spring 启动时读取应用程序提供的 Bean 配置信息,并在 Spring 容器中生成一份相应的 Bean 配
置注册表 BeanDefinitionRegistry ,然后根据这张注册表实例化 Bean,装配好 Bean 之间的依赖关系,为上层应用提供准
备就绪的运行环境。其中 Bean 缓存池为 HashMap 实现

bean

Spring Bean 生命周期

在这里插入图片描述

  1. Bean 容器找到配置文件中 Spring Bean 的定义
  2. Bean 容器利用 Java Reflection API 创建一个Bean的实例
  3. 如果涉及到一些属性值 利用 set()方法设置一些属性值
  4. *.Aware接口实现方法调用, 让bean能够感知获取到自己的一些属性
    1. 如果 Bean 实现了 BeanNameAware 接口,调用 setBeanName()方法,传入Bean的名字。Bean就能获取自己的名字
    2. 如果 Bean 实现了 BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法,传入 ClassLoader对象的实例。Bean就能获取自己的ClassLoader对象实例
    3. … …如果实现了其他 *.Aware接口,就调用相应的方法。
  5. 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessBeforeInitialization() 方法
  6. 如果Bean实现了InitializingBean接口,执行afterPropertiesSet()方法。
  7. 如果 Bean 在配置文件中的定义包含 init-method 属性,执行指定的方法。
  8. 如果有和加载这个 Bean的 Spring 容器相关的 BeanPostProcessor 对象,执行postProcessAfterInitialization() 方法
  9. 当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接口,执行 destroy() 方法。
  10. 当要销毁 Bean 的时候,如果 Bean 在配置文件中的定义包含 destroy-method 属性,执行指定的方法。

bean配置源

  1. 在XMl中进行显示配置在这里插入图片描述
  2. 在Java中进行显示配置
  3. 隐式的bean发现机制和自动装配
    1. *组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean。
    2. *自动装配(autowiring):Spring自动满足bean之间的依赖。

注册管理Bean : BeanFactory

bean容器的基本接口, 注册管理所有Bean的一个工厂

  • BeanFactory
    • ListableBeanFactory
    • HierarchicalBeanFactor
    • ConfigurableBeanFactory
    • AutowireCapableBeanFactory

BeanFactory继承关系

  • ApplicationContext 面向开发

    • ApplicationContext常用实现类:
      1. ClassPathXmlApplicationContext
        从类路径下的xml配置文件中加载 bean配置
      2. FileSystemXmlApplicationContext
        从系统盘符中的xml配置文件中加载 bean配置
      3. AnnotationConfigApplicationContext
        从java的配置类中的java注解加载 bean配置
      4. AnnotationConfigWebApplicationContext
        从java的配置类中的java注解加载 bean配置,专门为web应用准备的
      5. XmlWebApplicationContext
        从web应用下的xml配置文件加载 bean配置
  • WebApplicationContext 面向Web开发
    从相对于 Web 根目录的路径中装载配置文件完成初始化, 可以获得ServletContext 的引用

ApplicationContext

实例化Bean: FactoryBean
  • 默认实现方式
    通过反射机制,利用<bean>的class属性指定实现类实例化Bean

  • 问题
    在某些情况下实例化Bean过程比较复杂,如果按照传统的方式,则需要在中提供大量的配置信息。配置方式的灵活性是受限的

  • 解决方案
    采用编码的方式可能会得到一个简单的方案。

Spring为此提供了一个org.springframework.bean.factory.FactoryBean的工厂类接口,

可以通过实现该接口定制实例化Bean的逻辑。

FactoryBean接口对于Spring框架来说占用重要的地位,

Spring自身就提供了70多个FactoryBean的实现

Spring Bean 作用域

  1. singleton(单例)
    唯一 bean 实例,bean 默认都是单例的。多线程下不安全
    • bean线程安全常见的有两种解决办法:
      1. 在Bean对象中尽量避免定义可变的成员变量(不太现实)。
      2. 在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐的一种方式)。
  2. prototype(原型)
    每次请求都会创建一个新的 bean 实例。
  3. request(http)
    一次 Http 请求中,容器会返回该 Bean 的同一实例
  4. session (http)
    在一次 Http Session 中,容器会返回该 Bean 的同一实例
  5. global session(http)
    在一个全局的 Http Session 中,容器会返回该 Bean 的同一个实例。
    基于portlet的web应用中才有意义, Spring5取消

DI 依赖注入

都是通过 方法 或 属性反射 注入

  1. 构造器方法 支持注解+xml
  2. setter方法 支持注解+xml
  3. 静态工厂方法 只支持xml
  4. 实例工厂方法 只支持xml,需要首先new工厂类
  • 自动装配
    1. byName
    2. byType
    3. 构造函数自动装配(与byType非常相似)

循环依赖问题

https://blog.csdn.net/hollis_chuang/article/details/114504849
https://blog.csdn.net/a745233700/article/details/110914620

  • 三种循环依赖
    第一种情况:自己依赖自己的直接依赖
    第二种情况:两个对象之间的直接依赖
    第三种情况:多个对象之间的间接依赖

  • 五种循环依赖场景
    在这里插入图片描述

bean获取原理过程

在这里插入图片描述

getBean
实例化
注入属性
初始化完成
bean仓库
解决思路:先实例化双方(不注入),再相互注入依赖,最后初始化

只有 单例对象 通过setter循环依赖 的场景, 可以通过 三级缓存 解决
构造器循环依赖 创建实例时就要注入【不能解决】
多实例循环依赖 没有用缓存,每次都会生成一个新对象【不能解决】
dependsOn的实例 如果有循环依赖则抛异常【不能解决】

  • 单例, setter依赖
@Service
public class TestService1 {
    @Autowired
    private TestService2 testService2;
    public void test1() {
    }
}

@Service
public class TestService2 {
    @Autowired
    private TestService1 testService1;
    public void test2() {
    }
}
bean仓库 三级缓存:

相互依赖只要二级缓存就能解决
因为bean处理器 还包含AOP处理器,初始化后 还要创建proxy代理对象 所以需要三级缓存

  1. singletonObjects 一级缓存,保存初始化完成 的bean实例
  2. earlySingletonObjects 二级缓存,保存 实例化完成 的bean实例
  3. singletonFactories 三级缓存,保存 bean创建工厂
    在这里插入图片描述

Spring APO 原理

JDKProxy 和 Cglib代理
在这里插入图片描述

JDKProxy

只能代理 实现了接口的类

Cglib

可以代理 未实现任何接口的类


Spring MVC 原理

WEB服务器把 客户端Http 请求全转给 控制器 DispatcherServlet
DispatcherServlet 根据请求寻找处理器 Controller
Controller处理后返回ModelAndView给客户端

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
完整全套资源下载地址:https://download.csdn.net/download/qq_27595745/70761177 【完整课程列表】 完整版Java web开发教程PPT课件 Java开发进阶教程 第01章 JavaScript简介以及基本语法(共15页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第02章 Dom模型,控制客户端元素(共15页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第03章 表单验证,常用函数(共15页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第04章 自定义web服务器(共14页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第06章 SERVLET(共15页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第07章 JSP语法及运行过程(共13页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第08章 JSP内置对象(共22页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第09章 jstl、el、java bean(共18页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第11章 AJAX实现(共11页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第12章 自定义mvc框架(共11页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第13章 spring ioc aop(共18页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第14章 spring mvc介绍,原理以及搭建(共15页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第15章 spring mvc核心对象拦截器(共26页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第17章 自定义orm框架(共11页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第18章 mybatis框架的搭建以及应用(共13页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第19章 mybatis高级应用(共21页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第20章 数据库连接池,缓存(共15页).pptx 完整版Java web开发教程PPT课件 Java开发进阶教程 第22章 常用框架的介绍以及环境搭建(共16页).pptx JS课程案例ebookHTML\网上书店需求文档.doc

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xyc1211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值