Spring Spring Boot 常用注解详解:生命周期、懒加载、优先加载与实用技巧
Spring Spring Boot 常用注解详解生命周期、懒加载、优先加载与实用技巧前言在 Spring 和 Spring Boot 开发中注解几乎是“每天必打交道”的伙伴。它们像魔法一样可以帮你声明 Bean、管理依赖、控制加载顺序、处理事务、配置环境……但注解多了也容易混淆。本教程将按功能模块带你系统梳理 Spring 生态中最常用的注解尤其会重点讲解生命周期、懒加载和优先加载相关的那些“容易踩坑”的注解。全文配合示例希望对你的日常开发有所助益。目录核心组件注解——声明一个 Bean配置与注册 Bean依赖注入DI注解生命周期注解⭐重点懒加载与优先加载⭐重点条件装配与环境配置Spring Boot 核心注解其他高频实用注解总结1. 核心组件注解——声明一个 Bean想让一个类被 Spring 管理最简单的办法就是给它贴上对应的“标签”。注解作用说明Component通用的组件注解标注后类会被 Spring 扫描并加入容器最基础的 Bean 注解Service标记服务层组件语义更明确本质同ComponentRepository标记持久层组件额外自动转换数据库异常为 Spring 的DataAccessExceptionController/RestController标记控制器RestControllerControllerResponseBody返回 JSON 时常用示例ServicepublicclassUserServiceImplimplementsUserService{// ...}提示Repository其实还承担了异常翻译功能如果直接使用Component标注 DAO 类数据库异常不会自动转换成 Spring 的异常体系。2. 配置与注册 Bean当我们不能直接修改类比如第三方库或需要更灵活的 Bean 定义时就用到下面这些注解。注解作用常用场景Configuration声明一个配置类内部可以用Bean方法定义 Bean代替 XML 配置Bean方法级别返回的对象会被纳入 Spring 容器自定义组装 Bean可通过initMethod/destroyMethod指定回调ComponentScan指定扫描包路径自动发现组件自定义扫描哪些包Import快速导入其他配置类或普通类模块化配置示例ConfigurationpublicclassAppConfig{Bean(namedataSource,initMethodstart,destroyMethodclose)publicDataSourcedataSource(){returnnewBasicDataSource();}}3. 依赖注入DI注解一个 Bean 想用另一个 Bean只需要“告诉” Spring 你在哪里需要它。注解作用Autowired按类型自动注入可标注在构造器、字段、setter 方法上Qualifier配合Autowired当有多个实现时按名称精确注入Primary当存在多个同类型 Bean 时标注一个为首选Value注入外部属性值如${server.port}或 SpEL 表达式Resource按名称注入JSR-250不常用但存在示例AutowiredQualifier(userJdbcRepository)privateUserRepositoryuserRepository;⚠️注意当存在多个同一接口的实现类时Autowired会报错此时要么使用Qualifier要么用Primary指定默认。4. 生命周期注解⭐重点这是很多初学者容易忽略但实际开发非常重要的部分。典型场景初始化连接池、注册资源、销毁时清理线程等。4.1PostConstruct与PreDestroy来源javax.annotation现 Jakarta EE作用PostConstruct在 Bean 的依赖注入完成之后正式可用之前执行PreDestroy容器销毁该 Bean之前执行清理工作仅对单例有效使用示例ComponentpublicclassCacheManager{PostConstructpublicvoidinit(){// 初始化连接池、预加载缓存等System.out.println(CacheManager 初始化完成);}PreDestroypublicvoidcleanup(){// 释放资源、关闭连接等System.out.println(CacheManager 即将销毁执行清理);}}执行顺序构造方法 → 依赖注入Autowired→PostConstruct→ Bean 就绪4.2Bean的initMethod和destroyMethod如果类不是你自己写的没法加PostConstruct注解可以在Bean中指定方法名。Bean(initMethodstart,destroyMethodstop)publicThirdPartyServicethirdPartyService(){returnnewThirdPartyService();}destroyMethod默认推断close或shutdown方法若要关闭推断可设为空字符串destroyMethod。4.3 实现InitializingBean和DisposableBean接口了解即可InitializingBean的afterPropertiesSet()等同于PostConstructDisposableBean的destroy()等同于PreDestroy✅ 建议优先使用PostConstruct/PreDestroy它们不与 Spring 强耦合代码更干净。4.4Scope对生命周期的影响Scope(singleton)默认容器初始化时就创建除非被Lazy延迟完整生命周期由 Spring 管理。Scope(prototype)每次获取都会新建Spring 只负责创建不负责销毁因此PreDestroy不会回调。5. 懒加载与优先加载⭐重点5.1Lazy—— 懒加载作用让单例 Bean 的初始化推迟到第一次被调用时而不是容器启动时。可用于Component、Bean、Autowired示例ServiceLazypublicclassReportService{publicReportService(){System.out.println(ReportService 被实例化);}}效果容器启动时不会创建ReportService第一次调用它的方法时才会触发构造。加快应用启动速度适用于那些启动时不一定用到的重型服务。注入点使用LazyAutowiredLazyprivateHeavyServiceheavyService;此时注入的是一个代理对象直到真正调用代理方法时才会从容器获取目标 Bean。5.2DependsOn—— 依赖优先作用强制指定当前 Bean 必须在指定的 Bean初始化完成之后才能创建。适用场景虽然没有直接注入但存在静态注册或隐式依赖例如 A 的静态代码块依赖 B 准备好。示例ComponentDependsOn(eventLogger)publicclassEventService{...}这样EventService无论如何都会等到eventLoggerBean 完全初始化后才开始创建。5.3Order与Priority—— 控制顺序Orderorg.springframework.core.annotation.Order常用于同一接口的多个实现控制它们作为List注入时的排序值越小优先级越高。PriorityJSR-250 标准功能相似也可用于选择首选 Bean。常见用途过滤器、拦截器、事件监听器的顺序。ComponentOrder(1)publicclassFirstFilterimplementsFilter{...}ComponentOrder(2)publicclassSecondFilterimplementsFilter{...}5.4Primary—— 优先选择当存在多个同类型 Bean 时标注Primary的 Bean 会作为Autowired的默认选择。Qualifier的精确选择优先级高于Primary。6. 条件装配与环境配置不同环境需要不同的 Bean想让某些 Bean 只在特定条件下生效下面这些注解帮你优雅实现。注解作用Profile根据激活的环境application-{profile}.yml决定是否加载 BeanConditionalOnClass类路径下存在指定类时才生效Spring Boot 自动配置核心ConditionalOnMissingBean容器中缺少指定 Bean 时才会创建ConditionalOnProperty根据配置项的值prefix.enabledtrue决定是否启用PropertySource加载指定的.properties文件ConfigurationProperties将配置前缀的属性批量绑定到类字段需配合EnableConfigurationProperties示例ConfigurationProfile(dev)publicclassDevDataSourceConfig{...}BeanConditionalOnMissingBeanpublicCacheManagercacheManager(){returnnewConcurrentMapCacheManager();}7. Spring Boot 核心注解注解等价/作用SpringBootApplicationConfigurationEnableAutoConfigurationComponentScanEnableAutoConfiguration触发 Spring Boot 的自动配置机制RestControllerAdvice全局异常处理 ResponseBody常配合ExceptionHandlerSpringBootTest集成测试时加载完整 ApplicationContextSpring Boot 主类只要一个SpringBootApplication就能启动自动扫描和自动配置。8. 其他高频实用注解Web 层GetMapping(/users/{id})publicUsergetUser(PathVariableLongid,RequestParam(requiredfalse)Stringname,RequestBodyUseruser){...}常用搭配RequestMapping、PostMapping、PutMapping、DeleteMapping、RequestHeader、CookieValue、CrossOrigin。异步与调度Async方法异步执行需在主类添加EnableAsync。Scheduled(fixedRate 5000)定时任务需添加EnableScheduling。事务与缓存Transactional声明式事务可用于类或方法。Cacheable(value users, key #id)/CacheEvict/CachePut配合缓存抽象如 Redis。参数校验Valid/Validated触发参数校验。配合NotNull、NotBlank、Size等 JSR-303 注解。示例PostMappingpublicResultcreate(ValidRequestBodyUseruser){// ...}9. 总结速查表帮你快速回忆类别关键注解一句话说明生命周期PostConstructPreDestroyBean(initMethod)控制 Bean 的初始化和销毁逻辑懒加载Lazy延迟创建直到首次使用优先/顺序DependsOnOrderPriorityPrimary控制 Bean 初始化顺序、注入优先级和排序依赖注入AutowiredQualifierValue自动装配成员组件声明ComponentServiceRepositoryController声明 Bean 并加入容器条件装配ProfileConditionalOnClass等按条件决定是否加载 Bean配置绑定ConfigurationProperties将配置批量绑定到对象核心入口SpringBootApplicationSpring Boot 主类必备掌握这些注解后你会发现写 Spring 项目就像拼积木干净又灵活。不妨收藏本教程在遇到疑惑时快速查阅。如果还想深入了解某一类注解比如事务传播机制、异步配置、缓存策略欢迎在评论区留言我会根据大家的反馈继续更新。