前言

        在前两篇中,我们完成了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的实例化过程(源码级)

  1. 读取配置(XML/注解/JavaConfig)→ BeanDefinition

  2. BeanDefinitionRegistry注册

  3. 调用AbstractApplicationContext.refresh()

    • invokeBeanFactoryPostProcessors(处理BeanFactoryPostProcessor)

    • registerBeanPostProcessors(注册BeanPostProcessor)

    • finishBeanFactoryInitialization(实例化单例Bean)

  4. 创建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企业级开发的事实标准。掌握其核心原理与微服务实践,不仅能帮助你写出更健壮的代码,更是迈向高级工程师、架构师的必经之路。

学习建议

  1. 阅读源码:从SpringApplication.run()开始,理解Spring Boot启动流程。

  2. 手写简易IoC/AOP:加深对代理、反射、Bean生命周期的理解。

  3. 搭建微服务项目:使用Nacos+Feign+Gateway+Sentinel实现一个小型电商系统。

  4. 学习容器技术:Docker和Kubernetes是现代微服务部署的基础。

下期预告:MySQL性能优化与高可用架构实战。
如果本文对你有帮助,欢迎点赞、收藏、转发,让更多Java开发者受益!

更多推荐