Spring框架核心原理与微服务实战(建议收藏)
前言
在前两篇中,我们完成了Java基础与进阶知识的梳理。今天,我们正式进入企业级开发的核心——Spring全家桶。从IoC容器到AOP切面,从Spring Boot自动配置到Spring Cloud微服务治理,本文将带你构建完整的Spring知识体系。全文包含大量代码示例和实战场景,助你从“会用”走向“懂原理”。
一、Spring框架概述
Spring是一个轻量级的企业级应用开发框架,核心功能包括:
-
IoC(控制反转):将对象的创建、组装、管理权交给容器。
-
DI(依赖注入):容器动态地将依赖关系注入到组件中。
-
AOP(面向切面编程):将日志、事务、权限等横切关注点与业务逻辑分离。
Spring体系结构
Spring Framework ├── Core Container (Beans, Core, Context, SpEL) ├── AOP + Aspects ├── Data Access (JDBC, ORM, Transactions) ├── Web (Servlet, WebSocket, WebFlux) └── Test
二、IoC容器与Bean管理
1. IoC容器的实现
Spring提供了两种容器:
-
BeanFactory:基础容器,延迟加载。
-
ApplicationContext:功能更丰富(国际化、事件传播、AOP),立即加载。常用实现类:
-
ClassPathXmlApplicationContext(XML配置) -
AnnotationConfigApplicationContext(注解配置)
-
2. Bean的配置方式
XML方式(早期)
<bean id="userService" class="com.example.UserService">
<property name="userDao" ref="userDao"/>
</bean>
注解方式(推荐)
@Component // 通用注解
@Service // 业务层
@Repository // 数据访问层
@Controller // 控制层
public class UserService {
@Autowired // 按类型注入
private UserDao userDao;
@Resource(name = "userDao") // 按名称注入
private UserDao anotherDao;
}
Java配置类
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService(userDao());
}
@Bean
public UserDao userDao() {
return new UserDao();
}
}
3. Bean的生命周期
实例化 → 属性赋值 → 初始化前(BeanPostProcessor)→ 初始化(@PostConstruct或afterPropertiesSet)→ 初始化后 → 使用 → 销毁(@PreDestroy)。
4. Bean的作用域
-
singleton(默认):单例 -
prototype:每次获取都创建新实例 -
request/session/application(Web环境)
三、AOP核心原理与实战
1. 核心术语
-
切面(Aspect):横切关注点的模块化(如日志切面)。
-
连接点(JoinPoint):程序执行过程中的某个点(如方法调用)。
-
通知(Advice):切面在连接点执行的动作(前置、后置、环绕、异常、最终)。
-
切入点(Pointcut):匹配连接点的表达式(如
execution(* com.example..*.*(..)))。 -
织入(Weaving):将切面应用到目标对象的过程。
2. 基于注解的AOP示例
@Aspect
@Component
public class LogAspect {
// 定义切入点
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceMethod() {}
// 前置通知
@Before("serviceMethod()")
public void logBefore(JoinPoint jp) {
System.out.println("调用方法:" + jp.getSignature().getName());
}
// 环绕通知
@Around("serviceMethod()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
Object result = pjp.proceed();
long time = System.currentTimeMillis() - start;
System.out.println("耗时:" + time + "ms");
return result;
}
}
3. AOP底层原理
-
JDK动态代理:目标类实现接口时使用,生成实现相同接口的代理类。
-
CGLIB:目标类没有接口时使用,通过生成子类的方式(final类无法代理)。
四、Spring Boot:简化配置,快速开发
1. 核心特性
-
自动配置:根据classpath中的依赖自动注册Bean。
-
起步依赖:如
spring-boot-starter-web整合了Tomcat、Jackson等。 -
嵌入式服务器:Tomcat/Jetty/Undertow,无需部署WAR。
-
Actuator:监控应用健康、指标、日志等。
2. 快速入门
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello Spring Boot!";
}
}
3. 自动配置原理
-
@SpringBootApplication=@Configuration+@EnableAutoConfiguration+@ComponentScan -
@EnableAutoConfiguration通过spring.factories文件加载AutoConfiguration类。 -
条件注解(
@ConditionalOnClass、@ConditionalOnMissingBean)控制配置是否生效。
4. 配置文件
yml
# application.yml
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
5. 整合MyBatis
<!-- pom.xml -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User findById(Long id);
}
五、Spring Cloud微服务架构
1. 什么是微服务?
将单一应用拆分为一组小型独立服务,每个服务运行在自己的进程中,通过轻量级通信机制(HTTP/RESTful API)协作。
2. Spring Cloud核心组件(以Alibaba或Netflix为例)
| 组件 | 作用 | Spring Cloud Alibaba实现 |
|---|---|---|
| 服务注册与发现 | 服务实例动态注册与发现 | Nacos |
| 配置中心 | 集中管理配置 | Nacos Config |
| 服务调用 | 声明式HTTP客户端 | OpenFeign |
| 负载均衡 | 客户端负载均衡 | Spring Cloud LoadBalancer |
| 服务熔断降级 | 防止雪崩 | Sentinel |
| 网关 | 路由、过滤、鉴权 | Spring Cloud Gateway |
| 分布式事务 | 最终一致性 | Seata |
| 链路追踪 | 请求链路监控 | SkyWalking / Sleuth+Zipkin |
3. 实战:构建一个简单的微服务系统
步骤1:搭建Nacos注册中心
下载Nacos,执行startup.cmd -m standalone。
步骤2:服务提供者
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
@RestController
public class ProviderController {
@GetMapping("/echo/{msg}")
public String echo(@PathVariable String msg) {
return "Provider received: " + msg;
}
}
配置文件:
yml
spring:
application:
name: provider-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
server:
port: 8081
步骤3:服务消费者(使用OpenFeign)
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication { ... }
@FeignClient(name = "provider-service")
public interface ProviderFeign {
@GetMapping("/echo/{msg}")
String echo(@PathVariable("msg") String msg);
}
@RestController
public class ConsumerController {
@Autowired
private ProviderFeign providerFeign;
@GetMapping("/call/{msg}")
public String call(@PathVariable String msg) {
return providerFeign.echo(msg);
}
}
步骤4:网关路由(Spring Cloud Gateway)
yml
spring:
cloud:
gateway:
routes:
- id: provider_route
uri: lb://provider-service
predicates:
- Path=/api/provider/**
filters:
- StripPrefix=1
步骤5:服务熔断降级(Sentinel)
@SentinelResource(value = "echo", fallback = "echoFallback")
public String echo(String msg) {
return providerFeign.echo(msg);
}
public String echoFallback(String msg, Throwable ex) {
return "服务降级:" + ex.getMessage();
}
4. 分布式事务(Seata)简例
@GlobalTransactional
public void purchase(Long userId, Long productId, int quantity) {
// 1. 扣减库存(远程调用)
// 2. 创建订单(本地)
// 3. 扣减余额(远程调用)
}
六、Spring原理进阶
1. Bean的实例化过程(源码级)
-
读取配置(XML/注解/JavaConfig)→ BeanDefinition
-
BeanDefinitionRegistry注册
-
调用
AbstractApplicationContext.refresh()-
invokeBeanFactoryPostProcessors(处理BeanFactoryPostProcessor) -
registerBeanPostProcessors(注册BeanPostProcessor) -
finishBeanFactoryInitialization(实例化单例Bean)
-
-
创建Bean:
doCreateBean→ 实例化 → 填充属性 → 初始化
2. 循环依赖的解决
Spring通过三级缓存解决单例setter注入的循环依赖:
-
singletonObjects(一级缓存,完整Bean) -
earlySingletonObjects(二级缓存,早期Bean引用) -
singletonFactories(三级缓存,ObjectFactory)
构造器注入无法解决循环依赖,会抛出BeanCurrentlyInCreationException。
3. 事务管理
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
public void transferMoney(Long from, Long to, BigDecimal amount) {
// 业务代码
}
原理:通过AOP生成代理类,在方法前后开启/提交/回滚事务。
七、微服务架构设计要点
1. 服务拆分原则
-
单一职责:每个服务只关注一个业务领域。
-
高内聚低耦合:服务内部紧密协作,服务之间通过API通信。
-
数据库分离:每个服务拥有自己的数据库。
2. 分布式常见问题及解决方案
| 问题 | 解决方案 |
|---|---|
| 服务发现 | Nacos / Eureka |
| 配置动态刷新 | Nacos Config + @RefreshScope |
| 服务调用超时 | 设置Feign超时参数 + 重试机制 |
| 分布式追踪 | Sleuth + Zipkin |
| 日志聚合 | ELK(Elasticsearch+Logstash+Kibana) |
| 接口幂等性 | 唯一ID+Redis去重 / 数据库乐观锁 |
3. 容器化部署(Docker + K8s)
dockerfile
FROM openjdk:11-jre
COPY target/app.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
yml
# kubernetes deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-service
spec:
replicas: 3
template:
spec:
containers:
- name: app
image: my-registry/my-service:latest
ports:
- containerPort: 8080
八、性能优化与监控
1. Spring Boot应用调优
-
JVM参数:调整堆大小、GC类型。
-
内嵌Tomcat调优:
yml
server:
tomcat:
threads:
max: 200
min-spare: 10
accept-count: 100
max-connections: 10000
2. 监控工具
-
Spring Boot Actuator:
/actuator/health、/actuator/metrics -
Micrometer + Prometheus + Grafana:采集和可视化指标
-
Arthas:阿里巴巴开源的Java诊断工具,在线排查问题。
3. 常见性能瓶颈及排查
-
CPU飙升:top -Hp 找到线程,jstack分析。
-
内存泄漏:MAT分析堆dump,检查大对象、集合未释放等。
-
慢SQL:开启MyBatis SQL日志,使用阿里 druid监控。
结语:迈向架构师
Spring全家桶已成为Java企业级开发的事实标准。掌握其核心原理与微服务实践,不仅能帮助你写出更健壮的代码,更是迈向高级工程师、架构师的必经之路。
学习建议
-
阅读源码:从
SpringApplication.run()开始,理解Spring Boot启动流程。 -
手写简易IoC/AOP:加深对代理、反射、Bean生命周期的理解。
-
搭建微服务项目:使用Nacos+Feign+Gateway+Sentinel实现一个小型电商系统。
-
学习容器技术:Docker和Kubernetes是现代微服务部署的基础。
下期预告:MySQL性能优化与高可用架构实战。
如果本文对你有帮助,欢迎点赞、收藏、转发,让更多Java开发者受益!
更多推荐



所有评论(0)