自学内容网 自学内容网

Spring Bean的提前加载和懒加载

一、将特定的bean 提前加载来满足其他bean对该bean 的依赖

通过实现 BeanFactoryPostProcessor 该接口重写postProcessBeanFactory() 方法来进行bean的提前加载

在Bean1中加载Bean2 让Bean提前加载。

再写一个Bean3让系统加载(无调用)

项目启动先加载Bean2 再加载Bean3

价值

懒加载

懒加载是Spring框架中的一种机制,用于在需要时才创建Bean,而不是在容器启动时立即创建。特别是在Bean数量较多的情况下,可以减少启动时的时间和内存消耗。

配置方式:

1.XML配置

在XML文件中,可以通过设置lazy-init="true"来启用懒加载。

<bean id="cart" class="cn.tedu.beans.Cart" lazy-init="true"></bean>

为全局配置懒加载:

<beans default-lazy-init="true">
<bean id="cart" class="cn.tedu.beans.Cart"></bean>
</beans>

2.注解配置

在实际开发中,注解方式更为常用。可以使用@Lazy注解来启用懒加载。

@Lazy
@Component
public class Book {
public Book() {
System.out.println("调用构造方法,创建book...");
}
}

在配置类中也可以使用@Lazy注解:

@Configuration
public class Config {
@Lazy
@Bean
public Book getBook() {
return new Book();
}
}

原理:

Spring在扫描加载Bean时,会读取@Lazy和@Component注解的相应值,并设置Bean定义的lazyInit属性。读取注解配置时最终会调用ClassPathBeanDefinitionScanner及其子类实现的doScan方法。

在Spring框架刷新时,会初始化非延迟加载的单例Bean。具体实现是在AbstractApplicationContext类的refresh方法中调用finishBeanFactoryInitialization方法。

注意:

  1. 非延迟加载的类中不能自动注入延迟加载的类,否则会导致延迟加载失效。例如,如果一个Controller类不是延迟加载的,但其中使用了@Autowired注解注入了一个延迟加载的Service类,那么在程序初始化时,Controller会被初始化,同时Service也会被初始化,从而导致懒加载失效。

  2. 如果想要实现某个类的延迟加载,需要确保调用链前都不存在非延迟加载类,否则延迟加载会失效。


原文地址:https://blog.csdn.net/2401_83691559/article/details/145164021

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!