咱们先从整体脉络上看下Spring有哪些模块,重要的概念有个直观印象。 从Spring框架的整体架构和组成对整体框架有个认知。
Spring框架基础概念
Spring基础 - Spring和Spring框架组成
上图是从官网4.2.x获取的原图,目前我们使用最广法的版本应该都是5.x,5版本移除了Web模块中的Portlet子模块,新增了WebFlux模块,同时新增了公共的JCl日志管理模块。
我们JVM专题模块,通过一张图大概了解Java是如何运行的,如何通过将我们编写的Java代码编译成JVM可以认识的字节码的如何实现跨平台运行的。
同样Spring咱们也来瞅瞅Spring是将我们编写的Xml、注解或者其他配置文件编程Spring可以管理的Bean的?
在正式进入Spring专题之前,咱们先熟悉一下相关概念
Spring框架是一个开源的Java平台,它提供了全面的基础设施支持,以便您可以更容易地开发Java应用程序。Spring处理了基础设施,这样您就可以专注于您的应用程序。以下是对Spring框架整体架构和组成的概述:
控制反转(IoC)和依赖注入(DI)
Spring 框架的核心是其控制反转(IoC)容器,该容器管理应用程序对象(称为 bean)的创建、配置和生命周期。依赖注入(DI)是一种实现 IoC 的设计模式,容器在运行时注入对象的依赖关系,减少组件之间的耦合,增强模块化。
Bean 配置
Spring 中的 Bean 可以使用 XML、注解或基于 Java 的配置进行配置。
下面是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">
<bean id="jmUser" class="org.springframework.dto.JmUser">
<property name="name" value="测试一" />
<property name="age" value="18" />
</bean>
</beans>
以下是使用注解的示例:
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
面向切面编程(AOP)
Spring 的 AOP 框架允许模块化处理日志记录、安全性和事务管理等关注点。切面使得横切关注点与主要业务逻辑分离。
定义切面
切面可以使用注解或 XML 定义。以下是使用注解的示例:
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Method Called: " + joinPoint.getSignature().getName());
}
}
Spring 模块
Spring MVC
Spring MVC 是一个用于构建 Web 应用程序的框架。它遵循模型-视图-控制器(MVC)设计模式,促进关注点的清晰分离。
控制器
Spring MVC 中的控制器负责处理用户请求并返回适当的响应。
@Controller
public class HomeController {
@GetMapping("/")
public String home(Model model) {
model.addAttribute("message", "Welcome to Spring MVC");
return "home";
}
}
视图
Spring MVC 中的视图可以使用 JSP、Thymeleaf 或 FreeMarker 等技术实现。以下是使用 Thymeleaf 的示例:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Home</title>
</head>
<body>
<h1 th:text="${message}">Welcome</h1>
</body>
</html>
Spring Data
Spring Data 简化了数据访问,提供了一致的编程模型来访问不同的数据存储。它包括用于关系数据库(Spring Data JPA)、NoSQL 数据库(Spring Data MongoDB)等的模块。
Spring Data 仓库抽象了数据访问层,减少了样板代码。以下是一个 JPA 仓库的示例:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByLastName(String lastName);
}
Spring Security
Spring Security 是一个功能强大且可定制的认证和访问控制框架。它为 Java 应用程序提供全面的安全服务。
安全配置
Spring 中的安全配置可以使用基于 Java 的配置进行定义:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/**").permitAll()
.and()
.formLogin();
}
}
Spring Boot
Spring Boot 通过提供约定优于配置和嵌入式服务器来简化 Spring 应用程序的开发。
创建 Spring Boot 应用程序
一个典型的 Spring Boot 应用程序可以用最少的配置创建:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Spring Cloud
Spring Cloud 提供构建分布式系统的工具,包括服务发现、断路器和配置管理。
Spring Cloud 通过其工具套件促进微服务的开发。以下是使用 Eureka 的服务注册示例:
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
1. 客户端
- IoT、Mobile、Browser:这些是访问微服务系统的不同客户端设备。它们通过 API Gateway 来访问系统中的微服务。
2. API Gateway
- API Gateway:API 网关是客户端与微服务之间的唯一入口。它负责请求路由、安全认证、负载均衡、监控和流量管理等功能。通过 API 网关,客户端可以统一地访问不同的微服务,而不需要直接与每个微服务进行交互。
3. 微服务
- Microservices:微服务是系统的核心业务逻辑,每个微服务都是一个独立的功能模块,负责特定的业务功能。微服务之间通过轻量级的通信协议(如 HTTP 或消息队列)进行交互。
4. 服务注册与发现
- Service Registry:服务注册中心用于管理微服务的注册和发现。每个微服务启动时,会将自己的地址和端口注册到服务注册中心。其他微服务通过查询服务注册中心来找到需要调用的微服务地址。常用的服务注册中心有 Eureka、Consul、Zookeeper 等。
5. 配置管理
- Config Server:配置服务器用于集中管理微服务的配置文件。微服务启动时会从配置服务器获取配置,这样可以确保所有微服务使用一致的配置,并且可以在不重启微服务的情况下动态更新配置。
6. 分布式跟踪
- Distributed Tracing:分布式追踪系统用于监控和分析微服务之间的调用链路,帮助开发和运维人员追踪请求的流转路径,识别性能瓶颈和故障点。常用的分布式追踪系统有 Zipkin、Jaeger 等。
小结
这张图展示了一个典型的基于 Spring Cloud 的微服务架构,包括了 API 网关、服务注册中心、配置服务器、分布式追踪和微服务模块。客户端通过 API 网关与系统交互,API 网关负责请求路由和安全管理;微服务通过服务注册中心实现动态的服务发现和调用;配置服务器集中管理微服务的配置;分布式追踪系统帮助监控和分析微服务的调用链路。
这种架构设计使得系统具有良好的扩展性和灵活性,能够支持大规模的分布式应用,并且易于管理和维护。
高级主题
事务管理
Spring 的事务管理框架抽象了事务管理的复杂性,允许声明式事务管理。
@Service
public class TransactionalService {
@Transactional
public void performTransaction() {
// 业务逻辑
}
}
使用 Spring 的消息传递
Spring Integration 和 Spring AMQP 提供了对消息传递的支持,使得开发消息驱动的应用程序成为可能。
Spring Integration 示例
@MessagingGateway
public interface MyGateway {
@Gateway(requestChannel = "inputChannel")
void sendToChannel(String data);
}
@Configuration
public class IntegrationConfig {
@Bean
public IntegrationFlow integrationFlow() {
return IntegrationFlows.from("inputChannel")
.handle(System.out::println)
.get();
}
}
总结
Spring 框架是企业级 Java 开发的一个多功能且全面的框架。通过理解其核心概念和模块,开发人员可以利用其强大的功能构建健壮、可扩展且易维护的应用程序。