Skip to content
极高进阶

一句话答案

AOP 在运行时通过动态代理(JDK/CGLIB)将横切逻辑(日志/事务/权限)织入目标方法,核心概念:切面/切点/通知。

核心要点

自动装配的入口:@SpringBootApplication

java
@SpringBootApplication
= @SpringBootConfiguration       // 等价于 @Configuration
+ @EnableAutoConfiguration       // 自动装配的核心
+ @ComponentScan                 // 扫描当前包及子包

@EnableAutoConfiguration 的工作流程:

@EnableAutoConfiguration
  → 导入 AutoConfigurationImportSelector
      → getCandidateConfigurations()
          → SpringFactoriesLoader.loadFactoryNames()
              → 读取所有 JAR 包中的 META-INF/spring.factories 文件
                  → 找到 EnableAutoConfiguration 对应的所有自动配置类列表
              → Spring Boot 3.x 改为读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

条件过滤(不是所有配置类都会生效):

java
// 每个自动配置类上都有条件注解,按需生效
@ConditionalOnClass(DataSource.class)           // classpath 存在 DataSource 类才生效
@ConditionalOnMissingBean(DataSource.class)     // 用户没有自定义 DataSource 才生效
@ConditionalOnProperty(name="spring.datasource.url") // 配置了对应属性才生效

以 DataSourceAutoConfiguration 为例:

引入 spring-boot-starter-jdbc
  → classpath 中有 HikariCP
  → DataSourceAutoConfiguration 上的 @ConditionalOnClass(DataSource.class) 条件满足
  → 自动创建 HikariDataSource Bean(如果用户没有手动定义)
  → 读取 application.properties 中的 spring.datasource.* 配置
追问与易错

追问方向:

  • AOP 通知类型有哪些?
  • @Around 和 @Before+@After 区别?
  • AOP 失效的场景?

易错点:

  • ❌ AOP 是运行时字节码增强——Spring AOP 用动态代理
  • ❌ 混淆切面/切点/通知概念

💡 记忆锚点

AOP = 在门口安监控(代理),不用改屋里的代码就能记录谁进谁出(日志/事务/权限)。四个概念:切面(监控系统)、切点(装在哪些门口)、通知(录什么内容Before/After/Around)、连接点(每一次进出事件)。