Spring这个框架相信国内百分之99的公司都在使用,今天我们就来聊一聊这个Spring框架。
为什么出现Spring?
如果我们没有Spring,我们的开发模式将会是怎么样的。
1、自己写一个类似的框架。
2、servlet + jsp。
那我们细想下,如果我们用上面的技术开发,我们需要操心什么事情。
1、数据库层面,我们需要手动写事务。
2、网络通信层面,我们需要自己写Socket通信。
3、日志层面,我们需要自己去给每一个点切入。
4、bean管理层面,bean的生成销毁都需要我们自己来关心。
5、就连测试都很难整合进去。
而Spring的出现,它帮我们把这些基础的东西全部做好了,我们拿上手就能够来使用,多么美妙不是。它的出现,真得给我们广大程序员带来了春天。
Spring简化开发四个基本策略
1、基于POJO的轻量级和最小侵入性编程。
2、通过依赖注入和面向接口松耦合。
3、基于切面和惯性进行声明式编程。
4、通过切面和模板减少样板式代码。
Spring编程思想
所以基于上面的四个基本策略,在java面向对象(OOP,Object Oriented Programming)的基础上,spring又出现了四大编程思想。
1、BOP(Bean Oriented Programming)
理解:原先基于java面向对象思想,所有东西都以对象形式来表现,导致对象new不停,spring觉得这样特别不爽。spring觉得应该可以找到一种东西来描述bean与bean之间的关系,不希望每次人为的重复管理,而是由程序来实现自动管理。所以才有了面向bean编程,BOP。
例子:
class Person{
Person(){};
}
MemeberService{
//原来的方式,人工方式
private Person person = new Person();
//不需要人工new和赋值,spring帮你完成
private Person person;
}
2、IOC(Inversion of Control)
有了上面BOP的思想以后,要进行实际操作就出现了IOC。
理解:控制反转,创建对象的控制权(new)反转。以前谁要用谁new,有了spring之后,所有的bean都由spring来new,所以才叫控制反转。然后,new出来以后的对象需要统一的管理起来,所以才有了IOC容器。(Map)
3、DI(Dependency Injection)
有了IOC容器之后,还得解决对象的赋值问题,所以就出现了思想DI,把手动赋值变成自动赋值。
理解:依赖注入,为了解决对象动态赋值的问题(对象被spring管理了,对象与对象之间的关系需要维持起来),动态调用get、set方法(通过反射)。
4、AOP(Aspect Oriented Programming)
当把对象管理起来以后,spring还想要查询这些对象,方法的流程和状态,就又出现了AOP。
理解: AOP是面向切面编程,也可以理解为是面向规则编程,它切面最大的特点就是功能增强、组合、解耦、制定规则。
所以,从它出现的需求可以看出,IOC和DI和AOP三者之间的关系是:
spring核心架构图
既然思想有了,那么就要开始落地,我们通过观察spring的核心架构图来看看spring是怎么落地实现的,这里我们基于Spring Framework 5 来分析。
1、Spring Core Container模块(核心容器模块)
spring-core:依赖注入IOC与DI的最基本实现。
spring-beans:Bean工厂与Bean的装配。
spring-context:定义基础的Spring的Context上下文即IOC容器。
spring-context-support:对Spring IOC容器的扩展支持,以及IOC子容器。
spring-contenx-indexer:Spring的类管理组件和Classpath扫描。
spring-expression:Spring表达式语言。
2、Spring AOP模块
spring-aop:面向切面编程的应用模块,整合了Asm,CGLib,JDKProxy。
spring-aspects:集成AspectJ。
spring-instrument:动态Class Loading模块。
3、Spring Data Access模块(数据访问与集成模块)
spring-jdbc:Spring提供的JDBC抽象框架的主要实现模块,用于简化Spring JDBC操作。
spring-tx:Spring JDBC事务控制实现模块。
spring-orm:主要集成Hibernate,Java Persistence API(JPA) 和Java Data Objects(JDO)。
spring-oxm:将Java对象映射成XML数据,或者将XML数据映射成Java对象。
spring-jms:Java Messaging Service能够发送和接收消息。
4、Spring-Web(Web组件)
spirng-web:提供了最基础的Web支持,主要建立于核心容器之上,通过Servlet或者Listeners来实现初始化IOC容器。
spring-webmvc:实现了Spring MVC的Web应用。
spring-websocket:主要是与Web前端的全双工通信的协议。
spring-webflux:一个新的非堵塞函数式Reactive Web框架,可以用来建立异步,非阻塞的事件驱动服务。
5、Spring-message(通信报文)
spring-messaging:从Spring4开始新加入的一个模块,主要职责是为Spring框架集成一些基础的报文传送应用。
6、Spring-test(集成测试)
spring-test:主要为测试提供支持。
7、Spring集成兼容
spring-framework-bom:Bill of Materials,解决Spring的不同模块依赖版本不同问题。
spring各模块之间的依赖关系,如图: