乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 Spring概述与IoC容器

    • Spring概述与IoC容器
    • Spring Framework 概述
    • IoC 与 DI 核心概念
    • @Configuration 详解
    • @Component 详解
    • @ComponentScan 详解
    • @Import 详解
    • @Profile 详解
    • @PropertySource 详解
    • @Service 详解
    • @Repository 详解
  • 第2章 Bean的定义与依赖注入

    • Bean的定义与依赖注入
    • @Bean 详解
    • @Autowired 详解
    • @Qualifier 详解
    • @Primary 详解
    • @Resource 详解
    • @Inject 详解
    • @Named 详解
    • @Value 详解
    • @Scope 详解
    • @Lazy 详解
  • 第3章 Bean生命周期与作用域

    • Bean生命周期与作用域
    • Bean生命周期概述
    • @PostConstruct
    • @PreDestroy
    • InitializingBean
    • DisposableBean
    • BeanPostProcessor
    • BeanFactoryPostProcessor
  • 第4章 AOP面向切面编程

    • AOP面向切面编程
    • AOP核心概念
    • @EnableAspectJAutoProxy
    • @Aspect
    • @Pointcut
    • @Before
    • @After
    • @AfterReturning
    • @AfterThrowing
    • @Around
  • 第5章 数据访问与事务管理

    • 数据访问与事务管理
    • 数据访问概述
    • @EnableTransactionManagement
    • @Transactional
    • @Transactional 的传播行为
    • @Transactional 的隔离级别
    • @Transactional 的回滚规则
    • @Transactional 的超时与只读属性
    • @TransactionalEventListener
  • 第6章 Spring Boot自动配置基础

    • Spring Boot自动配置基础
    • @SpringBootApplication 注解
    • @EnableAutoConfiguration 注解
    • @ConfigurationProperties 注解
    • @ConditionalOnClass 注解
    • @ConditionalOnMissingBean 注解
    • @ConditionalOnProperty 注解
  • 第7章 从容器到Web: Spring MVC导引

    • Spring MVC 导引
  • 第8章 扩展阅读

    • 扩展阅读
    • Spring 事件机制 — ApplicationEvent / ApplicationListener
    • @EventListener
    • SpEL — Spring 表达式语言
    • 校验 Validation — JSR-303 / JSR-380 Bean Validation
    • 类型转换与数据绑定 — Converter / DataBinder
  • 附录

    • Spring Framework 专业术语
    • Spring 核心知识点
    • Spring 面试高频考点
    • Spring 核心注解速查表

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 APIJSR 340Web 请求处理基础
WebSocket APIJSR 356Spring WebSocket 支持
Concurrency UtilitiesJSR 236异步任务调度
JSON Binding APIJSR 367JSON 序列化/反序列化
Bean ValidationJSR 303数据校验(如 @Valid)
JPAJSR 338ORM 集成(Hibernate 等)
JMSJSR 914消息队列集成
JSR-330JSR 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 抽象作用
JDBCJdbcTemplate简化原生 JDBC,自动处理连接、Statement、ResultSet、异常转换
JPAJpaTemplate(已过时)/ EntityManager集成 JPA 的 EntityManager 管理
MyBatisSqlSessionTemplate集成 MyBatis,与 Spring 事务同步
MongoDBMongoTemplateSpring 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 面试高频考点

  1. IoC 和 DI 有什么区别?

    IoC(控制反转)是一种设计原则,指将对象控制权从程序内部转移到外部容器;DI(依赖注入)是 IoC 的具体实现方式之一,通过构造器、Setter 或字段将依赖注入对象。

  2. BeanFactory 和 ApplicationContext 有什么区别?

    BeanFactory 是基础容器,延迟初始化,资源占用少;ApplicationContext 继承自 BeanFactory,提供 AOP 集成、国际化、事件传播、应用层特定上下文(如 WebApplicationContext),默认立即初始化单例 Bean。

  3. Spring Bean 的完整生命周期是怎样的?

    实例化 → 属性填充 → Aware 接口回调 → BeanPostProcessor.beforeInit → 初始化(@PostConstruct/InitializingBean) → BeanPostProcessor.afterInit → 使用 → 销毁(@PreDestroy/DisposableBean)。

  4. Spring 如何解决循环依赖?

    仅对 singleton 作用域且通过 构造器注入以外 方式创建的 Bean,Spring 使用三级缓存(singletonObjects、earlySingletonObjects、singletonFactories)解决。构造器注入的循环依赖无法自动解决,需用 @Lazy 延迟注入或重构代码。

  5. JDK 动态代理和 CGLIB 代理的区别?Spring 如何选择?

    JDK 代理要求目标类实现接口,基于 InvocationHandler;CGLIB 生成目标类的子类,基于方法拦截。Spring 默认优先使用 JDK 代理(目标有接口时),但 Spring Boot 2.x+ 默认 proxyTargetClass=true 优先使用 CGLIB。

  6. AOP 的五种 Advice 分别在什么时候执行?

    Before(方法前)、After(方法后,无论异常)、AfterReturning(成功返回后)、AfterThrowing(异常抛出后)、Around(包围整个方法执行,可控制是否执行原方法)。

  7. 同类内部方法调用为什么 AOP 不生效?如何解决?

    因为 this.method() 调用的是目标对象本身,而非代理对象。解决方案:① 注入自身代理(@Autowired 自己);② 使用 AopContext.currentProxy();③ 重构避免内部调用。

  8. @Transactional 失效的常见场景有哪些?

    ① 方法非 public;② 同类内部调用;③ 异常被 catch 未抛出;④ 异步方法(@Async);⑤ 数据库引擎不支持事务(如 MyISAM);⑥ 传播行为配置不当。

  9. Spring 事务的七种传播行为分别是什么?

    REQUIRED(默认,加入或新建)、REQUIRES_NEW(挂起当前,新建独立)、SUPPORTS(有则加入,无则非事务)、NOT_SUPPORTED(挂起当前,非事务执行)、MANDATORY(必须有事务)、NEVER(必须无事务)、NESTED(嵌套 savepoint)。

  10. Spring 事务隔离级别与数据库隔离级别的关系?

    Spring 的 Isolation 枚举映射到 JDBC 的隔离级别常量,最终由底层数据库实现。DEFAULT 表示使用数据库默认级别(如 MySQL InnoDB 为 REPEATABLE_READ,Oracle 为 READ_COMMITTED)。

  11. @Autowired 和 @Resource 的区别?

    @Autowired 是 Spring 注解,按类型装配,配合 @Qualifier 可按名称;@Resource 是 JSR-250 标准注解,默认按名称装配,找不到再按类型。

  12. Spring 的 Bean 作用域有哪些?singleton 是否线程安全?

    singleton、prototype、request、session、application、websocket。singleton 本身不保证线程安全,是否安全取决于 Bean 内部状态是否可变。无状态 singleton 是线程安全的;有状态需同步或改用 prototype。

  13. 什么是 SpEL?常见使用场景?

    Spring Expression Language,Spring 表达式语言。用于 @Value 注入、Spring Security 权限表达式、缓存 Key 生成、XML/注解配置中的动态值计算。

  14. 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/字段
@ResourceJSR-250 标准,默认按名称装配字段/Setter
@InjectJSR-330 标准,等价于 @Autowired构造器/Setter/字段
@Value注入配置属性或 SpEL 表达式字段/参数
@PropertySource指定属性文件位置类

AOP 注解

注解作用
@Aspect声明切面类
@Pointcut定义切点表达式
@Before前置通知
@After后置通知(无论异常)
@AfterReturning返回后通知
@AfterThrowing异常后通知
@Around环绕通知
@EnableAspectJAutoProxy开启 @AspectJ 自动代理

事务与数据注解

注解作用
@Transactional声明式事务
@EnableTransactionManagement开启注解事务管理
@TransactionalEventListener事务绑定的事件监听
@Repository数据访问层(含异常转换)

附录 C:Spring 模块速查表

模块名JAR 文件核心功能
spring-corespring-core.jar核心工具类、ASM、资源加载、泛型类型处理
spring-beansspring-beans.jarBean 工厂、依赖注入、Bean 包装
spring-contextspring-context.jarApplicationContext、事件、国际化、资源加载
spring-expressionspring-expression.jarSpEL 表达式语言
spring-aopspring-aop.jarAOP 联盟、代理工厂、Pointcut/Advice API
spring-aspectsspring-aspects.jarAspectJ 集成、加载期织入
spring-instrumentspring-instrument.jar类加载器工具、代理织入
spring-jdbcspring-jdbc.jarJdbcTemplate、DataSource 工具、SQL 异常转换
spring-txspring-tx.jar事务抽象、声明式事务、JTA 集成
spring-ormspring-orm.jarHibernate、JPA、JDO 集成
spring-oxmspring-oxm.jarJAXB、Castor、XStream 等 XML 编组
spring-jmsspring-jms.jarJMS 模板、消息监听容器

附录 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+)。

上一页
Spring Framework 专业术语
下一页
Spring 面试高频考点