外观
一句话答案
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)、连接点(每一次进出事件)。