Spring源码阅读 -- > Bean的延迟加载

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的创建流程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是一个Spring MVC项目的配置文件,用于配置一些关键的组件和功能。让我一一解释一下: 1. `<mvc:annotation-driven/>`:启用Spring MVC注解驱动,使得控制器中的注解生效。 2. `<context:component-scan base-package="com.dgy"/>`:指定需要扫描的包,将被注解标记的作为组件进行扫描。 3. `<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">`:配置视图解析器,用于解析并定位JSP视图文件。 4. `<context:property-placeholder location="classpath:jdbc.properties"/>`:加载属性文件jdbc.properties中的配置信息。 5. `<bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource">`:配置数据库连接池,使用阿里巴巴Druid连接池。 6. `<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">`:配置MyBatis的SqlSessionFactory,指定数据源。 7. `<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">`:配置MyBatis的Mapper接口扫描器,用于自动扫描并实例化Mapper接口的实现。 8. `<tx:annotation-driven/>`:启用Spring事务注解驱动,使得注解标记的方法可以被事务管理。 9. `<aop:aspectj-autoproxy/>`:启用AOP自动代理,用于支持基于切面的编程。 10. `<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">`:配置事务管理器,使用Spring的DataSourceTransactionManager,将数据源注入事务管理器。 希望以上解释对您有所帮助!如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值