乐趣区

spring学习之懒加载

Lazy

正常情况下,bean 的加载是容器启动后就开始的,这样如果加载的过程中有错误,可以立马发现。由于一些特定的业务需求,需要某些 bean 在 IoC 容器在第一次请求时才创建,可以把这些 bean 标记为延时加载。

XML

在 XML 配置文件中,是通过 bean 标签的 lazy-init 属性来控制的,如果控制多个 bean 都是懒加载,那么可以把 bean 放入 beans 标签下面,通过 beans 标签的 default-lazy-init="true" 来控制。
xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="one" class="com.learn.di.One" lazy-init="true"/>
    <bean id="two" class="com.learn.di.Two"/>

</beans>

One 和 Two

public class One {public One(){System.out.println("one init");
    }
}
public class Two {public Two(){System.out.println("two init");
    }
}

测试代码:

@Test
public void test() {ApplicationContext app = new ClassPathXmlApplicationContext("di7.xml");
    System.out.println("加载完毕");
    app.getBean("one");
}

运行结果如下:

加载完毕之前,只打印了 two init,调用 getBean(“one”)后,才打印出 one init,可以看出,是在调用后才加载。

注解

在注解中,是通过 @Lazy 来控制的。
MyConfig

@Configuration
public class MyConfig {@Bean()
    @Lazy
    public One one(){return new One();
    }

    @Bean()
    public Two two(){return new Two();
    }
}

测试代码

@Test
public void test() {ApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
    System.out.println("加载完毕");
    app.getBean("one");
}

运行结果如下:

退出移动版