Java学习篇(六)——Spring框架底层为什么是这样的?

摘要:由于博主时间已经所剩无几,这样匆忙的学习实属无奈之举,有时间的朋友还是分开学习两个项目会更好,两个项目放在了资料一和二。但行其路,莫问前程。 基础 Spring是一个家族,可以做Web开发,微服务开发,分布式开发。对应的Spring的技术包
由于博主时间已经所剩无几,这样匆忙的学习实属无奈之举,有时间的朋友还是分开学习两个项目会更好,两个项目放在了资料一和二。但行其路,莫问前程。 基础 Spring是一个家族,可以做Web开发,微服务开发,分布式开发。对应的Spring的技术包括:Spring Cloud,Spring Web等。其它所有技术都是在Spring Framework上发展的,Spring Boot用来简化开发。Spring 5.x架构图如下所示: Spring容器和Android的Application很相似,Application管理Activity、Fragment和Service,而Spring容器则是管理Controllor(准确来说是Bean);Activity在响应用户的点击,Controllor在响应客户端的连接;Activity的数据来源是Room和ViewModel,Controllor的数据来源是Service和Repository层 ;Activity显示UI并且处理用户操作,Controller则处理用户请求。 因为Android是一个UI应用框架,Activity 是整个用户界面和交互的中心,所以它成为生命周期的主体。 而在Spring中,Spring 是一个 IoC+AOP 框架,它的核心工作是创建、管理和销毁对象。 Core Container Spring 容器本质就是一个 Java 对象,运行在 JVM 的堆内存中,和你写的普通对象一样,区别在于:它负责管理其他 Bean 对象,具体实现类就是ApplicationContext或BeanFactory。 Spring Core Container 是 Spring 的核心部分,提供了最基础的功能,比如对象的创建、管理、配置与依赖注入(DI)。 JavaGuide对它的介绍是这样的: ● spring-core:Spring 框架基本的核心工具类。 ● spring-beans:提供对 bean 的创建、配置和管理等功能的支持。 ● spring-context:提供对国际化、事件传播、资源加载等功能的支持。 ● spring-expression:提供对表达式语言(Spring Expression Language) SpEL 的支持,只依赖于 core 模块,不依赖于其他模块,可以单独使用。 Core模块提供的BeanFactory是最基础的IoC容器接口,只支持最基本的Bean创建与依赖注入。Context 模块提供的ApplicationContext是BeanFactory的子接口,功能更强大,还提供了国际化、事件发布机制、Bean 自动装配、注解支持与 Spring AOP、事务管理等集成更方便,所以实际开发中我们常说的Spring 容器,几乎都是指ApplicationContext。 一个项目会有几个容器?一个容器里同一个Bean类只会有一个实例吗? 在上面xml配置中,bookService 和 userService 注入的是同一个 dataSource 实例,bookService和userService里面的 dataSource 指向同一块堆内存 。Spring 默认情况下,每个 都是单例模式,一个名字只对应一个实例,想要同一个类的不同实例,可以使用不同的名字。 多个实例注入同一个对象,并且同时修改怎么办? 如果该 Bean 是无状态,只提供纯业务逻辑或者线程安全的服务,通常不会有问题。如果 Bean 有状态(成员变量)且被多个对象并发修改,可能出现线程安全问题和数据污染。尽量在设计时就不要在单例 Bean 中存储会被修改的共享状态,把状态放到方法参数或局部变量中,保证线程安全。或者使用ThreadLocal或使用同步机制确保线程安全。或者使用: @Component @Scope("prototype") public class SharedService { // 每次注入都是新实例 } 这样每一次注入的都是新的实例。 IoC 控制反转 全称是Inversion of Control,控制反转,将对象的构建与管理控制权给了容器。我们不需要再手动的new一个对象,只需要声明对象,再给对象一个setter方法,IoC容器就会自动将对象注入。这样做有一个很直观的好处,多个类之间可以实现对象的共享,我们只需要一个对象实例,就可以在不同的类里使用。 什么是注入依赖? 一个对象要使用另一个对象就是依赖,注入依赖是Spring容器可以自动的将对象的依赖实例化然后传给对象。注入依赖可以有两种方式实现:1. .xml文件配置。 2. 注释。
阅读全文