php个人网站源码带音乐,福州网站快速排名提升,莱芜摩托车网站,泗阳做网站使用细节
默认是单例singleton,在启动容器时,默认就会创建,并放入到singletonObjects集合中存储实例当 设置为多实例机制后,该bean是在getBean()时才创建如果是单例singleton,同时希望在getBean时才创建,可以 指定懒加载 lazy-init“true” (注意默认是false)通常情况下, lazy…使用细节默认是单例singleton,在启动容器时,默认就会创建,并放入到singletonObjects集合中存储实例当 设置为多实例机制后,该bean是在getBean()时才创建如果是单例singleton,同时希望在getBean时才创建,可以 指定懒加载 lazy-init“true” (注意默认是false)通常情况下, lazy-init 就使用默认值false ,在开发看来,用空间换时间是值得的,除非有特殊的要求.如果scope“prototype” 这时你的 lazy-init 属性的值不管是 true,还是false 都是在getBean时候,才创建对象.BeanDefinition 与 singletonObjects 的区别BeanDefinition存储内容: 存储 bean 的元数据信息配置信息包含内容: bean 的类名、作用域(scope)、属性值、依赖关系、初始化方法、销毁方法等创建时机: Spring 容器启动时解析 XML/注解配置后创建存储位置: 保存在 BeanFactory/ApplicationContext 中作为创建 bean 实例的模板singletonObjects存储内容: 存储单例 bean 的实际实例对象包含内容: 已经完成实例化、属性注入、初始化的 bean 对象创建时机: 单例 bean 实例化后默认启动时懒加载则第一次 getBean 时存储位置: 作为单例缓存避免重复创建相同实例非单例 bean 的处理:非单例 bean如 prototype 作用域不会被放入 singletonObjects不同作用域的 bean 存储方式singleton单例: 实例放入singletonObjects缓存重复使用prototype原型/多实例: 每次调用getBean()都创建新实例不缓存使用后由调用者负责销毁request请求: 每个 HTTP 请求创建新实例请求结束后销毁仅 Web 环境session会话: 每个 HTTP 会话创建新实例会话结束后销毁仅 Web 环境application应用: 每个 ServletContext 创建新实例应用停止后销毁仅 Web 环境结论: 只有singleton作用域的 bean 会被放入singletonObjects集合其他作用域的 bean 不会被缓存。Bean 的生命周期生命周期概述Spring Bean 的生命周期是指从 Bean 被创建、初始化、使用到最终销毁的完整过程。Spring 容器负责管理 Bean 的整个生命周期确保 Bean 在合适的时机完成相应的操作。详细阶段说明根据 xml 配置文件或注解配置, Spring 容器会解析 Bean 定义,并创建一个 BeanDefinition 对象, 该对象包含了 Bean 的元数据信息(类名,作用域,属性值,依赖关系等)执行 BeanFactoryPostProcessor: 在所有 BeanDefinition 加载完成后Bean 实例化之前Spring 容器会调用所有实现了 BeanFactoryPostProcessor 接口的类的postProcessBeanFactory方法。这些方法可以修改 BeanDefinition 的元数据信息如属性值、作用域等通过反射机制,根据 BeanDefinition 中的类名,调用对应的构造函数,创建 Bean 的实例.属性注入 (DI) : Spring 容器会根据 BeanDefinition 中的依赖关系,将对应的 Bean 实例注入到目标 Bean 的属性中.初始化 : 调用 Bean 的初始化方法(如实现 InitializingBean 接口的 afterPropertiesSet 方法,或指定的 init-method 方法)通过getBean()方法获取Bean实例时,Spring容器会返回该Bean的实例.销毁 : 当 Bean 实例不再需要时,Spring 容器会调用 Bean 的销毁方法(如实现 DisposableBean 接口的 destroy 方法,或指定的 destroy-method 方法)1. BeanDefinition 加载与 BeanFactoryPostProcessor 执行时机: Spring 容器启动时所有 BeanDefinition 加载完成后Bean 实例化之前操作:Spring 容器解析 XML/注解配置创建所有 BeanDefinition 对象调用所有实现了BeanFactoryPostProcessor接口的类的postProcessBeanFactory方法作用:可以修改 BeanDefinition 的元数据信息如属性值、作用域、初始化方法等典型应用PropertyPlaceholderConfigurer处理 ${} 占位符、CustomScopeConfigurer注册自定义作用域执行特点: 在所有 Bean 实例化之前执行且只执行一次2. 实例化Instantiation时机: Spring 容器根据 BeanDefinition 创建 Bean 实例操作: 调用 Bean 的构造函数创建对象结果: 获得一个原始的 Bean 实例尚未设置任何属性3. 属性注入Populate时机: 实例化完成后操作: 根据配置XML/注解将依赖注入到 Bean 的属性中实现: 调用 setter 方法或通过构造函数注入依赖这里的bean指: 刚刚完成实例化阶段通过构造函数创建的原始 Bean 实例。此时它已经是一个 Java 对象但尚未设置任何属性值处于原始状态。Spring 容器会将配置中定义的属性值、依赖对象等注入到这个原始实例中使其成为一个完整可用的 Bean。例如当实例化 User 类获得一个 user 对象后此时 user.name 可能为 null默认值属性注入阶段会将配置的 name 值注入到 user 对象中。4. 初始化前Before Initialization时机: 属性注入完成后操作: 调用 BeanPostProcessor 的postProcessBeforeInitialization方法作用: 可以在 Bean 初始化前对其进行增强处理5. 初始化Initialization时机: 初始化前阶段完成后操作: 执行自定义的初始化逻辑实现方式:实现InitializingBean接口的afterPropertiesSet()方法在配置中指定init-method属性使用PostConstruct注解标记初始化方法6. 初始化后After Initialization时机: 初始化完成后操作: 调用 BeanPostProcessor 的postProcessAfterInitialization方法作用: 可以在 Bean 初始化后进行代理创建或其他增强处理7. 加入 IoC 容器Add to IoC Container时机: 初始化后阶段完成后仅针对 singleton 作用域操作: Spring 容器将完全初始化的单例 Bean 放入singletonObjects缓存中作用: 后续调用getBean()时直接从缓存返回避免重复创建非单例 Bean 的处理: prototype、request、session、application 等作用域的 Bean不会被加入 singletonObjects 缓存8. 使用阶段In Use时机: Bean 完全初始化后单例 Bean 已加入容器缓存操作: Bean 可以被应用程序使用通过getBean()获取特点:单例 Bean从singletonObjects缓存获取重复使用原型 Bean每次调用getBean()都创建新实例使用后由调用者负责管理其他作用域根据各自作用域规则创建和管理9. 销毁前Before Destruction时机: 容器关闭前仅单例 Bean操作: 执行自定义的销毁逻辑实现方式:实现DisposableBean接口的destroy()方法在配置中指定destroy-method属性使用PreDestroy注解标记销毁方法10. 销毁Destruction时机: 销毁前阶段完成后操作: 释放 Bean 占用的资源注意: 仅单例 Bean 会被容器管理销毁原型 Bean 由调用者负责销毁生命周期回调方法示例publicclassUser{privateStringname;// 构造函数实例化阶段调用publicUser(){System.out.println(1. User 构造函数被调用实例化);}// setter 方法属性注入阶段调用publicvoidsetName(Stringname){this.namename;System.out.println(2. setName 被调用属性注入);}// InitializingBean 接口方法初始化阶段调用OverridepublicvoidafterPropertiesSet(){System.out.println(3. afterPropertiesSet 被调用InitializingBean 接口);}// 自定义初始化方法配置 init-method 指定publicvoidinit(){System.out.println(4. init 方法被调用自定义初始化);}// 业务方法使用阶段调用publicvoidsayHello(){System.out.println(5. sayHello 方法被调用使用中);}// DisposableBean 接口方法销毁阶段调用Overridepublicvoiddestroy(){System.out.println(6. destroy 方法被调用DisposableBean 接口);}// 自定义销毁方法配置 destroy-method 指定publicvoidcleanup(){System.out.println(7. cleanup 方法被调用自定义销毁);}}不同作用域对生命周期的影响作用域实例化时机初始化时机销毁时机容器管理销毁singleton容器启动默认/第一次 getBean实例化后立即初始化容器关闭前是prototype每次 getBean实例化后立即初始化调用者负责销毁否request每个 HTTP 请求开始实例化后立即初始化HTTP 请求结束是Web环境session每个 HTTP 会话开始实例化后立即初始化HTTP 会话结束是Web环境application应用启动实例化后立即初始化应用停止是Web环境关系说明Spring 先读取配置创建BeanDefinition元数据然后根据BeanDefinition的配置创建实际的 bean 实例单例实例创建完成后会被放入singletonObjects缓存中后续调用getBean()获取单例时直接从缓存返回不再重新创建因此“存储到实体类中 BeanDefinition” 和 “放入到 singletonObjects 集合” 描述的是 Spring 管理 bean 的不同阶段BeanDefinition 是配置模板singletonObjects 是实例缓存两者都是正确的只是描述了 bean 生命周期中的不同环节。