Spring 实战
Spring 实战第6版的核心知识点整理。Spring 的核心目标是简化 Java 开发。
四大核心策略
| 策略 | 说明 |
|---|---|
| POJO 编程 | 不依赖入侵式 API,使用普通 Java 对象 |
| 依赖注入 | 由外部容器组装对象关系 |
| 面向切面编程 | 分离横切关注点 |
| 模板减少样板代码 | 如 JdbcTemplate 减少 JDBC 样板代码 |
Bean 生命周期
1. 读取配置元数据
2. 实例化 Bean
3. 注入依赖
4. Aware 接口回调
5. BeanPostProcessor 前置处理
6. 初始化方法
7. BeanPostProcessor 后置处理
8. Bean 就绪
9. Spring 关闭 → 销毁方法提示
单例 vs Prototype Spring 只管理单例 Bean 的完整生命周期。Prototype Bean 创建后交由使用者管理。
初始化顺序
BeanPostProcessor.postProcessBeforeInitialization → @PostConstruct → InitializingBean.afterPropertiesSet → 自定义 init-method → BeanPostProcessor.postProcessAfterInitialization
生命周期回调方式
注解方式:
@Component
public class AnnotationBean {
@PostConstruct
public void start() { }
@PreDestroy
public void destroy() { }
}接口方式:
@Service
public class SpringLifeCycleService implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() { }
@Override
public void destroy() { }
}Java Config 方式:
@Bean(initMethod = "start", destroyMethod = "destroy")
public SpringLifeCycle create() {
return new SpringLifeCycle();
}Aware 接口:
@Component
public class SpringLifeCycleAware implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) { }
}BeanPostProcessor:
@Component
public class SpringLifeCycleProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
return bean;
}
}依赖注入
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| 强制依赖 | 构造器注入 | 缺失会导致编译失败 |
| 可选依赖 | Setter 注入 | 使用 @Autowired(required=false) |
提示
最佳实践 优先使用构造器注入保证强制依赖,可选依赖通过 setter 处理。
Spring 全景图
各模块核心
Spring Boot
| 特性 | 说明 |
|---|---|
| 自动配置 | 根据依赖自动配置 Bean |
| Starters | 简化依赖管理 |
| Actuator | 生产就绪监控 |
自动配置通过 @SpringBootApplication(组合 @EnableAutoConfiguration + @ComponentScan)实现。
Spring Data
支持关系型(JPA/JDBC)、文档型(MongoDB)、键值(Redis)、图(Neo4j)、搜索(Elasticsearch)。
public interface TacoRepository extends JpaRepository<Taco, Long> {
List<Taco> findByName(String name); // 方法名派生查询
}Spring Security
| 功能 | 说明 |
|---|---|
| 认证 | 验证用户身份 |
| 授权 | 控制用户权限 |
| 攻击防护 | CSRF、XSS、点击劫持 |
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated()
).formLogin(Customizer.withDefaults());
return http.build();
}Spring Integration
| 概念 | 说明 |
|---|---|
| Message | 消息载体 |
| Channel | 消息通道 |
| Endpoint | 消息处理器 |
| Filter/Router/Transformer | 过滤、路由、转换 |
与 Spring Batch 的区别:Integration 处理实时消息,Batch 处理大规模数据。
Spring Batch
| 组件 | 说明 |
|---|---|
| Job | 批处理作业 |
| Step | 作业步骤 |
| ItemReader/Processor/Writer | 读取、处理、写入 |
Spring Cloud
| 问题 | 解决方案 |
|---|---|
| 服务发现 | Eureka、Nacos |
| 配置管理 | Config Server、Nacos |
| 熔断降级 | Hystrix、Resilience4j |
| API 网关 | Gateway、Zuul |
| 链路追踪 | Sleuth、Zipkin |
Spring Native
使用 GraalVM 编译为原生镜像,启动时间从秒级降至毫秒级,内存占用显著降低。限制:反射需额外配置,动态类加载受限。