一、将特定的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方法。
注意:
-
非延迟加载的类中不能自动注入延迟加载的类,否则会导致延迟加载失效。例如,如果一个Controller类不是延迟加载的,但其中使用了@Autowired注解注入了一个延迟加载的Service类,那么在程序初始化时,Controller会被初始化,同时Service也会被初始化,从而导致懒加载失效。
-
如果想要实现某个类的延迟加载,需要确保调用链前都不存在非延迟加载类,否则延迟加载会失效。