Spring 核心知识点补充
1. IoC(控制反转)
- 核心思想:将对象的创建和依赖管理交给容器,而非在代码中直接控制
- 实现方式:
- XML 配置:
<bean>
标签定义对象 - 注解:
@Component
,@Service
,@Repository
,@Controller
- Java 配置:
@Configuration
+@Bean
- XML 配置:
- 容器:
ApplicationContext
接口(如ClassPathXmlApplicationContext
,AnnotationConfigApplicationContext
)
2. AOP(面向切面编程)
- 核心概念:
- 切面(Aspect):横切关注点的模块化(如日志、事务)
- 连接点(Joinpoint):方法执行点
- 通知(Advice):
@Before
:前置通知@After
:后置通知@Around
:环绕通知@AfterThrowing
:异常通知@AfterReturning
:返回通知
- 切点(Pointcut):定义哪些连接点应用通知(如
@Pointcut("execution(* com.service.*.*(..))"
)
- 实现原理:动态代理(JDK 动态代理/CGLIB)
3. 标记注解
-
核心注解:
注解 作用 @Component
通用组件标记 @Service
业务逻辑层 @Repository
数据访问层(自动转换持久层异常) @Controller
MVC 控制器 @Configuration
声明配置类 @Bean
定义单例 Bean(在配置类中使用) @Scope
设置作用域(如 prototype
,singleton
)@Lazy
延迟初始化 @Primary
优先注入的 Bean
4. 依赖注入(DI)
-
注入方式:
-
构造器注入(推荐):
@Autowired public UserService(UserRepository repo) { this.repo = repo; }
-
Setter 注入:
@Autowired public void setRepo(UserRepository repo) { this.repo = repo; }
-
字段注入(不推荐):
@Autowired private UserRepository repo;
-
-
其他注解:
@Qualifier
:解决多个同类型 Bean 冲突@Value
:注入属性值(如@Value("${db.url}")
)
5. 构造方法注入
- Spring 4.3+ 优化:单构造方法可省略
@Autowired
- 循环依赖解决方案:通过构造器注入无法解决循环依赖(需用 Setter/字段注入)
6. 三级缓存与循环依赖
- 缓存级别:
- 一级缓存:
singletonObjects
(完整 Bean) - 二级缓存:
earlySingletonObjects
(半成品 Bean) - 三级缓存:
singletonFactories
(Bean 工厂)
- 一级缓存:
- 循环依赖解决流程(以 A→B→A 为例):
- 创建 A 实例 → 放入三级缓存
- A 注入 B → 创建 B 实例 → 放入三级缓存
- B 注入 A → 从三级缓存获取 A 的工厂 → 生成 A 代理对象 → 放入二级缓存
- B 初始化完成 → 移入一级缓存
- A 完成初始化 → 移入一级缓存
- 关键点:
- 只适用于 单例作用域(
singleton
) - 构造器注入无法解决循环依赖
- 原型作用域(
prototype
)不支持循环依赖
- 只适用于 单例作用域(
7. 易遗漏的核心知识点
-
Bean 生命周期:
- 实例化 → 2. 属性填充 → 3.
BeanNameAware
→ 4.BeanFactoryAware
ApplicationContextAware
→ 6. 前置处理器 → 7.@PostConstruct
InitializingBean
→ 9. 自定义init-method
→ 10. 后置处理器- 使用 → 12.
@PreDestroy
→ 13.DisposableBean
→ 14. 自定义destroy-method
- 实例化 → 2. 属性填充 → 3.
-
事务管理:
- 注解
@Transactional
- 传播行为(
Propagation.REQUIRED
) - 隔离级别(
Isolation.READ_COMMITTED
)
- 注解
-
设计模式应用:
- 工厂模式(
BeanFactory
) - 代理模式(AOP)
- 模板方法(
JdbcTemplate
) - 观察者模式(
ApplicationEvent
事件机制)
- 工厂模式(
-
扩展机制:
BeanPostProcessor
:干预 Bean 初始化过程BeanFactoryPostProcessor
:修改 Bean 定义(如PropertySourcesPlaceholderConfigurer
)ImportSelector
:动态加载配置类
-
Spring Boot 关联:
- 自动配置原理:
@EnableAutoConfiguration
→META-INF/spring.factories
- 条件注解:
@ConditionalOnClass
,@ConditionalOnProperty
- 自动配置原理:
8. 最佳实践建议
- 避免循环依赖:重构代码(提取公共逻辑到新类)
- 优先使用构造器注入:保证依赖不可变,避免 NPE
- 谨慎使用
@Autowired
:明确依赖关系,推荐final
+ 构造器 - AOP 切面粒度:避免过度拦截,影响性能
示例:构造器注入解决循环依赖
@Service public class ServiceA { private final ServiceB serviceB; public ServiceA(ServiceB serviceB) { this.serviceB = serviceB; // Spring 通过三级缓存解决依赖 } } @Service public class ServiceB { private final ServiceA serviceA; public ServiceB(ServiceA serviceA) { this.serviceA = serviceA; } }
通过理解这些核心机制,能更高效地解决 Spring 应用中的复杂问题(如循环依赖),并编写可维护性高的代码。