目录
简介
是什么让java世界变得更好,程序员变得更友爱,秃头率变得不是那么的高,让程序员不必再每天996,有时间找个女朋友?
是Spring。
是什么让企业级java应用变得简单易懂,降低了java程序员的进入门槛,导致了现在遍地都是java程序员的窘境?
是Spring。
是什么从无冕之王变成了事实上的企业标准,让规则制定者也要颤抖几分?
是Spring。
简单的说,Spring满足了你们对于java程序的所有想象。是个java程序员都会投入Spring的怀抱。
今天这篇文件就是对Spring基础的总结。文末附有小彩蛋,欢迎大家向后拉!
Spring基础
Spring是在2003年,作为对之前的复杂的J2EE规范而产生的。有些人认为Spring和J2EE是竞争关系,实际上他们是互补的。
Spring最新版本是5.3.0, 通过使用Spring,我们可以很方便的创建企业级应用程序。同时Spring还提供了对groovy和Kotlin的支持。在Spring5.1之后,需要JDK8以上才能正确运行。
更多内容请访问www.flydean.com
狭义的Spring指的是Spring基础,如下图所示的Spring Framework Runntime:
广义的Spring是指整个Spring家族,包括Spring Boot,Spring Cloud等等项目。
这里我们探讨的是狭义上的Spring Framework。它可以分为下面几个模块:
- Core - Core是Spring得以运行的核心,主要包括IoC Container, Events, Resources, i18n, Validation, Data Binding, Type Conversion, SpEL, AOP等内容。
- Testing - 测试是Spring中非常重要的一个模块,主要包括Mock Objects, TestContext Framework, Spring MVC Test, WebTestClient等内容。
- Data Access - 这一部分是对数据库的访问相关,包括Transactions, DAO Support, JDBC, O/R Mapping, XML Marshalling等内容。
- Web Servlet - 传统的对Web Servlet的支持,包括Spring MVC, WebSocket, SockJS, STOMP Messaging等内容。
- Web Reactive - 这是Spring5新增的对于响应式系统的支持,包括Spring WebFlux, WebClient, WebSocket等。
- Integration - 是对第三方系统的支持,包括Remoting, JMS, JCA, JMX, Email, Tasks, Scheduling, Caching等常用的第三方系统。
- Languages - 最后是对其他JVM语言的支持,包括Kotlin, Groovy等动态语言。
Spring Framework被分成了很多个模块,我们在构建应用程序的时候可以自由选择使用哪个模块。最核心的模块是核心容器:包括配置模块和依赖注入机制。除此之外,Spring Framework提供了对不同应用架构的基础支持,包括消息,交易数据,存储和网站。他还包括了Servlet-based Spring MVC web framework和最新的响应式Spring WebFlux
reactive web framework。
Core核心技术
Spring的核心技术是Spring中最为重要的内容,而Core中最最中的就是Spring框架的反转控制(IOC)容器。
通过在Spring中使用面向方面编程(AOP)技术,IOC在Spring中得到了全面的应用。并且Spring搭建了自己的AOP框架,同时Spring还提供了对第三方AOP框架AspectJ的集成,从而满足不同需求的用户的使用。
IOC也称为依赖注入(DI)。它是指对象仅通过构造函数参数、工厂方法的参数或从工厂方法构造或返回对象实例后,通过在其上设置的属性来定义其依赖项(即与之一起工作的其他对象)的过程。当容器在创建bean时将会注入这些依赖项。
这个过程跟bean自己控制实例化,或者通过直接构造类或服务定位器模式来定位其依赖项的方式相反(因此称为控制反转)。
Bean在Spring中就是一个业务组件,我们通过创建各种Bean来完成最终的业务逻辑功能。
在容器内部,每个bean的定义可以被表示为BeanDefinition,通过BeanDefinition可以获得bean的很多信息包括:包名,bean的作用域,生命周期,bean的引用和依赖等。
- Spring5参考指南:Bean的创建
- Spring5参考指南:Bean作用域
- Spring5参考指南:Bean的生命周期管理
- Spring5参考指南:容器扩展
- Spring5参考指南:基于注解的容器配置
- Spring5参考指南:组件扫描
- Spring5参考指南:JSR 330标准注解
从最开始的面向过程编程,到后面的面向对象编程,程序的编写方式发生了重大的变化,面向对象编程将业务逻辑封装成一个一个的对象,所有的操作都转换为对对象的操作。
面向对象编程现在使用的非常普遍,一般来说只要是高级语言都支持,但是它也有缺点,比如如果我们想做一些横跨对象的操作(如统计各个对象里面某个方法的执行时间),这时候面向对象可以能力有不逮。我们可能需要在每个对象里面都添加一些统计时间的代码,那么有没有更好的方法来处理这个问题呢?
面向方面编程(AOP)通过提供对程序结构的另一种思考方式来补充面向对象编程(OOP)。OOP中模块化的关键单元是类,而AOP中模块化的单元是方面。方面支持跨多个类型和对象的关注点(如事务管理)的模块化。(在AOP文献中,这种关注通常被称为“横切”关注。)
- Spring5参考指南:SpringAOP简介
- Spring5参考指南:AspectJ注解
- Spring5参考指南:基于Schema的AOP
- Spring5参考指南:AOP代理
- Spring5参考指南:AspectJ高级编程之Configurable
通常来说一个Bean包含一个默认的无参构造函数,和属性的get,set方法。
org.springframework.beans 包里面有个很重要的类叫做BeanWrapper接口和他的实现BeanWrapperImpl,BeanWrapper提供了设置和获取属性值(单个或批量)、获取属性描述符和查询属性的功能,以确定它们是可读的还是可写的。
此外,BeanWrapper还支持嵌套属性,允许将子属性的属性设置为无限深度。
BeanWrapper还支持添加标准JavaBeans属性PropertyChangeListeners和VetoableChangeListeners,而不需要在目标类中支持代码。最后,BeanWrapper提供了对设置索引属性的支持。BeanWrapper通常不直接由应用程序代码使用,而是由DataBinder和BeanFactory使用。
Spring提供了很方便的事件的处理机制,包括事件类ApplicationEvent和事件监听类ApplicationListener。 他实现的是设计者模式,如果实现了ApplicationListener接口的bean部署到Spring容器中,则每次ApplicationEvent发布到ApplicationContext时,都会通知该bean。
SpEL的全称叫做Spring Expression Language。通常是为了在XML或者注解里面方便求值用的,通过编写#{ }这样的格式,即可使用。
Spring定义了Resource接口用来对资源的访问,一般来说资源有两种形式,一种是URL的形式从外部链接加载,一种是File的形式从系统本身查找。
Testing测试
Spring团队提倡测试驱动开发(TDD)。 Spring团队发现正确使用控制反转(IoC)肯定会使单元测试和集成测试更容易(因为类的setter方法和适当的构造函数的存在使得它们更容易在测试中连接在一起而不必设置服务定位器注册表和类似结构)。
例子待续...
Data Access
通过Spring可以方便的进行事物管理,并且为各种数据访问技术(例如JDBC,Hibernate或JPA)提供了一致性的DAO接口,从而可以轻松地在上述持久性技术之间进行切换,不需要考虑对各种数据访问技术的适配问题。
例子待续...
Web Servlet
Spring提供了Spring MVC框架来实现对web的支持,与其他许多Web框架一样,Spring MVC围绕前端控制器模式进行设计,在该模式下,中央Servlet DispatcherServlet提供了用于请求处理的共享算法,而实际工作是由可配置的委托组件执行的。 该模型非常灵活,并支持多种工作流程。
与任何Servlet一样,都需要根据Servlet规范使用Java配置或在web.xml中声明和映射DispatcherServlet。 反过来,DispatcherServlet使用Spring配置发现请求映射,视图解析,异常处理等所需的委托组件。
Web Reactive
除了对于传统的Web Servlet的支持以外,Spring还引入了WebFlux框架和响应式WebClient,实现了对reactive系统的支持。
WebFlux框架是非阻塞的,需要在并在Netty,Undertow和Servlet 3.1+容器等服务器上运行。
例子待续...