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方法前后(最强大)