学 Java 的路上不得不学 Spring,不学直接用 Spring Boot 是可以,开箱即用,但是很难学懂,可能只是会用,不能知其然而知其所以然。
面试会问的啊!工作会用的啊!所以需要学嘛!OK!
Spring 这个词,指的是什么?
Spring 这个术语在不同的上下文中有不同的含义。它可以用来指代 Spring Framework 项目本身,这是梦开始的地方。
后来随着时间的推移,其他基于 Spring Framework 构建的项目也相继出现。当人们说 Spring 时,通常指整个项目家族。不过,在本系列中,我们就只指代它本身,即 Spring Framework 本身。
Spring Framework 被分为多个模块,应用程序可以选择需要哪些模块。核心容器模块包括配置模型和依赖注入机制等内容。除此之外,Spring Framework 还为不同类型应用架构提供了基础支持,包括消息传递、事务数据和持久化以及 Web 开发等领域,并且同时提供了基于 Servlet 的 Spring MVC Web 框架和并行运行的 Spring WebFlux 响应式 Web 框架。
Spring 的模块
spring-web 模块提供了基本的 Web 功能。它包含处理 MultipartFile 上传、使用 Servlet 监听器进行初始化 IoC 容器的功能。该模块还包含与Web相关的部分,如 HTTP 客户端和 Spring 远程支持,以便与其他Web服务进行通信。
spring-webmvc 模块(也称为Web-Servlet模块)是 Spring 框架中用于构建 Web 应用程序的重要模块。它实现了 Model-View-Controller(MVC)架构和 RESTful Web 服务。使用 Spring MVC,我们可以将业务逻辑代码和 Web 表单清晰地分离,实现更好的代码组织和可维护性。该模块与 Spring 的其他功能无缝集成,使我们能够轻松地使用依赖注入、事务管理等功能来构建灵活和可扩展的Web应用程序。
Test
spring-test 模块支持使用 JUnit 或 TestNG 对 Spring 组件进行单元测试和集成测试,它提供了一致的 Spring ApplicationContext 加载和缓存机制,并提供了 Mock 对象,便于我们进行测试。
Spring 的历史
Spring 框架于 2003 年诞生,是对早期 J2EE 规范复杂性的回应。虽然有些人认为 Java EE 和 Spring 存在竞争关系,但实际上,Spring 与 Java EE 相辅相成。Spring 编程模型并不包含 Java EE 平台规范;相反,它集成了来自 EE 大伞下精心挑选的个别规范:
Servlet API(JSR 340)
WebSocket API(JSR 356)
Concurrency Utilities(JSR 236)
JSON Binding API(JSR 367)
Bean Validation(JSR 303)
JPA(JSR 338)
JMS (JSR914),以及必要时用于事务协调的 JTA/JCA 设置。
Spring 框架还支持依赖注入(JSR330)和常见注解(JSR250)规范,我们开发人员可以选择使用这些规范而非由 Spring 框架提供的特定机制。
从 Spring Framework 5.0 开始,Spring 要求 Java EE 7 级别(例如 Servlet 3.1+,JPA 2.1+)作为最低要求,同时在运行时提供与 Java EE 8 级别的新API(例如 Servlet 4.0、JSON Binding API)的开箱即用集成。这使得 Spring 完全兼容 Tomcat 8 和 9、WebSphere 9 以及 JBoss EAP 7 等服务器。
随着时间推移,在应用程序开发中 Java EE 的角色也在不断演变。在 Java EE 和 Spring 的早期,应用程序是为部署到应用服务器而创建的。如今,在 Spring Boot 的帮助下,应用程序以 devops 和云友好的方式创建,Servlet 容器被嵌入其中并且易于更改。从 Spring Framework5 开始,WebFlux 应用程序甚至不直接使用 Servlet API,并且可以运行在非 Servlet 容器(例如 Netty )上。
Spring 继续创新和发展。除了 Spring Framework 之外,还有其他项目,例如 Spring Boot、Spring Security、Spring Data、Spring Cloud、Spring Batch 等等。
Spring 设计理念
当你学习一个框架时,了解它所做的事情以及遵循的原则同样重要。以下是 Spring Framework 的指导原则:
你创建一个 Employee 对象,就必须自己再去创建一个 Department 对象(因为 Employee 对象依赖于 Department 对象),并将 Department 对象给关联到 Employee 对象上。是吧。现在,我相信屏幕前的你已经懂了所谓的手动创建和管理对象之间的依赖关系了。
使用 Spring 的时候
当你使用 Spring 的时候,就完全不需要这么做。依然是这个例子,现在我使用 Spring 来操作,对象的管理就交给 Spring 处理,来看看我怎么写的:
@Configuration
public class AppConfig {
@Bean
public Department department() {
return new Department(1, "Just do IT");
}
@Bean
public Employee employee() {
return new Employee(1, "god23bin", department());
}
}
复制代码
我写了一个 AppConfig 类,在类上使用了一个 @Configuration 注解,表示这是一个配置类。
接着,写了两个方法,分别返回了一个员工对象和一个部门对象,而且在方法上使用了一个 @Bean 注解,表示这个方法返回的对象是交给 Spring IoC 进行管理的。
这两个对象都是通过调用构造方法来创建的,其中 Department 对象则被注入到了 Employee 对象中。(注入,你就理解成 setXxx 方法)
在最上面进行介绍的时候,有一个概念,就是「容器」,这个容器人们也习惯称「Ioc 容器」,实际上就是 Spring 用来存放与管理应用程序中所有交给它的对象的。
现在在这个容器中,就有 Department 对象和 Employee 对象。
我们的业务依旧是打印员工的部门信息,此刻,我们只需要从「容器」中获取我们需要的对象就可以了,直接获取员工对象,不用手动自己 new 一个员工对象,也不需要自己 new 一个部门对象了。
我们通过 AnnotationConfigApplicationContext 来加载配置类 AppConfig,然后通过 getBean 方法来获取 Employee 对象,此过程 Spring 完成了依赖注入的效果,Employee 对象是具有 Department 对象的。
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
不过,实际上,我们在真正的项目中,并不会这样去使用,即不会去手动写 context.getBean() 等这些代码,而是直接通过依赖注入的方式,这个后面再写咯。现在知道是怎么回事就 OK 啦! 当然,由于篇幅有限,可能目前你还没能理解这样做有什么好处,可能会有各种疑惑,没关系,慢慢学习下去就会迎刃而解了。
其他的管理
在没有 Spring 时,我们需要在代码中手动处理一些与业务逻辑无关的问题,比如连接池和事务管理等。而有了 Spring 之后,这些问题都可以通过 Spring 的 API 和组件来解决,从而使代码更加简洁易读。
总结
Spring 是一个很牛的、开源的 Java 框架,实现了 IoC(Inversion of Control,控制反转)和 AOP(Aspect Oriented Programming,面向切面编程)等功能。
Spring 的核心特点包括便于开发、便于测试、便于集成和便于部署,啥都方便。
Spring 框架的出现简化了 Java EE(Enterprise Edition)开发的过程。在没有使用 Spring 的情况下,开发 Java EE 应用程序需要手动创建和管理对象之间的依赖关系,而使用 Spring 可以通过配置和注解来实现对象的自动管理和依赖注入。Spring 还提供了许多其他模块和功能,如数据访问/集成、Web 开发支持、AOP、工具等,使开发人员可以更加便捷地开发企业级应用程序。
总之,学习 Spring 可以帮助我们更好地理解和应用现代企业级 Java 开发的基本概念和最佳实践,提高开发效率和代码质量。
参考