1、Spring中配置延迟加载
1、xml配置:通过在xml中bean标签的 lazy-init的属性来声明该类是否延迟加载(不配置则默认为非延迟加载的)
<bean id="userBean" class="com.demo.spring.UserBean" lazy-init="true"/>
2、注解方式:通过在类中添加@Lazy的注解来声明该类为延迟加载的类
@Lazy
@Component
public class LazyBean {
}
2、Spring中Bean的延迟加载
通过之前学习的 Spring容器中Bean的创建流程 可以知道,Spring容器中的单例非延迟的Bean的加载过程,而延迟加载则不会在Spring容器初始化的时候进行初始化,并且被添加进Spring容器中,延迟加载的Bean则是会在代码中调用getBean方法时才会进行初始化,被添加至Spring容器中去
3、 源码学习
如上图Bean加载过程中的代码可以知道,在Spring容器初始化的过程中,声明为延迟加载的Bean对象不会在这个过程被加载
getBean方法获取延迟加载Bean:
1、xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd
">
<!-- 设置UserBean为延迟加载Bean -->
<bean id="userBean" class="com.demo.spring.UserBean" lazy-init="true"/>
</beans>
2、Bean配置
package com.demo.spring;
public class UserBean{
}
3、测试方法
public void testIoC() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
UserBean userBean= applicationContext.getBean(UserBean.class);
System.out.println(userBean);
}
在getBean方法处打断点,如下图所示,可以看到在已经初始化完成的applicationContext容器中并没有发现被声明为延迟加载的UserBean
进入getBean处的断点,找到关键方法DefaultListableBeanFactory的resolveBean方法
进入resolveBean方法中的 resolveNamedBean方法
可以看到在获取到了对应的BeanDefinition信息之后,又开始走我们熟悉的Spring容器初始化的时Bean的创建方法AbstractBeanFactory类的getBean方法了,此后的流程跟Spring容器初始化Bean的创建流程一样 具体可见 Spring容器Bean的创建流程