1.了解Spring框架
1.什么是Spring框架?
Spring是一个轻量级的控制反转(IoC)和面向切面的容器框架。
关键词概念解释:
- 1.轻量级:从大小和开销两方面来说,Spring都是轻量级的,完整的Spring框架可以在只有一个1MB多的jar文件中发布,并且Spring是非侵入式的,也就是说Spring应用中的对象并不依赖于Spring的特定类
- 2.控制反转:Spring通过控制反转(IoC)降低了耦合,IoC能够让一个对象依赖的其他对象通过被动的方式传递过来,而不是这个对象自己进行创建或者寻找其他依赖对象
- 3.面向切面:允许通过分离应用的业务逻辑与系统级的服务进行内聚式的开发,应用对象只实现它们应该做的。并不负责其他的比如日志和事务的支持
- 4.容器:Spring包含并且管理应用对象的配置和生命周期,在这个意义上它是一种容器,用户可以通过配置自己的每一个Bean,用户的Bean可以创建一个单独的实例或者每次都需要生成一个新的实例,以及他们之间是如何相互关联的
- 5.框架:Spring可以将简单的组件配置、组合成复杂的应用。在Spring中,应用对象被声明式得组合
2.Spring框架有什么优点?
- 降低代码的耦合度
- 提供了依赖注入(DI)和控制反转(IoC)的功能,使得对象的创建和组装更加灵活和可配置。
- 支持面向切面编程(AOP),可以通过切面进行代码的横切关注点的处理,提高了代码的模块化和可维护性。
- 提供了一套完整的企业级开发解决方案,包括数据访问、事务管理、MVC框架等,简化了开发流程。
- 整合了各种常用的开源技术和第三方库,如Hibernate、MyBatis、JPA、Redis等,方便开发者进行集成和使用。
- 提供了强大的异常处理机制,可以通过统一的异常处理方式进行全局的异常处理和错误信息的处理。
2.了解Spring的体系结构
Spring的功能模块被分割成了20个模块中,这些模块分布在核心的容器、数据访问集成、Web、AOP、植入、消息传输和测试,如下图所示
编辑
下面介绍其中的模块与功能
1.核心容器
Spring的核心容器是由其他模块建立的,由Spring-core、Spring-beans、Spring-context、Spring-context-support、Spring-expression 等。
模块 | 功能 |
Spring-core | 提供Spring框架的核心基础,包括依赖注入机制、Bean生命周期管理和资源加载等。 |
Spring-beans | 定义、创建、管理和解析Bean对象,支持配置文件和注解方式进行配置和实例化。 |
Spring-context | 扩展了Spring-beans模块,提供事务管理、面向切面编程、事件处理、国际化等高级功能,管理应用程序上下文。 |
Spring-context-support | 辅助模块,提供与特定环境的集成支持,如Java EE、缓存和任务调度等。 |
Spring-expression | 提供强大的表达式语言,用于动态处理和访问对象的属性,支持统一的表达式语法。 |
2.AOP(面对切面编程) 和 Instrumentation(植入)
Spring框架中AOP和Instrumentation相关的模块有Spring--aop模块、Spring-aspect模块、以及Spring-instrument模块
模块 | 功能 |
Spring-aop | 提供面向切面编程(AOP)的支持,允许将横切关注点从业务逻辑中分离出来。它通过代理模式和动态代理技术实现,可以在运行时对方法进行拦截和增强,实现例如日志记录、性能监控等功能。 |
Spring-aspect | 扩展了Spring-aop模块,提供了基于注解的切面编程的支持。使用Spring-aspect模块,开发人员可以通过注解方式来定义切面,并实现相应的拦截和增强逻辑。 |
Spring-instrument | 提供了与Java Instrumentation API的集成支持,用于在运行时修改字节码或者进行类加载的控制。它可以用于实现一些高级的AOP功能,如基于字节码的切面编程、动态类加载等。 |
3.消息
Spring4.0后框架中增加了消息Spring-messaging模块
模块 | 功能 |
Spring-messaging | 提供了基于消息的通信模型的支持,用于构建异步、松耦合的应用程序。它包含了一些核心接口和类,如Message、MessageHandler等,以及消息代理、消息队列和消息转换器等功能。 |
4.数据访问/集成
数据访问/集成由JDBC、ORM、OXM、JMS和事务模块组成
模块 | 功能 |
Spring-jdbc | 提供了对JDBC(Java数据库连接)的支持,简化了与关系型数据库的交互。它提供了一组简单、一致的API,用于执行SQL操作、处理事务以及管理连接池等功能。 |
Spring-tx | 提供了对事务的支持,简化了在Spring应用程序中使用事务的配置和管理。它包括声明式事务的支持,通过注解或XML配置来定义事务边界,以及编程式事务的支持,通过编程方式控制事务的开始、提交和回滚等操作。 |
Spring-orm | 提供了对对象关系映射(ORM)的支持,简化了将Java对象与关系数据库之间进行映射的工作。它支持各种ORM框架(如Hibernate、MyBatis等),提供了一组统一的API,用于定义对象映射、执行查询、插入、更新和删除等操作,以及处理事务和缓存等功能。 |
Spring-oxm | 提供了对对象-XML映射(OXM)的支持,方便Java对象与XML文档之间的转换。它支持各种XML处理库(如JAXB、Castor等),提供了一组统一的API,用于对象到XML的序列化和反序列化,以及处理XML文档的校验、转换和映射等功能。 |
Spring-jms | 提供了对Java消息服务(JMS)的支持,简化了在Spring应用程序中使用消息传递的配置和开发。它包括发送和接收消息、定义消息监听器以及与消息代理的集成等功能。通过Spring-jms,可以实现与消息队列的通信和异步消息处理。 |
5.Web
Web层由Spring-web、Spring-webmvc、Spring-websocket和Portlet模块组成
模块 | 功能 |
Spring-web | 提供了基本的Web支持,包括与Servlet容器的集成、Web应用上下文的配置以及处理Web请求和相应等功能。它提供了一组通用的Web工具类和辅助方法,用于处理URL解析、文件上传、Cookie、Session等操作。 |
Spring-webmvc | 提供了基于MVC(Model-View-Controller)的Web框架,用于构建灵活和可扩展的Web应用程序。它包括控制器、视图解析器、数据绑定、验证、消息转换和异常处理等功能,使开发者能够更轻松地实现业务逻辑与页面展示的分离。 |
Spring-websocket | 提供了对WebSocket协议的支持,用于构建实时的Web应用程序。它包括WebSocket会话管理、消息处理和广播等功能,允许客户端和服务器之间进行全双工的通信。WebSocket可以实现实时推送、聊天应用、股票行情等场景。 |
Portlet | 提供了对JSR-286 Portlet规范的支持,用于构建基于Portlet容器的Web应用程序。它提供了一组与Portlet规范对应的类和接口,简化了在Portlet环境下开发Web应用程序的工作。开发者可以通过Portlet模块将Spring的特性应用于Portlet应用。 |
6.测试
测试由Spring-test模块组成
Spring-test功能:
- 提供了用于创建和配置Spring应用程序上下文的工具类和注解,如@ContextConfiguration和ApplicationContextInitializer等,方便在测试中加载Spring配置文件或配置类。
- 提供了用于模拟和控制外部依赖的工具类和注解,如@MockBean和@SpyBean等,用于创建模拟对象或代理对象,以便在测试中进行依赖注入和模拟方法调用。
- 提供了用于执行HTTP请求和验证响应的工具类和注解,如@AutoConfigureMockMvc和MockMvc等,方便测试Web层的请求和响应。
- 提供了用于执行数据库操作和管理事务的工具类和注解,如@DirtiesContext和TransactionalTestExecutionListener等,用于在测试中管理数据库事务和数据准备。
- 提供了用于编写和运行集成测试的工具类和注解,如@SpringBootTest和@TestPropertySource等,方便进行完整的应用程序集成测试。
3.认识Spring家族
在Spring的官网中可以看到Spring中有许多的成员模块,而这些模块组合起来就构成了整个Spring框架
编辑
下面就介绍一下Spring的家族成员
Spring家族成员 | 相关作用 |
Spring Framework | 提供了依赖注入(DI)、面向切面编程(AOP)、数据访问、事务管理、Web开发等功能 |
Spring Boot | 基于Spring Framework的快速应用程序开发框架,简化了Spring应用程序的搭建和配置 |
Spring Data | 提供了与不同数据存储技术集成的模块,简化了数据访问层的开发 |
Spring Security | 提供了身份验证、授权、密码加密等功能,用于保护应用程序的安全性 |
Spring Cloud | 用于构建分布式系统和微服务架构的工具集合 |
Spring Integration | 用于构建企业级集成解决方案的框架,支持与外部系统交互、消息传递、数据转换等功能 |
Spring Batch | 用于处理大规模批量作业的框架,适用于数据清洗、ETL处理等场景 |
Spring WebFlux | 基于反应式流和非阻塞IO的Web开发框架,提供了更高的吞吐量和可扩展性 |
Spring Mobile | 用于开发移动应用程序的工具集合,支持设备适配、移动网络处理和推送通知等功能 |
4.实现第一个Spring入门程序
条件:Tomcat服务器、Maven构建工具、
Tomcat服务器下载:
通过Idea部署Tomcat服务器(细图文教学)_idea tomcat 自动部署_Alphamilk的博客-CSDN博客
Maven构建工具下载:
Maven构建工具下载与配置(图文详细)_Alphamilk的博客-CSDN博客
需要准备四个基本包(core、beans、context、expression)和common-logging包
设置依赖
</dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> </dependencies>
创建一个UsrDao接口
package org.example; public interface UsrDao { public void show(); }
创建实现类
package org.example; import org.springframework.stereotype.Repository; @Repository("usrDao") public class UsrDaoImp implements UsrDao{ @Override public void show() { System.out.println("UsrDao showing"); } }
创建UsrService接口
package org.example; public interface UsrService { public void show(); }
创建UsrService实现接口
package org.example; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service("usrService") public class UsrServiceImp implements UsrService { @Resource(name = "usrDao") private UsrDao usrDao; @Override public void show() { this.usrDao.show(); System.out.println("UserService Now"); } }
在当前目录下创建beans.xml配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" xmlns:context="http://www.springframework.org/schema/context" > <context:component-scan base-package="org.example" /> <bean id="usrDao" class="org.example.UsrDaoImp" /> </beans>
最后做一个测试类
package org.example; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { String xmlPath = "org.example/beans.xml"; ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath); UsrService usrService = (UsrService) applicationContext.getBean("usrService"); usrService.show(); } }