网站设置快捷方式京东慧采入驻条件及费用2022
网站设置快捷方式,京东慧采入驻条件及费用2022,国外黄冈网站推广软件免费吗,开网络公司需要多少资金目录
前言
一、Bean 的作用域#xff1a;控制 Bean 的创建与复用规则
1.1 作用域的核心概念
1.2 Spring 的 6 种 Bean 作用域
关键区别说明#xff1a;
1.3 作用域的代码实现与测试
1.3.1 定义不同作用域的 Bean
1.3.2 测试不同作用域的 Bean 特性
1.4 作用域选择原…目录前言一、Bean 的作用域控制 Bean 的创建与复用规则1.1 作用域的核心概念1.2 Spring 的 6 种 Bean 作用域关键区别说明1.3 作用域的代码实现与测试1.3.1 定义不同作用域的 Bean1.3.2 测试不同作用域的 Bean 特性1.4 作用域选择原则二、Bean 的生命周期从创建到销毁的完整链路2.1 生命周期的 5 个核心阶段2.2 生命周期详细流程与代码演示2.2.1 自定义 Bean 生命周期演示类2.2.2 配置依赖注入与测试2.2.3 执行结果与流程分析2.3 生命周期核心扩展点详解1. Aware 接口系列初始化阶段回调2. BeanPostProcessorBean 后置处理器3. 初始化 / 销毁方法的 3 种配置方式2.4 生命周期源码核心逻辑三、Spring Boot 自动配置原理约定优于配置的底层实现3.1 自动配置的核心入口SpringBootApplication 注解三个注解的核心作用3.2 自动配置的核心逻辑EnableAutoConfiguration1. 注解拆解2. 关键步骤详解步骤 1AutoConfigurationPackage—— 扫描本地组件步骤 2AutoConfigurationImportSelector—— 加载第三方配置类示例Redis 的自动配置3. 动态加载的核心Conditional 系列注解3.3 自动配置的完整流程总结3.4 手动模拟自动配置理解第三方依赖的加载逻辑1. 第三方依赖中定义配置类2. 第三方提供 EnableXXX 注解3. 应用程序启用注解四、核心知识点总结与实战建议4.1 核心知识点梳理4.2 实战避坑建议五、总结前言Spring 框架是 Java 后端开发的基石其核心在于IoC控制反转容器对 Bean 的高效管理以及 Spring Boot 基于此实现的 “约定优于配置” 自动配置机制。理解 Bean 的作用域、生命周期以及 Spring Boot 自动配置的底层逻辑是写出高效、稳健 Spring 应用的关键。本文将从实战出发结合源码与代码示例全面拆解这三大核心知识点帮你彻底掌握 Spring 的底层工作原理。一、Bean 的作用域控制 Bean 的创建与复用规则在 Spring IoC 容器中Bean 的作用域定义了Bean 实例的创建时机、存活范围和复用规则。默认情况下Spring 容器中的 Bean 是单例的全局唯一但在不同业务场景下我们需要灵活调整 Bean 的作用域以满足需求。1.1 作用域的核心概念Bean 的作用域本质是 Spring 容器对 Bean 实例的 “管理策略”。比如单例 Bean默认容器启动时创建全局唯一所有组件共享同一个实例多例 Bean每次获取时创建新实例组件间互不干扰。通过一个简单测试即可验证默认单例特性SpringBootTest class DemoApplicationTests { Autowired private ApplicationContext applicationContext; Test void testSingleton() { // 两次从容器中获取Bean Dog dog1 applicationContext.getBean(Dog.class); Dog dog2 applicationContext.getBean(Dog.class); System.out.println(dog1 dog2); // 输出true证明是同一个实例 } }单例 Bean 的优势是节省内存、创建效率高但存在线程安全风险若 Bean 包含可修改的成员变量多线程并发修改会导致数据错乱。因此Spring 提供了 6 种作用域适配不同场景。1.2 Spring 的 6 种 Bean 作用域Spring 支持 6 种作用域其中后 4 种仅在Web 环境Spring MVC中生效作用域核心定义适用场景生命周期范围singleton容器内同名称 Bean 唯一实例默认无状态 Bean如 Service、Dao 层容器启动 → 容器销毁prototype每次获取 Bean 时创建新实例有状态 Bean如包含用户会话数据的对象调用 getBean () → 垃圾回收request每个 HTTP 请求生命周期内创建新实例请求结束后销毁存储单次请求的临时数据如请求上下文HTTP 请求开始 → 请求结束session每个 HTTP Session 生命周期内创建新实例会话失效后销毁存储用户会话数据如登录状态用户登录 → 会话过期 / 退出登录application每个 ServletContextWeb 应用生命周期内创建新实例应用停止后销毁存储全局应用数据如系统配置应用启动 → 应用停止websocket每个 WebSocket 连接生命周期内创建新实例连接关闭后销毁实时通信场景如聊天功能WebSocket 连接建立 → 连接关闭关键区别说明singleton vs application两者都是 “全局单例”但 singleton 是IoC 容器级别的单例一个应用可有多个 IoC 容器application 是ServletContext 级别的单例整个 Web 应用唯一request/session/application需依赖 Web 环境且需通过proxyMode ScopedProxyMode.TARGET_CLASS生成动态代理Spring 自动为RequestScope等注解配置否则会因 Bean 创建时机问题报错。1.3 作用域的代码实现与测试1.3.1 定义不同作用域的 Bean通过Scope注解指定 Bean 的作用域支持直接使用常量或字符串import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Scope; import org.springframework.web.context.annotation.RequestScope; import org.springframework.web.context.annotation.SessionScope; Component public class DogBeanConfig { // 默认单例可省略Scope注解 Bean public Dog defaultDog() { Dog dog new Dog(); dog.setName(旺旺); return dog; } // 显式声明单例 Bean Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) public Dog singleDog() { return new Dog(); } // 多例模式 Bean Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) public Dog prototypeDog() { return new Dog(); } // Web环境请求作用域 Bean RequestScope public Dog requestDog() { return new Dog(); } // Web环境会话作用域 Bean SessionScope public Dog sessionDog() { return new Dog(); } }1.3.2 测试不同作用域的 Bean 特性通过 Controller 测试 Bean 的创建规则RestController RequestMapping(/scope) public class ScopeController { Autowired private ApplicationContext applicationContext; // 测试单例多次请求返回同一个实例 GetMapping(/singleton) public String testSingleton() { Dog dog1 applicationContext.getBean(singleDog, Dog.class); Dog dog2 applicationContext.getBean(singleDog, Dog.class); return 单例Bean是否相同 (dog1 dog2); // 始终返回true } // 测试多例每次获取返回新实例 GetMapping(/prototype) public String testPrototype() { Dog dog1 applicationContext.getBean(prototypeDog, Dog.class); Dog dog2 applicationContext.getBean(prototypeDog, Dog.class); return 多例Bean是否相同 (dog1 dog2); // 始终返回false } // 测试请求作用域同一请求内实例相同不同请求不同 GetMapping(/request) public String testRequest() { Dog dog1 applicationContext.getBean(requestDog, Dog.class); Dog dog2 applicationContext.getBean(requestDog, Dog.class); return 同一请求内Bean是否相同 (dog1 dog2); // 同一请求返回true不同请求返回false } }1.4 作用域选择原则无状态 Bean推荐 singletonService、Dao、工具类等不存储实例级变量的 Bean单例模式可节省资源有状态 Bean推荐 prototype如用户请求上下文、包含临时数据的对象多例模式避免线程安全问题Web 场景单次请求数据 → request 作用域用户会话数据 → session 作用域应用全局数据 → application 作用域。二、Bean 的生命周期从创建到销毁的完整链路Bean 的生命周期是 Spring 管理 Bean 的核心流程描述了 Bean 从 “诞生”实例化到 “消亡”销毁的全生命周期。理解生命周期能帮助我们在关键节点扩展 Bean 的功能如初始化时加载配置、销毁时释放资源。2.1 生命周期的 5 个核心阶段Spring Bean 的生命周期可概括为 5 个阶段每个阶段都包含可扩展的 “钩子函数”阶段核心操作扩展点自定义逻辑1. 实例化为 Bean 分配内存空间创建原始对象调用构造函数-2. 属性赋值注入 Bean 的依赖Autowired、Setter 方法、构造函数注入-3. 初始化初始化 Bean回调 Aware 接口、执行自定义初始化方法、BeanPostProcessor 增强Aware 接口、PostConstruct、init-method、BeanPostProcessor4. 使用 Bean应用程序调用 Bean 的业务方法-5. 销毁 Bean容器关闭时释放 Bean 资源PreDestroy、destroy-method、DisposableBean 接口用 “买房入住” 的流程类比实例化 → 买房获得房屋主体从无到有属性赋值 → 装修配置房屋设施注入 “依赖”初始化 → 购置家电、家具完成初始化可入住使用 Bean → 入住正常使用房屋功能销毁 Bean → 卖房释放房屋资源。2.2 生命周期详细流程与代码演示2.2.1 自定义 Bean 生命周期演示类通过实现 Aware 接口、添加注解等方式演示生命周期各阶段的执行顺序import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import org.springframework.beans.factory.BeanNameAware; import org.springframework.stereotype.Component; Component public class BeanLifeComponent implements BeanNameAware { // 模拟依赖注入的属性 private String appName; // 1. 实例化调用构造函数 public BeanLifeComponent() { System.out.println(阶段1实例化 → 执行构造函数); } // 2. 属性赋值通过Setter方法注入依赖Autowired也可 public void setAppName(String appName) { this.appName appName; System.out.println(阶段2属性赋值 → 注入appName appName); } // 3. 初始化前Aware接口回调获取Bean名称、容器信息等 Override public void setBeanName(String beanName) { System.out.println(阶段3-1初始化 → Aware接口回调Bean名称 beanName ); } // 3. 初始化PostConstruct注解JDK标准注解初始化时执行 PostConstruct public void postConstruct() { System.out.println(阶段3-2初始化 → PostConstruct注解执行初始化逻辑); } // 4. 使用Bean业务方法 public void doBusiness() { System.out.println(阶段4使用Bean → 执行业务方法appName appName ); } // 5. 销毁BeanPreDestroy注解容器关闭时执行 PreDestroy public void preDestroy() { System.out.println(阶段5销毁Bean → PreDestroy注解执行释放资源); } }2.2.2 配置依赖注入与测试// 配置类注入appName属性 Configuration public class LifeConfig { Bean public BeanLifeComponent beanLifeComponent() { BeanLifeComponent component new BeanLifeComponent(); component.setAppName(SpringDemo); // 属性赋值 return component; } } // 测试类 SpringBootTest class LifeCycleTest { Autowired private BeanLifeComponent beanLifeComponent; Test void testLifeCycle() { // 4. 使用Bean beanLifeComponent.doBusiness(); } }2.2.3 执行结果与流程分析运行测试类控制台输出如下顺序严格遵循生命周期阶段1实例化 → 执行构造函数 阶段2属性赋值 → 注入appNameSpringDemo 阶段3-1初始化 → Aware接口回调Bean名称beanLifeComponent 阶段3-2初始化 → PostConstruct注解执行初始化逻辑 阶段4使用Bean → 执行业务方法appNameSpringDemo 阶段5销毁Bean → PreDestroy注解执行释放资源2.3 生命周期核心扩展点详解除了上述演示的PostConstruct和BeanNameAwareSpring 还提供了多个强大的生命周期扩展点1. Aware 接口系列初始化阶段回调用于获取 Spring 容器的核心信息常用接口BeanNameAware获取 Bean 在容器中的名称BeanFactoryAware获取 BeanFactory 容器实例ApplicationContextAware获取 ApplicationContext 容器实例BeanClassLoaderAware获取 Bean 的类加载器。2. BeanPostProcessorBean 后置处理器全局生效的 Bean 增强器可在所有 Bean 的初始化前后执行自定义逻辑无需 Bean 自身实现接口Component public class MyBeanPostProcessor implements BeanPostProcessor { // 初始化前执行 Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof BeanLifeComponent) { System.out.println(BeanPostProcessor初始化前增强 → beanName); } return bean; } // 初始化后执行 Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof BeanLifeComponent) { System.out.println(BeanPostProcessor初始化后增强 → beanName); } return bean; } }添加后执行结果会新增两行输出体现全局增强能力。3. 初始化 / 销毁方法的 3 种配置方式配置方式示例代码注解方式PostConstruct初始化、PreDestroy销毁接口方式实现InitializingBean重写afterPropertiesSet、DisposableBean重写destroyXML 配置方式bean init-methodinit destroy-methoddestroy/Spring Boot 中极少使用2.4 生命周期源码核心逻辑Spring 创建 Bean 的核心入口在AbstractAutowireCapableBeanFactory类的doCreateBean方法该方法封装了 “实例化→属性赋值→初始化” 的核心流程protected Object doCreateBean(String beanName, RootBeanDefinition mbd, Nullable Object[] args) { // 1. 实例化Bean创建原始对象 BeanWrapper instanceWrapper createBeanInstance(beanName, mbd, args); // 2. 属性赋值注入依赖 populateBean(beanName, mbd, instanceWrapper); // 3. 初始化Bean回调Aware、执行初始化方法、BeanPostProcessor增强 exposedObject initializeBean(beanName, exposedObject, mbd); return exposedObject; }通过源码可见Spring 的生命周期是通过 “模板方法模式” 实现的固定流程不变扩展点开放给开发者自定义逻辑。三、Spring Boot 自动配置原理约定优于配置的底层实现Spring Boot 的核心优势是 “自动配置”—— 无需手动编写大量 XML 或 Java 配置仅需引入依赖Spring Boot 就能自动加载所需的 Bean 和配置。这一切的底层逻辑都源于SpringBootApplication注解。3.1 自动配置的核心入口SpringBootApplication 注解Spring Boot 启动类的唯一标识是SpringBootApplication它是一个组合注解封装了 3 个核心注解Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Inherited SpringBootConfiguration // 1. 标识为配置类 EnableAutoConfiguration // 2. 开启自动配置核心 ComponentScan(excludeFilters { ... }) // 3. 包扫描 public interface SpringBootApplication { // 省略属性... }三个注解的核心作用SpringBootConfiguration本质是Configuration标识当前类是 Spring 的配置类可定义BeanComponentScan默认扫描启动类所在包及其子包下的Component、Service、Controller等注解将其注册为 BeanEnableAutoConfiguration自动配置的核心负责加载第三方依赖的配置类如 MyBatis、Redis 的自动配置。3.2 自动配置的核心逻辑EnableAutoConfigurationEnableAutoConfiguration的底层是通过Import(AutoConfigurationImportSelector.class)实现的其核心流程如下1. 注解拆解Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Inherited AutoConfigurationPackage // 1. 自动扫描启动类所在包的组件 Import(AutoConfigurationImportSelector.class) // 2. 加载自动配置类 public interface EnableAutoConfiguration { // 省略属性... }2. 关键步骤详解步骤 1AutoConfigurationPackage—— 扫描本地组件AutoConfigurationPackage通过Import(AutoConfigurationPackages.Registrar.class)将启动类所在包下的所有组件注册到 IoC 容器。这也是为什么 Spring Boot 项目的 Bean 通常要放在启动类同级或子包下。步骤 2AutoConfigurationImportSelector—— 加载第三方配置类AutoConfigurationImportSelector是ImportSelector接口的实现类其核心方法selectImports会读取所有依赖 Jar 包中META-INF/spring.factories或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件这些文件中定义了需要自动配置的类如RedisAutoConfiguration、MyBatisAutoConfiguration通过Conditional系列注解如ConditionalOnClass、ConditionalOnMissingBean动态判断是否加载该配置类。示例Redis 的自动配置在spring-boot-autoconfigure.jar的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中包含org.springframework.boot.autoconfigure.data.redis.RedisAutoConfigurationRedisAutoConfiguration的核心代码Configuration ConditionalOnClass(RedisOperations.class) // 存在RedisOperations类才加载即引入了Redis依赖 EnableConfigurationProperties(RedisProperties.class) // 绑定application.yml中的Redis配置 public class RedisAutoConfiguration { // 自动注册RedisTemplate Bean Bean ConditionalOnMissingBean(name redisTemplate) // 容器中没有redisTemplate时才创建 public RedisTemplateObject, Object redisTemplate(RedisConnectionFactory factory) { RedisTemplateObject, Object template new RedisTemplate(); template.setConnectionFactory(factory); return template; } }3. 动态加载的核心Conditional 系列注解自动配置并非加载所有配置类而是通过Conditional注解动态判断常用条件注解ConditionalOnClass类路径下存在指定类才加载如引入 Redis 依赖才加载RedisAutoConfigurationConditionalOnMissingBean容器中不存在指定 Bean 才加载允许用户自定义 Bean 覆盖默认配置ConditionalOnProperty配置文件中存在指定属性才加载如spring.redis.enabledtrueConditionalOnWebApplicationWeb 环境下才加载。3.3 自动配置的完整流程总结SpringBoot启动 → 加载SpringBootApplication → 触发EnableAutoConfiguration → AutoConfigurationImportSelector读取META-INF目录下的配置类 → 通过Conditional注解动态筛选配置类 → 加载配置类中的Bean到IoC容器 → 应用程序可直接注入使用这些Bean3.4 手动模拟自动配置理解第三方依赖的加载逻辑当我们引入第三方依赖如自定义框架时可模仿 Spring Boot 的自动配置方式让 Spring 自动加载 Bean1. 第三方依赖中定义配置类// 第三方依赖的配置类包路径com.bite.autoconfig Component public class BiteConfig { public void printInfo() { System.out.println(第三方依赖的Bean加载成功); } }2. 第三方提供 EnableXXX 注解// 第三方依赖的注解封装Import Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Import(BiteConfig.class) // 导入第三方配置类 public interface EnableBiteConfig { }3. 应用程序启用注解// Spring Boot启动类 SpringBootApplication EnableBiteConfig // 启用第三方的自动配置 public class DemoApplication { public static void main(String[] args) { ApplicationContext context SpringApplication.run(DemoApplication.class, args); // 直接获取第三方依赖的Bean BiteConfig biteConfig context.getBean(BiteConfig.class); biteConfig.printInfo(); // 输出第三方依赖的Bean加载成功 } }四、核心知识点总结与实战建议4.1 核心知识点梳理主题核心结论Bean 作用域6 种作用域常用 singleton无状态和 prototype有状态Web 环境用 request/sessionBean 生命周期实例化→属性赋值→初始化→使用→销毁扩展点PostConstruct、BeanPostProcessor、Aware 接口自动配置核心是 EnableAutoConfiguration通过加载 META-INF 目录下的配置类实现 “约定优于配置”条件注解Conditional 系列控制配置类动态加载支持用户自定义 Bean 覆盖默认配置4.2 实战避坑建议Bean 作用域单例 Bean 避免定义可修改的成员变量如需存储临时数据使用 ThreadLocalWeb 环境的 request/session 作用域 Bean若被单例 Bean 依赖需通过Scope(proxyMode ScopedProxyMode.TARGET_CLASS)生成代理。Bean 生命周期初始化逻辑优先使用PostConstructJDK 标准注解兼容性好而非init-method销毁逻辑优先使用PreDestroy用于释放数据库连接、线程池等资源。Spring Boot 自动配置自定义 Bean 可覆盖自动配置如自定义RedisTemplate会替代默认实现排除不需要的自动配置SpringBootApplication(exclude RedisAutoConfiguration.class)查看自动配置报告启动时添加debugtrue控制台会输出哪些配置类已生效、哪些被排除。五、总结Spring 的核心是 IoC 容器对 Bean 的精细化管理而 Bean 的作用域和生命周期是管理 Bean 的基础Spring Boot 的自动配置则是在此基础上的 “开箱即用” 优化。掌握本文的三大知识点能根据业务场景选择合适的 Bean 作用域避免线程安全问题能利用 Bean 生命周期的扩展点灵活定制 Bean 的初始化和销毁逻辑能理解 Spring Boot 自动配置的底层逻辑轻松排查配置冲突、自定义配置。