建站公司生存难,警惕网站免费看手机,运城网站推广,网站头条怎么做延迟加载#xff08;Lazy Loading#xff09;是 Spring 容器管理 Bean 的一种策略#xff0c;指 只有在需要时#xff08;调用 getBean() 方法获取 Bean 时#xff09;才会实例化该 Bean。这是 Spring 提供的一种优化机制#xff0c;用于提高启动效率和降低资源占用。 1.…延迟加载Lazy Loading是 Spring 容器管理 Bean 的一种策略指 只有在需要时调用 getBean() 方法获取 Bean 时才会实例化该 Bean。这是 Spring 提供的一种优化机制用于提高启动效率和降低资源占用。 1. 延迟加载的含义
在延迟加载模式下Spring 容器初始化时不会立即实例化所有 Bean而是等到真正需要使用时即调用 getBean() 方法时才创建 Bean 实例。如果不启用延迟加载非 Lazy 模式则所有单例singleton Bean 会在容器启动时立即实例化。 2. 延迟加载的优点 节省资源 容器启动时不需要加载和创建所有 Bean启动速度更快。避免不必要的对象实例化降低内存占用尤其是对于未使用的 Bean。 适合轻量级应用 在资源有限的环境中如嵌入式系统延迟加载可以显著优化性能。在开发或测试阶段也可以通过延迟加载缩短启动时间。 按需加载 只有在确实需要使用某个 Bean 时才会创建它的实例避免初始化不必要的逻辑。 3. 延迟加载的实现方式
(1) 使用 Lazy 注解
在类或方法上添加 Lazy 注解可以让单例 Bean 延迟加载。
示例代码
Component
Lazy // 延迟加载
public class ExpensiveBean {public ExpensiveBean() {System.out.println(ExpensiveBean created!);}
}测试代码
ApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);
System.out.println(Container initialized.);
ExpensiveBean bean context.getBean(ExpensiveBean.class); // 此时 Bean 才会创建运行结果
Container initialized.
ExpensiveBean created!解释
Lazy 生效后ExpensiveBean 不会在容器启动时被创建。只有在调用 getBean() 时ExpensiveBean 才会被实例化。 (2) 如果未使用 Lazy
代码
Configuration
public class AppConfig {Beanpublic ExpensiveBean expensiveBean() {return new ExpensiveBean(); // 无 Lazy默认预加载}
}运行结果
ExpensiveBean created!
Container initialized.解释
默认情况下ApplicationContext 会在启动时实例化所有单例 Bean所以在输出 Container initialized. 前就会创建 ExpensiveBean。 (3) XML 配置方式
在 XML 文件中为 Bean 配置延迟加载
bean idexpensiveBean classcom.example.ExpensiveBean lazy-inittrue/(4) 在 Configuration 中使用
对于使用 Java 配置的项目可以在配置类中的 Bean 方法上添加 Lazy
Configuration
public class AppConfig {BeanLazypublic ExpensiveBean expensiveBean() {return new ExpensiveBean();}
}4. 延迟加载的默认行为
(1) BeanFactory 的默认行为
BeanFactory 是一个轻量级容器默认使用延迟加载策略。它不会在容器启动时实例化任何 Bean而是等到调用 getBean() 方法时才实例化。
(2) ApplicationContext 的默认行为
ApplicationContext 是 Spring 容器的常用实现默认会在启动时预加载所有单例singleton Bean。例外情况 如果使用 Lazy 注解或 XML 中的 lazy-inittrue单例 Bean 会延迟加载。非单例prototype Scope的 Bean 本身默认是延迟加载的。 5. 延迟加载与非延迟加载的对比
行为延迟加载非延迟加载实例化时机调用 getBean() 时实例化容器启动时实例化适用范围需要优化启动时间或资源消耗的场景高性能服务器或需要预加载依赖的场景容器类型BeanFactory 默认延迟加载ApplicationContext 默认非延迟加载预加载的 Bean无除非显式调用单例 Bean 默认全部实例化性能表现启动速度快可能会导致首次调用延迟启动时占用更多内存运行时性能更高 6. 示例场景 资源密集型对象的加载 如果某个 Bean 的创建非常耗时例如连接外部服务使用延迟加载可以避免容器启动时的性能瓶颈。 开发与测试阶段 在开发和测试中延迟加载可以缩短容器的启动时间提升开发效率。 条件性加载 某些 Bean 只有在特定条件下才会被使用延迟加载可以避免不必要的资源消耗。 7. 总结
延迟加载的本质 Bean 只有在第一次使用时才会被实例化。优点 减少容器启动时的资源消耗适合轻量级或资源受限的场景。默认行为 BeanFactory 默认延迟加载而 ApplicationContext 默认预加载单例 Bean。实现方式 使用 Lazy 注解或 XML 配置轻松启用延迟加载。
通过灵活地使用延迟加载可以显著优化应用程序的启动时间和资源利用率特别是在复杂项目或资源密集型应用中。