Spring 核心知识点
学习哲学:以"控制反转、面向切面、数据抽象、Web响应"为骨架,以 Spring Framework 官方文档为锚点,以 IoC 容器和 AOP 代理为手术刀,以真实企业级 Java 应用为验收标准。
第一阶段:Spring 概述与 IoC 容器
1.1 Spring 是什么
Spring Framework 是一个企业级 Java 应用开发框架,诞生于 2003 年,旨在简化早期 J2EE(Java 2 Platform, Enterprise Edition)的复杂性。它提供了从配置模型到依赖注入机制、从数据访问到 Web 开发的全栈支持,同时兼容 Groovy 和 Kotlin 作为 JVM 上的替代语言。自 Spring Framework 6.0 起,最低要求 Java 17+。
Spring 的设计哲学可以概括为五点:
| 设计原则 | 含义 |
|---|---|
| 提供选择(Provide choice) | 在每个层面都允许推迟设计决策,例如通过配置切换持久层框架而无需修改代码 |
| 容纳多样视角(Accommodate diverse perspectives) | 拥抱灵活性,不强制规定做事方式,支持不同应用场景 |
| 强向后兼容(Strong backward compatibility) | 版本演进谨慎,尽量减少破坏性变更 |
| 关注 API 设计(Care about API design) | 投入大量精力使 API 直观且经得起多版本考验 |
| 高代码质量标准(High standards for code quality) | 强调有意义的 Javadoc,保持包之间无循环依赖的干净结构 |
Spring 与 Jakarta EE 的关系:
Spring 并非 Jakarta EE 的竞争对手,而是互补关系。Spring 编程模型不拥抱完整的 Jakarta EE 平台规范,而是选择性集成其中的个体规范:
| 规范 | JSR | 在 Spring 中的作用 |
|---|---|---|
| Servlet API | JSR 340 | Web 请求处理基础 |
| WebSocket API | JSR 356 | Spring WebSocket 支持 |
| Concurrency Utilities | JSR 236 | 异步任务调度 |
| JSON Binding API | JSR 367 | JSON 序列化/反序列化 |
| Bean Validation | JSR 303 | 数据校验(如 @Valid) |
| JPA | JSR 338 | ORM 集成(Hibernate 等) |
| JMS | JSR 914 | 消息队列集成 |
| JSR-330 | JSR 330 | 依赖注入标准注解(@Inject 等) |
自 Spring Framework 6.0 起,Spring 已升级至 Jakarta EE 9 级别(如 Servlet 5.0+、JPA 3.0+),使用
jakarta命名空间替代传统的javax包。
1.2 Spring Framework 模块总览
Spring Framework 采用模块化设计,应用可按需选择模块。核心为 Core Container(核心容器),包括配置模型和依赖注入机制;之外还提供消息、事务数据与持久化、Web 等基础支持。
模块路径说明:Spring Framework 的 JAR 包支持部署到 Java 模块路径(Java Module System),每个 JAR 都带有 Automatic-Module-Name 清单条目,定义稳定的语言级模块名(如 spring.core、spring.context),与 JAR 文件名(spring-core、spring-context)对应。
1.3 IoC 容器核心概念
IoC(Inversion of Control,控制反转) 是一种设计原则,指将对象的创建和依赖关系的管理从程序内部转移到外部容器。Spring 通过 DI(Dependency Injection,依赖注入) 实现 IoC。
Spring IoC 容器的两个核心接口:
| 接口 | 定位 | 特点 |
|---|---|---|
| BeanFactory | 基础 IoC 容器 | 延迟初始化(lazy-init),资源占用少,功能精简 |
| ApplicationContext | 高级 IoC 容器 | 继承自 BeanFactory,提供 AOP 集成、消息资源、事件传播、应用层上下文(如 WebApplicationContext) |
实际开发中几乎总是使用 ApplicationContext,它是 Spring 推荐的入口点。
Bean(Bean) 是由 Spring 容器实例化、组装和管理的对象。Bean 及其相互间的依赖关系反映在容器的配置元数据中。
1.4 依赖注入(DI)
DI(Dependency Injection,依赖注入) 是 IoC 的具体实现方式,指容器在创建对象时自动将其依赖的其他对象注入进来。Spring 支持三种注入方式:
| 注入方式 | 实现机制 | 优点 | 缺点 |
|---|---|---|---|
| 构造器注入(Constructor Injection) | 通过构造方法参数注入 | 依赖不可变、必填依赖保证完整、利于单元测试 | 参数过多时构造方法臃肿 |
| Setter 注入(Setter Injection) | 通过 setter 方法注入 | 可选依赖灵活、可在创建后重新注入 | 对象可能处于不完整状态 |
| 字段注入(Field Injection) | @Autowired 直接标注字段 | 代码简洁 | 无法声明 final、不利于测试、隐藏依赖关系 |
Spring 官方推荐构造器注入。从 Spring 4.x 开始,如果类只有一个构造方法,可以省略
@Autowired注解。
构造器注入示例:
@Service
public class UserService {
private final UserRepository userRepository;
// Spring 4.3+ 单构造器可省略 @Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
Setter 注入示例:
@Service
public class UserService {
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
字段注入示例(不推荐):
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
1.5 Bean 生命周期
Spring 容器对 Bean 的管理遵循完整的生命周期:
生命周期回调的三种方式:
| 方式 | 注解/接口 | 说明 |
|---|---|---|
| JSR-250 注解 | @PostConstruct / @PreDestroy | 推荐,与 Spring 解耦 |
| Spring 接口 | InitializingBean / DisposableBean | 侵入性较强,不推荐 |
| XML/注解配置 | init-method / destroy-method | 自定义方法名,灵活性高 |
1.6 Bean 作用域
Bean Scope(作用域) 定义了 Spring 创建 Bean 实例的数量和可见范围:
| 作用域 | 说明 | 适用场景 |
|---|---|---|
| singleton | 默认作用域,每个 Spring 容器只有一个实例 | 无状态服务、配置类 |
| prototype | 每次请求都创建新实例 | 有状态对象、多线程独立上下文 |
| request | 每个 HTTP 请求一个实例(Web 环境) | 请求级数据封装 |
| session | 每个 HTTP Session 一个实例(Web 环境) | 用户登录状态 |
| application | 每个 ServletContext 一个实例(Web 环境) | 应用级全局配置 |
| websocket | 每个 WebSocket 会话一个实例 | 长连接会话状态 |
singleton 和 prototype 在 Core Container 中直接可用;request、session、application、websocket 需要在 Web-aware ApplicationContext 中使用。
1.7 配置方式演进
Spring 支持三种配置方式,体现了从 XML 到注解再到 Java Config 的演进:
| 配置方式 | 代表技术 | 优点 | 缺点 |
|---|---|---|---|
| XML 配置 | <bean>、<context:component-scan> | 与代码完全解耦、无需重新编译 | 冗长、类型不安全、维护困难 |
| 注解配置 | @Component、@Service、@Repository | 简洁、靠近代码、编译期检查 | 分散在源码中、需配合组件扫描 |
| Java Config | @Configuration、@Bean | 类型安全、可编程、IDE 重构友好 | 配置类本身也是代码 |
注解配置示例:
// 服务层
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
// 数据访问层
@Repository
public class UserRepository {
}
// 通用组件
@Component
public class EmailSender {
}
Java Config 示例:
@Configuration
@ComponentScan("com.example")
@PropertySource("classpath:application.properties")
public class AppConfig {
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test");
config.setUsername("root");
config.setPassword("secret");
return new HikariDataSource(config);
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean
@Primary
public UserRepository userRepository(JdbcTemplate jdbcTemplate) {
return new UserRepository(jdbcTemplate);
}
}
1.8 核心注入注解详解
| 注解 | 作用 | 典型用法 |
|---|---|---|
@Autowired | 按类型自动装配依赖 | 构造器/Setter/字段上,Spring 专有 |
@Qualifier("beanName") | 配合 @Autowired 按名称精确指定 | 解决同类型多个 Bean 的歧义 |
@Primary | 标记首选 Bean,同类型冲突时优先注入 | 在 @Bean 或类级别标注 |
@Value("${property}") | 注入配置属性值 | 支持 SpEL 表达式 |
@Autowired + @Qualifier 示例:
@Service
public class OrderService {
private final PaymentGateway paymentGateway;
@Autowired
public OrderService(@Qualifier("alipayGateway") PaymentGateway paymentGateway) {
this.paymentGateway = paymentGateway;
}
}
@Value 示例:
@Service
public class EmailService {
@Value("${smtp.host:smtp.example.com}")
private String smtpHost;
@Value("${smtp.port:587}")
private int smtpPort;
@Value("#{systemProperties['user.home']}/logs")
private String logPath; // SpEL 表达式
}
1.9 本周实践任务
- [ ] 用
AnnotationConfigApplicationContext手动启动 Spring 容器,观察 Bean 初始化顺序 - [ ] 对比构造器注入与字段注入,在单元测试中体验差异(构造器可直接 new,字段需反射或 Spring 上下文)
- [ ] 实现一个
BeanPostProcessor,打印所有 Bean 的创建日志 - [ ] 配置
@Profile("dev")和@Profile("prod")两套 DataSource,切换环境观察行为 - [ ] 用
@Value和Environment两种方式读取application.properties
第二阶段:AOP 与 SpEL
2.1 AOP 核心概念
AOP(Aspect Oriented Programming,面向切面编程) 是对 OOP(Object Oriented Programming,面向对象编程)的补充,用于将横切关注点(Cross-cutting Concerns)(如日志、事务、权限、监控)从业务逻辑中解耦。
| 术语 | 英文 | 含义 |
|---|---|---|
| 切面 | Aspect | 横切关注点的模块化,包含 Advice 和 Pointcut |
| 连接点 | Join Point | 程序执行过程中的一个点,如方法调用、异常抛出 |
| 通知 | Advice | 切面在特定连接点采取的动作 |
| 切点 | Pointcut | 匹配连接点的谓词,定义 Advice 何时触发 |
| 引入 | Introduction | 为现有类型声明额外的方法或字段 |
| 织入 | Weaving | 将切面应用到目标对象创建代理对象的过程 |
2.2 Spring AOP 实现原理
Spring AOP 基于代理模式实现,默认只对运行时的方法调用进行拦截:
| 代理方式 | 实现机制 | 适用场景 | 限制 |
|---|---|---|---|
| JDK 动态代理 | 目标类实现接口时,生成接口代理 | 面向接口编程 | 只能代理接口方法,无法代理类内部 this 调用 |
| CGLIB 代理 | 生成目标类的子类,通过方法重写拦截 | 无接口的类 | 无法代理 final 类和方法 |
Spring Boot 2.x+ 默认配置:
spring.aop.proxy-target-class=true,即优先使用 CGLIB。即使实现了接口,也可强制使用 JDK 代理:@EnableAspectJAutoProxy(proxyTargetClass = false)。
关键限制:由于代理机制,同类内部方法调用(this.method())不会触发 AOP 拦截,因为此时调用的是目标对象本身,而非代理对象。
2.3 Advice 类型
Spring AOP 支持五种 Advice,对应方法执行的不同阶段:
| Advice 类型 | 注解 | 执行时机 |
|---|---|---|
| Before | @Before | 方法执行前 |
| After | @After | 方法执行后(无论是否异常) |
| AfterReturning | @AfterReturning | 方法成功返回后 |
| AfterThrowing | @AfterThrowing | 方法抛出异常后 |
| Around | @Around | 包围方法执行,可控制是否执行原方法 |
2.4 @AspectJ 注解方式定义切面
Spring 使用 AspectJ 的注解语法定义切面,但运行时仍基于 Spring AOP 代理(非 AspectJ 编译期/加载期织入)。
日志切面示例:
@Aspect
@Component
public class LoggingAspect {
// 定义切点:Service 层所有方法
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceLayer() {}
// 环绕通知:记录方法耗时
@Around("serviceLayer()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
String methodName = joinPoint.getSignature().getName();
try {
Object result = joinPoint.proceed();
long duration = System.currentTimeMillis() - start;
System.out.printf("[LOG] %s executed in %dms%n", methodName, duration);
return result;
} catch (Exception e) {
long duration = System.currentTimeMillis() - start;
System.err.printf("[LOG] %s failed after %dms: %s%n", methodName, duration, e.getMessage());
throw e;
}
}
}
权限校验切面示例:
@Aspect
@Component
public class SecurityAspect {
@Pointcut("@annotation(com.example.annotation.RequireAdmin)")
public void adminOperation() {}
@Before("adminOperation()")
public void checkAdmin(JoinPoint joinPoint) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth == null || !auth.hasRole("ADMIN")) {
throw new AccessDeniedException("需要管理员权限");
}
}
}
常用 Pointcut 表达式:
| 表达式 | 含义 |
|---|---|
execution(* *..service.*.*(..)) | 任意包下 service 包中所有类的所有方法 |
execution(public * *(..)) | 所有 public 方法 |
@annotation(com.example.Loggable) | 带有 @Loggable 注解的方法 |
within(com.example.service.*) | service 包下所有类的所有方法 |
args(java.lang.String) | 参数为 String 类型的方法 |
bean(*Service) | Bean 名以 Service 结尾 |
2.6 本周实践任务
- [ ] 对比
@Before+@After与@Around在异常场景下的行为差异 - [ ] 验证同类内部
this.method()调用不触发 AOP 的问题,并尝试用AopContext.currentProxy()解决 - [ ] 切换
proxyTargetClass配置,观察 JDK 代理与 CGLIB 代理生成的类名差异
第三阶段:数据访问与事务
3.1 Spring 数据访问统一抽象
Spring 数据访问层的核心思想是统一异常体系和模板方法模式(Template Method Pattern):
| 技术 | Spring 抽象 | 作用 |
|---|---|---|
| JDBC | JdbcTemplate | 简化原生 JDBC,自动处理连接、Statement、ResultSet、异常转换 |
| JPA | JpaTemplate(已过时)/ EntityManager | 集成 JPA 的 EntityManager 管理 |
| MyBatis | SqlSessionTemplate | 集成 MyBatis,与 Spring 事务同步 |
| MongoDB | MongoTemplate | Spring Data MongoDB 的核心操作类 |
JdbcTemplate 示例:
@Repository
public class UserDao {
private final JdbcTemplate jdbcTemplate;
@Autowired
public UserDao(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public User findById(Long id) {
return jdbcTemplate.queryForObject(
"SELECT id, name, email FROM users WHERE id = ?",
new BeanPropertyRowMapper<>(User.class),
id
);
}
public List<User> findAll() {
return jdbcTemplate.query(
"SELECT id, name, email FROM users",
new BeanPropertyRowMapper<>(User.class)
);
}
public int updateEmail(Long id, String email) {
return jdbcTemplate.update(
"UPDATE users SET email = ? WHERE id = ?",
email, id
);
}
}
3.2 事务管理
Spring 事务管理的核心优势是声明式事务(Declarative Transaction Management),通过 @Transactional 注解将事务逻辑与业务代码解耦。
声明式事务示例:
@Service
public class OrderService {
@Transactional
public void createOrder(Order order) {
// 1. 扣减库存
inventoryService.deduct(order.getItemId(), order.getQuantity());
// 2. 创建订单
orderRepository.save(order);
// 3. 扣减余额
accountService.debit(order.getUserId(), order.getAmount());
// 任意步骤异常,全部回滚
}
}
事务传播行为(Propagation Behavior):
| 传播行为 | 含义 | 典型场景 |
|---|---|---|
| REQUIRED(默认) | 当前无事务则新建,有则加入 | 大多数业务方法 |
| REQUIRES_NEW | 挂起当前事务,新建独立事务 | 日志记录、审计,必须独立提交 |
| SUPPORTS | 有事务则加入,无则以非事务执行 | 查询方法 |
| NOT_SUPPORTED | 挂起当前事务,以非事务执行 | 发送通知,不受事务回滚影响 |
| MANDATORY | 必须有事务,否则抛异常 | 强制要求事务上下文 |
| NEVER | 必须无事务,否则抛异常 | 纯查询,禁止事务开销 |
| NESTED | 在当前事务中创建 savepoint 嵌套事务 | 部分回滚场景 |
事务隔离级别(Isolation Level):
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 说明 |
|---|---|---|---|---|
| DEFAULT | - | - | - | 使用底层数据库默认级别 |
| READ_UNCOMMITTED | ✅ 允许 | ✅ 允许 | ✅ 允许 | 最低隔离,性能最好 |
| READ_COMMITTED | ❌ 禁止 | ✅ 允许 | ✅ 允许 | Oracle/SQL Server 默认 |
| REPEATABLE_READ | ❌ 禁止 | ❌ 禁止 | ✅ 允许 | MySQL InnoDB 默认 |
| SERIALIZABLE | ❌ 禁止 | ❌ 禁止 | ❌ 禁止 | 最高隔离,性能最差 |
@Transactional(
propagation = Propagation.REQUIRED,
isolation = Isolation.READ_COMMITTED,
timeout = 30,
readOnly = false,
rollbackFor = {SQLException.class, BusinessException.class},
noRollbackFor = {IllegalArgumentException.class}
)
public void transferMoney(Long from, Long to, BigDecimal amount) {
// 转账逻辑
}
3.3 与 ORM 框架集成
Spring + JPA/Hibernate 集成:
Spring 通过 LocalContainerEntityManagerFactoryBean 创建 JPA 的 EntityManagerFactory,并自动将 EntityManager 注入到 @PersistenceContext 标注的字段中。
@Configuration
@EnableTransactionManagement
public class JpaConfig {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.example.entity");
factory.setDataSource(dataSource);
return factory;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf) {
return new JpaTransactionManager(emf);
}
}
Spring Data JPA 简介:
Spring Data JPA 在 Spring ORM 之上进一步简化,通过接口派生自动生成查询实现:
public interface UserRepository extends JpaRepository<User, Long> {
// 方法名解析自动生成查询
List<User> findByNameContainingAndStatus(String name, UserStatus status);
// 自定义 JPQL
@Query("SELECT u FROM User u WHERE u.email LIKE %:domain")
List<User> findByEmailDomain(@Param("domain") String domain);
// 原生 SQL
@Query(value = "SELECT * FROM users WHERE created_at > ?1", nativeQuery = true)
List<User> findRecentUsers(LocalDateTime since);
}
3.4 本周实践任务
- [ ] 对比
REQUIRED与REQUIRES_NEW:在 Service A(事务)中调用 Service B(REQUIRES_NEW),让 B 抛异常,观察 A 是否回滚 - [ ] 验证
@Transactional对private方法无效(Spring AOP 代理限制) - [ ] 用
JdbcTemplate和JPA分别实现同一 CRUD,对比代码量 - [ ] 配置
readOnly = true的@Transactional查询方法,观察数据库连接是否只读 - [ ] 故意制造死锁,观察
@Transactional(timeout = 5)的行为
附录 A:Spring 面试高频考点
IoC 和 DI 有什么区别?
IoC(控制反转)是一种设计原则,指将对象控制权从程序内部转移到外部容器;DI(依赖注入)是 IoC 的具体实现方式之一,通过构造器、Setter 或字段将依赖注入对象。
BeanFactory 和 ApplicationContext 有什么区别?
BeanFactory 是基础容器,延迟初始化,资源占用少;ApplicationContext 继承自 BeanFactory,提供 AOP 集成、国际化、事件传播、应用层特定上下文(如 WebApplicationContext),默认立即初始化单例 Bean。
Spring Bean 的完整生命周期是怎样的?
实例化 → 属性填充 → Aware 接口回调 → BeanPostProcessor.beforeInit → 初始化(@PostConstruct/InitializingBean) → BeanPostProcessor.afterInit → 使用 → 销毁(@PreDestroy/DisposableBean)。
Spring 如何解决循环依赖?
仅对 singleton 作用域且通过 构造器注入以外 方式创建的 Bean,Spring 使用三级缓存(singletonObjects、earlySingletonObjects、singletonFactories)解决。构造器注入的循环依赖无法自动解决,需用
@Lazy延迟注入或重构代码。JDK 动态代理和 CGLIB 代理的区别?Spring 如何选择?
JDK 代理要求目标类实现接口,基于
InvocationHandler;CGLIB 生成目标类的子类,基于方法拦截。Spring 默认优先使用 JDK 代理(目标有接口时),但 Spring Boot 2.x+ 默认proxyTargetClass=true优先使用 CGLIB。AOP 的五种 Advice 分别在什么时候执行?
Before(方法前)、After(方法后,无论异常)、AfterReturning(成功返回后)、AfterThrowing(异常抛出后)、Around(包围整个方法执行,可控制是否执行原方法)。
同类内部方法调用为什么 AOP 不生效?如何解决?
因为
this.method()调用的是目标对象本身,而非代理对象。解决方案:① 注入自身代理(@Autowired自己);② 使用AopContext.currentProxy();③ 重构避免内部调用。@Transactional 失效的常见场景有哪些?
① 方法非 public;② 同类内部调用;③ 异常被 catch 未抛出;④ 异步方法(@Async);⑤ 数据库引擎不支持事务(如 MyISAM);⑥ 传播行为配置不当。
Spring 事务的七种传播行为分别是什么?
REQUIRED(默认,加入或新建)、REQUIRES_NEW(挂起当前,新建独立)、SUPPORTS(有则加入,无则非事务)、NOT_SUPPORTED(挂起当前,非事务执行)、MANDATORY(必须有事务)、NEVER(必须无事务)、NESTED(嵌套 savepoint)。
Spring 事务隔离级别与数据库隔离级别的关系?
Spring 的
Isolation枚举映射到 JDBC 的隔离级别常量,最终由底层数据库实现。DEFAULT 表示使用数据库默认级别(如 MySQL InnoDB 为 REPEATABLE_READ,Oracle 为 READ_COMMITTED)。@Autowired 和 @Resource 的区别?
@Autowired 是 Spring 注解,按类型装配,配合 @Qualifier 可按名称;@Resource 是 JSR-250 标准注解,默认按名称装配,找不到再按类型。
Spring 的 Bean 作用域有哪些?singleton 是否线程安全?
singleton、prototype、request、session、application、websocket。singleton 本身不保证线程安全,是否安全取决于 Bean 内部状态是否可变。无状态 singleton 是线程安全的;有状态需同步或改用 prototype。
什么是 SpEL?常见使用场景?
Spring Expression Language,Spring 表达式语言。用于 @Value 注入、Spring Security 权限表达式、缓存 Key 生成、XML/注解配置中的动态值计算。
Spring Boot 的自动配置原理是什么?
基于
@EnableAutoConfiguration,通过spring.factories读取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中注册的自动配置类,结合@ConditionalOnClass、@ConditionalOnProperty等条件注解,在满足条件时自动注册 Bean。
附录 B:核心注解速查表
IoC 注解
| 注解 | 作用 | 层级 |
|---|---|---|
@Component | 通用组件,标记为 Spring 管理的 Bean | 类 |
@Service | 业务逻辑层,语义化 @Component | 类 |
@Repository | 数据访问层,自动转换持久层异常 | 类 |
@Configuration | 声明配置类,内部 @Bean 方法定义 Bean | 类 |
@Bean | 在 @Configuration 类中显式定义 Bean | 方法 |
@ComponentScan | 开启组件扫描,指定扫描包路径 | 类 |
@Import | 导入其他配置类 | 类 |
@Profile | 指定 Bean 生效的环境 profile | 类/方法 |
@Scope | 指定 Bean 作用域 | 类/方法 |
@Lazy | 延迟初始化 | 类/方法/参数 |
@Primary | 同类型 Bean 冲突时优先注入 | 类/方法 |
@Qualifier | 按名称精确指定注入的 Bean | 参数/字段/方法 |
@Autowired | 按类型自动装配(Spring 专有) | 构造器/Setter/字段 |
@Resource | JSR-250 标准,默认按名称装配 | 字段/Setter |
@Inject | JSR-330 标准,等价于 @Autowired | 构造器/Setter/字段 |
@Value | 注入配置属性或 SpEL 表达式 | 字段/参数 |
@PropertySource | 指定属性文件位置 | 类 |
AOP 注解
| 注解 | 作用 |
|---|---|
@Aspect | 声明切面类 |
@Pointcut | 定义切点表达式 |
@Before | 前置通知 |
@After | 后置通知(无论异常) |
@AfterReturning | 返回后通知 |
@AfterThrowing | 异常后通知 |
@Around | 环绕通知 |
@EnableAspectJAutoProxy | 开启 @AspectJ 自动代理 |
事务与数据注解
| 注解 | 作用 |
|---|---|
@Transactional | 声明式事务 |
@EnableTransactionManagement | 开启注解事务管理 |
@TransactionalEventListener | 事务绑定的事件监听 |
@Repository | 数据访问层(含异常转换) |
附录 C:Spring 模块速查表
| 模块名 | JAR 文件 | 核心功能 |
|---|---|---|
| spring-core | spring-core.jar | 核心工具类、ASM、资源加载、泛型类型处理 |
| spring-beans | spring-beans.jar | Bean 工厂、依赖注入、Bean 包装 |
| spring-context | spring-context.jar | ApplicationContext、事件、国际化、资源加载 |
| spring-expression | spring-expression.jar | SpEL 表达式语言 |
| spring-aop | spring-aop.jar | AOP 联盟、代理工厂、Pointcut/Advice API |
| spring-aspects | spring-aspects.jar | AspectJ 集成、加载期织入 |
| spring-instrument | spring-instrument.jar | 类加载器工具、代理织入 |
| spring-jdbc | spring-jdbc.jar | JdbcTemplate、DataSource 工具、SQL 异常转换 |
| spring-tx | spring-tx.jar | 事务抽象、声明式事务、JTA 集成 |
| spring-orm | spring-orm.jar | Hibernate、JPA、JDO 集成 |
| spring-oxm | spring-oxm.jar | JAXB、Castor、XStream 等 XML 编组 |
| spring-jms | spring-jms.jar | JMS 模板、消息监听容器 |
附录 D:学习资源与工具
- Spring 官方文档:https://docs.spring.io/spring-framework/reference/
- Spring Guides:https://spring.io/guides
- Spring Initializr:https://start.spring.io
- Spring Boot 文档:https://docs.spring.io/spring-boot/docs/current/reference/html/
- Spring Data JPA 参考:https://docs.spring.io/spring-data/jpa/reference/
- IntelliJ IDEA:Spring 开发首选 IDE,内置 Spring Initializr 和 Bean 依赖图
- VisualVM / Arthas:JVM 与 Spring Bean 运行时诊断
版本说明:本教程基于 Spring Framework 6.x / Spring Boot 3.x 编写,要求 Java 17+,使用
jakarta命名空间(Jakarta EE 9+)。