一、Spring家族宇宙:原来你是这样的框架(青铜段位)
1.1 Spring的"前世今生":从泡面到满汉全席
- 2002年的泡面哲学:Rod Johnson在厨房煮泡面时突然顿悟:"Java开发为什么不能像泡面一样简单?"
- Spring的三大人生信条:
public class SpringPhilosophy { // 信条1:别让我写XML(后来真香了) void hateXMLButLoveAnnotation() {} // 信条2:对象关系要像乐高积木 @Bean // 这个注解是后来的真香产物 DataSource dataSource() { return new DruidDataSource(); } // 信条3:测试要像吃巧克力般丝滑 @Test void testShouldBeFun() { assertThat(1+1).isEqualTo(2); // 真香警告! } }
1.2 框架界的瑞士军刀:Spring全家桶图鉴
- Spring Boot:自动配置就像智能马桶圈(用过就回不去)
- Spring Cloud:微服务界的复仇者联盟
- Spring Security:代码世界的钢铁侠盔甲
- Spring Data:数据库操作的魔法扫帚
1.3 新手村生存指南:五分钟极速入门
@SpringBootApplication // 武林秘籍总纲注解
public class Apprentice {
public static void main(String[] args) {
SpringApplication.run(Apprentice.class, args); // 启动代码世界的时光机
}
@RestController // 这个注解能让你的类变成会说话的机器人
class HelloController {
@GetMapping("/hello") // 给浏览器开的传送门
String hello() {
return "恭喜你获得【青铜】勋章!";
}
}
}
二、IoC容器:你的私人对象管家(白银段位)
2.1 XML配置:老司机的祖传秘方
<bean id="userService" class="com.example.UserService">
<!-- 依赖注入就像拼乐高 -->
<property name="userDao" ref="userDao"/>
</bean>
2.2 注解驱动:00后程序员的时尚穿搭
@Service // 这个标签值年薪30万
public class UserService {
@Autowired // 自动装配就像点外卖
private UserDao userDao;
}
2.3 Java Config:西装暴徒的配置艺术
@Configuration // 这是本武功秘籍
public class AppConfig {
@Bean // 造物主模式启动
public DataSource dataSource() {
// 此处省略100行配置
}
}
三、AOP编程:代码世界的影分身之术(黄金段位)
@Aspect // 分身术秘籍
@Component
public class LoggingAspect {
@Around("execution(* com.example..*.*(..))") // 画个圈圈诅咒你
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("开始施法:" + joinPoint.getSignature());
Object result = joinPoint.proceed();
System.out.println("法术完成,耗时:" + (System.currentTimeMillis() - start));
return result;
}
}
四、Spring Boot:自动配置的黑科技(铂金段位)
4.1 自动配置的"读心术"原理
- 依赖雷达系统:就像智能马桶能自动加热座圈,Spring Boot通过
spring.factories
扫描所有jar包的配置清单 - 条件注解三件套:
@ConditionalOnClass(DataSource.class) // 检测到数据库驱动才启动 @ConditionalOnMissingBean // 用户没自定义时补位 @ConditionalOnProperty("db.enabled") // 配置文件开关控制
- 自动配置彩蛋:在IDEA中双击Shift搜索
*AutoConfiguration
,能看到所有隐藏配置类
4.2 自定义Starter实战
// 手写智能空调starter
@Configuration
@AutoConfigureAfter(TemperatureAutoConfiguration.class)
public class AirConditionerAutoConfig {
@Bean
@ConditionalOnMissingBean
public AirConditioner myAC(Environment env) {
int temp = env.getProperty("ac.temp", Integer.class, 26);
return new GreeAirConditioner(temp); // 默认使用格力空调
}
}
// 在resources/META-INF中创建spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.AirConditionerAutoConfig
4.3 配置覆盖的"千层套路"
- 优先级金字塔:命令行参数 > 系统环境变量 > application.properties > 默认配置
- 花式配置法:
# 给自动配置的DataSource换血 spring.datasource.url=jdbc:mysql://localhost:3306/cool_db spring.datasource.hikari.maximum-pool-size=20
- Debug秘籍:启动时添加
--debug
参数,查看生效的自动配置报告
五、事务管理:数据库操作的保险柜(钻石段位)
5.1 事务传播的"社交礼仪"
- 七大传播行为:
@Transactional(propagation = Propagation.REQUIRED) // 默认:有则加入,无则新建 @Transactional(propagation = Propagation.REQUIRES_NEW) // 独立新事务 @Transactional(propagation = Propagation.NESTED) // 嵌套事务(像套娃)
- 经典翻车现场:在同一个类中调用
@Transactional
方法会导致事务失效
5.2 隔离级别的"平行宇宙"
- 四大结界:
@Transactional(isolation = Isolation.READ_COMMITTED) // 避免脏读 @Transactional(isolation = Isolation.SERIALIZABLE) // 完全串行(性能杀手)
- 幻读克星:使用
@Version
实现乐观锁控制
5.3 分布式事务的"量子纠缠"
// 使用Seata实现跨服务事务
@GlobalTransactional
public void crossServiceOrder() {
accountService.deduct(); // 扣款
storageService.reduce(); // 减库存
orderService.create(); // 创建订单
}
// 异常时自动触发全局回滚
六、响应式编程:未来世界的入场券(王者段位)
6.1 Reactor核反应堆
- 两大核心:
Flux.just("Java", "Go", "Rust") // 多值流 .delayElements(Duration.ofSeconds(1)) .subscribe(System.out::println); Mono.just("单身狗") // 单值流 .map(str -> str + "的春天") .subscribe();
- 背压黑科技:通过
onBackpressureBuffer()
实现流量控制
6.2 WebFlux性能狂飙
// 响应式REST接口
@RestController
public class ReactiveController {
@GetMapping("/flux")
public Flux<String> streamData() {
return Flux.interval(Duration.ofMillis(100))
.map(i -> "实时数据包:" + i);
}
}
// 对比传统接口TPS提升300%
6.3 响应式数据库连接
// 使用R2DBC操作MySQL
@Autowired
private DatabaseClient client;
public Flux<User> findUsers() {
return client.sql("SELECT * FROM users")
.map(row -> new User(
row.get("name", String.class),
row.get("age", Integer.class)
)).all();
}
// 全程无阻塞IO