Spring框架:基础入门

发布时间:2024年01月18日

目录

一、引言

1. Spring框架的起源和发展历程

2. Spring框架的重要性和应用场景

二. Spring框架的核心模块

1. Inversion of Control(IoC)容器

1.1 IoC的概念和优势

1.2 ApplicationContext和BeanFactory的区别

2. 依赖注入(Dependency Injection)

2.1 依赖注入的原理和实现方式

2.2 @Autowired和@Resource注解的使用

3. 切面(AOP)编程

3.1 AOP的基本概念

3.2 切面、通知、切点的关系

4. 数据访问模块

4.1 JDBC和ORM支持

4.2 使用Spring的事务管理

三、Spring进阶特性

1 Spring MVC框架

1.1 Spring MVC工作流程分析

1.2?Spring MVC项目实例开发教程

四、 Spring Boot与Spring Cloud微服务架构

1. Spring Boot简介与快速入门

1.1 Spring Boot简介

1.2 快速入门

2?Spring Boot的核心特性与优势

3. Spring Cloud在微服务架构中的角色及其主要组件介绍

3.1 微服务架构概述

3.2 Spring Cloud的角色

3.3 主要组件介绍


一、引言

当我们谈论现今的软件开发环境时,无法避免提及Java和其相关的各种技术。在Java的生态系统中,Spring框架作为一个顶级的开源项目,已经成为了Java开发的标准之一。无论是在企业级应用,还是在Web开发中,Spring都展现出了其无可替代的地位。

1. Spring框架的起源和发展历程

Spring框架是一个开源的Java框架,由Rod Johnson于2002年首次发布。它的起源可以追溯到对Java企业应用开发的一系列挑战和不足的解决方案。在当时,Java企业应用的开发面临着复杂性、耦合性和难以测试等问题。

Spring的起源可以追溯到2003年,当时Martin Odersky在将Java的原型(Prototype)模式应用到Spring框架中,从而创造出了第一个版本的Spring。随着时间的推移,Spring逐渐发展壮大,不仅包含了基本的JavaBean容器功能,还扩展出了如AOP(面向切面编程)、JDBC(Java Database Connectivity)、JMS(Java Message Service)等一系列的功能模块。

2. Spring框架的重要性和应用场景

Spring框架的重要性在于它为Java应用程序提供了一种简单、灵活且功能强大的开发方式。它使得开发者能够专注于业务逻辑的开发,而无需关心底层繁琐的技术细节。Spring的应用场景广泛,从简单的Web应用到复杂的企业级应用,从单体应用到微服务架构,Spring都能够提供相应的解决方案。?
Spring框架的重要性体现在以下几个方面:

简化Java开发:Spring通过提供一套综合的解决方案,简化了Java企业应用的开发过程,降低了开发的复杂性。

IoC和依赖注入:IoC容器和依赖注入机制使得对象之间的关系更加松散,提高了代码的可测试性和可维护性。

AOP编程:AOP允许将横切关注点(如日志、事务管理)从业务逻辑中分离出来,提高了代码的模块化程度。
Spring框架在多个应用场景中得到广泛应用:

企业级应用开发:Spring为企业级应用提供全面的解决方案,包括事务管理、安全性、数据访问等。

微服务架构:Spring Boot简化了微服务架构的开发和部署,提供了快速搭建和扩展的能力。

Web应用开发:Spring MVC框架支持基于模型-视图-控制器的Web应用开发,提供了灵活的配置和可扩展性。

数据访问:Spring框架对多种数据访问技术的支持,包括JDBC、Hibernate、MyBatis等,使得数据访问更加便捷。

测试:Spring的模块化设计和依赖注入机制使得单元测试和集成测试更容易实现。

在接下来的文章中,我们将深入探讨Spring框架的核心概念、模块和如何有效利用,帮助读者更好地理解和应用这一强大的Java框架。

二. Spring框架的核心模块

1. Inversion of Control(IoC)容器

1.1 IoC的概念和优势

IoC的概念

IoC(Inversion of Control)是一种软件设计思想,它反转了传统的程序设计流程,由框架来控制程序的执行流程。在Spring中,IoC体现为由Spring容器负责管理对象的生命周期和控制对象之间的关系。

IoC的优势

- 降低耦合性:IoC通过解耦对象之间的依赖关系,降低了组件之间的耦合性,使系统更加灵活和可维护。

- 更易测试:IoC容器负责对象的创建和注入,便于使用测试框架进行单元测试,提高代码的可测试性。

- 模块化开发:IoC容器将应用程序拆分为一组独立的模块,每个模块负责一个特定的功能,使得开发更具模块化。

1.2 ApplicationContext和BeanFactory的区别

BeanFactory

- 懒加载:BeanFactory在启动时不会实例化所有的Bean,只有在第一次请求时才会创建对象。
??
- 轻量级:相对于ApplicationContext,BeanFactory更加轻量级,适用于资源受限的环境。

ApplicationContext
- 预加载:ApplicationContext在启动时会预先实例化所有的Bean,提高了系统的响应速度。

- 更多功能:ApplicationContext是BeanFactory的扩展,提供了更多的功能,如国际化、事件传播、AOP等。

2. 依赖注入(Dependency Injection)

2.1 依赖注入的原理和实现方式

?依赖注入原理
依赖注入是将对象的依赖关系由容器在运行时注入到对象中,而不是在对象内部硬编码。这样,对象更加松散耦合,易于维护和测试。

?实现方式
- 构造器注入:?通过构造方法注入依赖。
- 属性注入:?通过setter方法注入依赖。
- 方法注入:?通过方法注入依赖。

2.2 @Autowired和@Resource注解的使用

@Autowired注解
- `@Autowired`注解可以用于构造方法、属性和方法上,用于自动注入依赖。
- 可以配合`@Qualifier`使用,指定具体的依赖注入来源。

@Service
public class MyService {

? ? private final MyRepository myRepository;

? ? @Autowired
? ? public MyService(MyRepository myRepository) {
? ? ? ? this.myRepository = myRepository;
? ? }
}

@Resource注解
- `@Resource`注解用于字段、setter方法和方法参数上,通过名称进行依赖注入。
- 可以指定name属性,明确指定注入的Bean名称。

@Service
public class MyService {

? ? @Resource(name = "myRepository")
? ? private MyRepository myRepository;
}

通过深入了解IoC容器和依赖注入,开发者可以更好地理解Spring框架的核心思想,并能够利用IoC容器和依赖注入机制来构建灵活、可维护的应用。在实际开发中,选择合适的注解和实现方式是确保依赖注入正确实施的关键。

3. 切面(AOP)编程

3.1 AOP的基本概念

?AOP的定义
AOP(Aspect-Oriented Programming)是一种编程范式,它通过在程序中插入特定的代码片段(切面),实现对横切关注点的模块化管理,减少代码的重复性。

切面(Aspect)
切面是定义横切关注点和与之相关的行为的模块。它由切点和通知组成。

切点(Pointcut)
切点定义了在程序中哪些地方应该应用切面。它是一个表达式,描述了要拦截的连接点。

通知(Advice)
通知定义了在切点处执行的操作。它包括"前置通知"、"后置通知"、"环绕通知"等,对应于切点前、切点后、切点前后的执行。

3.2 切面、通知、切点的关系

切面定义

@Aspect
@Component
public class LoggingAspect {

? ? @Before("execution(* com.example.service.*.*(..))")
? ? public void beforeMethodExecution(JoinPoint joinPoint) {
? ? ? ? // 前置通知:在方法执行前执行的操作
? ? ? ? // 可以获取方法参数、目标对象等信息
? ? }

? ? @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")
? ? public void afterMethodExecution(JoinPoint joinPoint, Object result) {
? ? ? ? // 后置通知:在方法正常执行后执行的操作
? ? ? ? // 可以获取方法返回值、目标对象等信息
? ? }
}

切点定义

@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceMethods() {
? ? // 定义切点,用于重用
}

应用切面

@Service
public class MyService {

? ? @Autowired
? ? private MyRepository myRepository;

? ? @Transactional
? ? public void performTransactionalOperation(User user) {
? ? ? ? // 执行业务逻辑
? ? ? ? myRepository.save(user);
? ? }
}

在上述例子中,`LoggingAspect`是一个切面,定义了在`MyService`中的所有方法执行前后的操作。通过`@Before`和`@AfterReturning`等注解,指定了切点和通知。

4. 数据访问模块

4.1 JDBC和ORM支持

JDBC支持
- JDBC模板的使用:Spring提供了`JdbcTemplate`,简化了JDBC的操作,处理了资源的打开和关闭。?
- 数据源配置:配置数据源,使用连接池提高数据库访问性能。

@Repository
public class MyRepository {

? ? @Autowired
? ? private JdbcTemplate jdbcTemplate;

? ? public void save(User user) {
? ? ? ? // 使用JdbcTemplate执行SQL操作
? ? ? ? jdbcTemplate.update("INSERT INTO users(name, age) VALUES (?, ?)", user.getName(), user.getAge());
? ? }
}

ORM支持
- 整合Hibernate和MyBatis:Spring与多种ORM框架集成,简化数据访问操作。
- 配置实体映射和关联关系:通过注解或XML配置,定义实体和数据库表之间的映射关系。

4.2 使用Spring的事务管理

事务的基本概念和特性

事务是一组操作单元,要么全部成功执行,要么全部失败回滚。事务的四个基本特性(ACID)包括:

- 原子性(Atomicity):事务是一个不可分割的工作单位,要么全部完成,要么全部失败。
??
- 一致性(Consistency):事务执行后,系统从一个一致的状态转变到另一个一致的状态。

- 隔离性(Isolation):多个事务并发执行时,每个事务是相互隔离的,一个事务的执行不应影响其他事务。

- 持久性(Durability):事务一旦提交,其结果应该是永久性的,对系统的影响是持久的。

Spring事务管理

Spring提供两种事务管理的方式:

- 声明式事务管理:基于注解或XML配置,通过在方法上添加`@Transactional`注解或配置事务属性来声明事务。

- 编程式事务管理:通过编写代码显式地控制事务的开始、提交或回滚。

`@Transactional`注解的使用

`@Transactional`注解是声明式事务管理的关键。通过在方法或类上添加该注解,可以指定事务的属性,例如传播行为、隔离级别、超时等。

@Service
public class TransactionalService {

? ? @Autowired
? ? private UserRepository userRepository;

? ? @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, timeout = 30)
? ? public void performTransactionalOperation(User user) {
? ? ? ? // Transactional operation
? ? ? ? userRepository.save(user);
? ? }
}

在上述例子中,`performTransactionalOperation`方法被声明为一个事务,指定了事务的传播行为、隔离级别、读写性质和超时时间。

事务传播行为和隔离级别配置

- 传播行为(Propagation):定义了事务方法被嵌套调用时,事务之间的关系,如`REQUIRED`、`REQUIRES_NEW`等。

- 隔离级别(Isolation):定义了事务之间的隔离程度,如`READ_COMMITTED`、`SERIALIZABLE`等。

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public void performTransactionalOperation(User user) {
? ? // Transactional operation
? ? userRepository.save(user);
}

通过深入理解声明式事务管理,开发者可以通过简单的注解或配置来管理事务,提高代码的简洁性和可维护性。在实际应用中,选择合适的传播行为和隔离级别是保障事务正确执行的关键。

三、Spring进阶特性

1 Spring MVC框架

1.1 Spring MVC工作流程分析

核心组件

  • DispatcherServlet:? 前置控制器,负责调度其他组件的执行,可以降低不同组件之间的耦合性,是整个Spring MVC的核心模块
  • Handler:? ?处理器,完成具体的业务逻辑,相当于Servlet
  • HandlerMapping:DispatcherServlet是通过 HandlerMapping把请求映射到不同的Handler
  • HandlerInterceptor:处理器拦截器,是一个接口,如果我们需要进行一些拦截处理,可以通过实现该接口完成
  • HandlerExecutionChain:处理器执行链,包括两部分内容:Handler和HandlerInterceptor(系统会有一个默认的HandlerInterceptor,如果有额外拦截处理,可以添加拦截器进行设置)
  • HandlerAdapter:处理器适配器,Handler执行业务方法之前,需要进行一系列的操作包括表单的数据验证、数据类型转换、把表单数据封装到POJO等,这些一系列的操作都是由HandlerAdapter完成,DispatcherServlet通过HandlerAdapter执行不同的Handler
  • ModelAndView:封装了模型数据和视图信息,作为Handler的处理结果,返回给DispatcherServlet
  • ViewResolver:视图解析器,DispatcherServlet通过它把逻辑视图解析为物理视图,最终把渲染的结果响应给客户端

工作流程

  1. 客户端请求被DispatcherServlet接收
  2. 根据HandlerMapping映射到Handler
  3. 生成Handler和HandlerInterceptor
  4. Handler和HandlerInterceptor以HandlerExecutionChain的形式一并返回给DispatcherServlet
  5. DispatcherServlet通过HandlerAdapter调用Handler的方法完成业务逻辑处理
  6. 返回一个ModelAndView对象给DispatcherServlet
  7. DispatcherServlet把获取的ModelAndView对象传给ViewResolver视图解析器,把逻辑视图解析成物理视图
  8. ViewResolver返回一个View进行视图渲染(把模型填充到视图中)
  9. DispatcherServlet把渲染后的视图响应给客户端

1.2?Spring MVC项目实例开发教程

配置DispatcherServlet
在web.xml中配置DispatcherServlet。

<servlet>
? ? <servlet-name>dispatcherServlet</servlet-name>
? ? <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
? ? <init-param>
? ? ? ? <param-name>contextConfigLocation</param-name>
? ? ? ? <param-value>/WEB-INF/spring-mvc.xml</param-value>
? ? </init-param>
? ? <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
? ? <servlet-name>dispatcherServlet</servlet-name>
? ? <url-pattern>/</url-pattern>
</servlet-mapping>

配置Controller
编写Controller处理请求。

@Controller
@RequestMapping("/example")
public class ExampleController {

? ? @GetMapping("/hello")
? ? public String hello(Model model) {
? ? ? ? model.addAttribute("message", "Hello, Spring MVC!");
? ? ? ? return "helloPage";
? ? }
}

配置ViewResolver
配置InternalResourceViewResolver,指定JSP页面位置。

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
? ? <property name="prefix" value="/WEB-INF/views/" />
? ? <property name="suffix" value=".jsp" />
</bean>

编写JSP页面
在`/WEB-INF/views/`目录下编写JSP页面。

<!-- helloPage.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
? ? <title>Hello Page</title>
</head>
<body>
? ? <h2>${message}</h2>
</body>
</html>

四、 Spring Boot与Spring Cloud微服务架构

1. Spring Boot简介与快速入门

1.1 Spring Boot简介

Spring Boot是一个快速开发的框架,它旨在简化创建独立运行的Spring应用程序。Spring Boot使用了特定的方式来创建和配置应用程序,使得开发者可以快速地构建和部署应用。Spring Boot提供了一种新的方式来创建独立的Spring应用,通过这种方式,开发者可以更快速地创建有生产级别的应用。Spring Boot是Spring家族中的一个项目,旨在简化Spring应用的创建、开发和部署。它通过提供默认配置、约定大于配置的原则,使得开发者能够更快速地构建Spring应用。

1.2 快速入门

? - 创建项目:通过Spring Initializr在线工具或IDE插件(如STS、IntelliJ IDEA)快速生成包含所需依赖的Spring Boot项目结构。
? ?- 配置启动类:定义一个带有@SpringBootApplication注解的主类,用于引导应用程序的启动。
? ?- 开发Controller和Service与Mapper:编写业务逻辑代码,利用Spring Boot提供的starter模块来实现诸如数据库访问、安全认证等功能。
? ?- 运行与测试:无需部署WAR文件到外部服务器,只需通过main方法直接启动Java应用即可。

2?Spring Boot的核心特性与优势

  • ?开箱即用:大量预配置的starter依赖,简化Maven/Gradle构建配置,减少样板代码。
  • 嵌入式容器:内嵌Servlet容器,使应用成为可独立运行的JAR文件,方便部署和运维。
  • 易于集成:集成了众多第三方库和中间件,简化了例如数据库、消息队列、缓存等组件的集成。
  • 自动配置:Spring Boot通过自动配置,根据项目中的依赖和配置,自动完成应用的配置,减少了开发者的手动配置工作。
  • 生产就绪:Spring Boot提供了诸多功能,如性能监控、健康检查、远程管理等,使得应用更容易在生产环境中部署和管理。

Spring Boot的核心特性包括自动配置、内省以及独立运行。自动配置是Spring Boot最重要的特性,它使得开发者不必手动配置大量的配置就能创建出可用的应用。内省是另一个重要特性,它提供了对正在运行的应用的实时查看和调试。独立运行是指Spring Boot应用可以独立运行,不需要额外的Tomcat或类似服务器即可运行。

Spring Boot的优势在于它简化了Spring应用的创建和部署,降低了开发难度,提高了开发效率。此外,Spring Boot还提供了丰富的内置特性和易于集成的工具,使得开发者可以快速构建高质量的Spring应用。

3. Spring Cloud在微服务架构中的角色及其主要组件介绍

3.1 微服务架构概述

微服务架构是一种分布式系统的架构风格,将一个大型的系统划分为一组小而独立的服务,每个服务运行在独立的进程中,通过API进行通信。建立在Spring Boot的基础上,为开发云原生应用提供了全套解决方案,特别针对微服务架构设计。

  • 独立性: 每个微服务是独立的单元,可以独立部署和扩展。

  • 灵活性: 不同的团队可以独立开发和部署各自的微服务,提高开发速度和灵活性。

  • 可维护性: 小型团队更容易理解和维护小型服务,降低系统的复杂性。

3.2 Spring Cloud的角色

Spring Cloud是用于构建微服务架构的一组工具和框架,它在Spring Boot的基础上提供了一系列的组件,用于解决微服务架构中的一些共性问题,如服务注册与发现、配置中心、负载均衡等。

3.3 主要组件介绍

  • 服务注册与发现:Eureka或Consul作为服务注册中心,允许服务实例注册自己的地址,并能被其他服务动态发现。
  • 服务间调用: Ribbon 或 Feign 提供客户端负载均衡和服务调用机制,Hystrix提供熔断器,防止服务雪崩效应。
  • 配置中心:Config Server集中化管理各个微服务的配置,使用Git或Vault存储配置信息,支持版本管理和环境隔离。
  • ?API网关:Zuul或Spring Cloud Gateway作为API入口,进行路由转发、过滤请求、限流控制等功能。
  • ? ?服务跟踪:Sleuth配合Zipkin或Jaeger实现分布式系统中链路追踪和性能分析。
  • ? ?消息总线:Spring Cloud Bus用于实现微服务间的事件驱动通信,常用于刷新配置等场景。?

以上组件共同构成了Spring Cloud的核心,通过它们,开发者可以更轻松地构建和管理微服务架构。

通过深入了解Spring Boot和Spring Cloud,开发者可以更好地构建和管理微服务架构的应用。Spring Boot的简化配置和快速开发特性使得构建微服务应用更加高效,而Spring Cloud提供的组件则解决了微服务架构中的一些共性问题,提供了一套完整的解决方案。在实际应用中,合理使用Spring Boot和Spring Cloud可以提高开发效率和系统可维护性。

文章来源:https://blog.csdn.net/qq_35763697/article/details/135660497
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。