likes
comments
collection
share

手摸手教你实现Spring(一)

作者站长头像
站长
· 阅读数 2

嘿,兄弟,你想一步一步的整明白Spring是咋回事不,作为知识的搬运工,雷哥就来手摸手的教你实现Spring,跟着我一定能够让你深刻的理解Spring原理,并实现一把造轮子的梦想。 咱么先来唠唠,Spring是个怎么个事。这个开篇只是大概的介绍一下Spring,如果了解Spring的可以跳过此篇。

Spring的设计初衷

Spring其实是为降低企业级应用开发的复杂性而设计的,它可以做很多事。但归根到底支撑Spring的仅仅是少许的基本理念,所有的这些基本理念都可以追溯到一个最根本的使命:简化开发。这是一个郑重的承诺,其实许多框架都声称在某些方面做了简化,而Spring则立志于全方位地简化Java开发。 对此,它主要采取了4个关键策略:

(1)基于POJO的轻量级和最小侵入性编程。

(2)通过依赖注入和面向接口实现松耦合。

(3)基于切面和惯性进行声明式编程。

(4)通过切面和模板减少样板式代码。

以上策略主要是通过面向Bean(BOP)、依赖注入(DI)及面向切面(AOP)这三种方式来实现的。

什么是BOP?

Spring框架以Bean为核心,这是Bean Oriented Programming(BOP)的核心理念。就像面向对象编程(OOP)中的Object一样,Bean在Spring中扮演着至关重要的角色。如果没有Bean,Spring框架将失去其存在的意义。Spring的IoC容器通过配置文件或注解来管理对象之间的依赖关系。控制反转(IoC)是这种编程范式的基本概念之一,其中依赖注入是最常见的实现方式。在这种编程方式中,我们不直接创建对象,而是描述对象的创建方式和它们之间的关系。我们在配置文件中指定哪些组件需要哪些服务,而容器负责将它们联系在一起。在典型的IoC场景中,容器负责创建所有对象并设置它们的属性,以便将它们连接在一起,并且决定何时调用它们的方法。

Spring的核心BeanFactory

Spring框架的核心设计位于org.springframework.beans包(其架构核心位于org.springframework.core包),旨在与JavaBean组件配合使用。通常,这个包不直接由用户使用,而是由服务器作为其他功能的底层中介。Spring的最高级抽象是BeanFactory接口,它是工厂模式的实现,允许按名称创建和检索对象,并管理它们之间的关系。

BeanFactory支持两种对象模型:

  1. 单例模型:提供具有特定名称的全局共享实例对象,可以在需要时检索。Singleton是默认和最常用的单例模型。
  2. 原型模型:确保每次检索都会创建独立的实例对象。原型模型适用于每个用户需要拥有自己的对象的情况。

BeanFactory(Bean工厂)是Spring作为IoC容器的基础,它将处理事务的责任从应用程序代码转移到框架中。

AOP编程

AOP(Aspect-Oriented Programming)是一种编程思想,允许程序员将横切关注点(如日志和事务管理)模块化,以便更好地处理多个类之间的共同行为。与IoC相辅相成,AOP以模块化的方式解决了企业应用程序开发中的复杂问题。在AOP中,通过切面将影响多个类的行为封装到可重用的模块中,这样的好处是Java类不需要了解日志服务的具体实现,使得代码更加灵活。Spring框架已经将AOP的功能完美地集成到了事务、日志和其他特性中。

AOP编程的常用场景有:Authentication(权限认证)、AutoCaching(自动缓存)、Error Handling (错误处理)、Debugging(调试)、Logging(日志)、Transaction(事务)等。

AOP和设备支持由spring-aop、spring-aspects和spring-instrument 3个模块组成。

spring-aop是Spring的另一个核心模块,是AOP主要的实现模块。作为继OOP后对程序员影响最大的编程思想之一,AOP极大地拓展了人们的编程思路。Spring以JVM的动态代理技术为基础,设计出了一系列的AOP横切实现,比如前置通知、返回通知、异常通知等。同时,Pointcut接口可以匹配切入点,可以使用现有的切入点来设计横切面,也可以扩展相关方法根据需求进行切入。 spring-aspects模块集成自AspectJ框架,主要是为Spring提供多种AOP实现方法。 spring-instrument模块是基于Java SE中的java.lang.instrument进行设计的,应该算AOP的一个支援模块,主要作用是在JVM启用时生成一个代理类,程序员通过代理类在运行时修改类的字节,从而改变一个类的功能,实现AOP。

核心容器

spring-beans和spring-core模块是Spring框架的核心模块,包含了控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)。BeanFactory使用控制反转对应用程序的配置和依赖性规范与实际的应用程序代码进行了分离。但BeanFactory实例化后并不会自动实例化Bean,只有当Bean被使用时,BeanFactory才会对该 Bean 进行实例化与依赖关系的装配。

spring-context模块构架于核心模块之上,扩展了BeanFactory,为它添加了Bean生命周期控制、框架事件体系及资源加载透明化等功能。此外,该模块还提供了许多企业级支持,如邮件访问、远程访问、任务调度等,ApplicationContext是该模块的核心接口,它的超类是BeanFactory。与BeanFactory不同,ApplicationContext实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于待用状态。