Java 面试知识整理(三):Spring 框架
IOC(控制反转 / Inversion of Control)
核心思想: 对象的创建权从程序员交给 Spring 容器
传统方式:UserService userService = new UserService(); // 程序员自己new
Spring方式:@Autowired UserService userService; // Spring自动注入
优点:
- 降低耦合度(結合度が下がる)
- 提高可维护性(保守性が向上する)
- 方便单元测试(テストが容易になる)
DI(依赖注入 / Dependency Injection)
IOC 的实现方式,Spring 自动把依赖的对象注入进来
@Service
public class UserService {
// Spring 自动把 UserMapper 注入进来
@Autowired
private UserMapper userMapper;
}
Bean 的生命周期
① 实例化(インスタンス化)
↓
② 属性赋值(依存性注入)
↓
③ 初始化前(BeanPostProcessor#postProcessBeforeInitialization)
↓
④ @PostConstruct(初期化メソッド)
↓
⑤ InitializingBean#afterPropertiesSet()
↓
⑥ 自定义 init-method
↓
⑦ 初始化后(BeanPostProcessor#postProcessAfterInitialization)
↓
⑧ Bean 就绪,可以使用
↓
⑨ 容器关闭
↓
⑩ @PreDestroy(破棄メソッド)
↓
⑪ DisposableBean#destroy()
↓
⑫ 自定义 destroy-method
面试重点记住:
インスタンス化 → DI → @PostConstruct → 使用 → @PreDestroy
AOP(面向切面编程 / アスペクト指向)
作用: 在不修改原有代码的情况下,给方法添加额外功能
常见应用场景:
- 日志记录(ログ出力)
- 权限检查(権限チェック)
- 事务管理(トランザクション管理)
- 性能监控(パフォーマンス計測)
@Aspect
@Component
public class LoggingAspect {
// 环绕通知:在方法执行前后都执行
@Around("execution(* com.example.service.*.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
Object result = joinPoint.proceed(); // 执行目标方法
long end = System.currentTimeMillis();
System.out.println(joinPoint.getSignature() + " 耗时: " + (end - start) + "ms");
return result;
}
}
通知类型:
| 类型 | 执行时机 |
|---|---|
@Before | 方法执行前 |
@After | 方法执行后(无论成功还是异常) |
@AfterReturning | 方法成功返回后 |
@AfterThrowing | 方法抛出异常后 |
@Around | 方法前后(最强大) |