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. 如果想要实现某个类的延迟加载,需要确保调用链前都不存在非延迟加载类,否则延迟加载会失效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值