0x01 描述

  1. lazy-init: 懒加载,指Spring延迟加载Bean,true=延迟加载,false=不延迟加载,默认为false
  2. Spring在启动的时候会加载一些对象实例(由ApplicationContext实现)
  3. 像初始化ActionServiceDao、数据库连接、等...
  4. 此时在Spring启动时,就会对所有的标签scope属性为singleton的提前进行实例化
  5. 这样可以减轻web服务器运行时的负担,但在本地进行开发时并不适合
  6. 所以可以在对应Bean标签中使用lazy-init=true,或是通过注解@Lazy(value="true")设置延长启动
  7. 后面会在第一次请求时通过GetBean获得实例
  8. 注意一: lazy-init="false"只对scope属性为singleton才有效
  9. 注意二: 如果scope属性为prototype,无论lazy-init的属性值是什么,都只在通过GetBean时进行实例化

0x02 小例子

0x02.1 前置操作

  1. // 在./SpringDemo/src/main/java/com/test/创建个UserInfo.java
  2. // 目录: ./SpringDemo/src/main/java/com/test/
  3. // 文件名: UserInfo.java
  4. package com.test;
  5. public class UserInfo {
  6. public UserInfo() {
  7. System.out.println("UserInfo被初始化了");
  8. }
  9. }

0x02.2 例子一

  1. // 一般情况下,执行情况
  2. // 第一步
  3. // 打开applicationContext.xml,添加如下信息
  4. // 设置为false时, 在Spring启动时,就会对所有的标签scope属性为singleton的提前进行实例化
  5. // 注: 不设置lazy-init属性,默认为false
  6. <bean id="userInfo" class="com.test.UserInfo" lazy-init="false"/>
  7. // 第二步
  8. // 此时就会进行实例化
  9. ApplicationContext context = new ClassPathXmlApplicationContext("lazy-init-config.xml");
  1. // 第一步
  2. // 添加个userInfo的Bean并设置lazy-init属性为false
  3. // 目录: ./SpringDemo/src/main/resources/
  4. // 文件名: lazy-init-config.xml
  5. <?xml version="1.0" encoding="UTF-8"?>
  6. <beans xmlns="http://www.springframework.org/schema/beans"
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  8. xsi:schemaLocation="http://www.springframework.org/schema/beans
  9. https://www.springframework.org/schema/beans/spring-beans.xsd">
  10. <bean id="userInfo" class="com.test.UserInfo" lazy-init="false"/>
  11. </beans>
  1. // 第二步
  2. // 创建一个测试类lazyInitTest进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: lazyInitTest.java
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7. public class lazyInitTest {
  8. public static void main(String[] args) {
  9. ApplicationContext context = new ClassPathXmlApplicationContext("lazy-init-config.xml");
  10. }
  11. }
  12. // 运行结果
  13. UserInfo被初始化了

0x02.3 例子二

  1. // lazy-init=true时,执行情况
  2. // 第一步
  3. // 如果不想提前进行实例化, 可以设置lazy-init的属性值为true
  4. // 这样就不会在Spring启动时进行实例化, 而是在第一次通过GetBean获取Bean时实例化
  5. <bean id="userInfo" class="com.test.UserInfo" lazy-init="true"/>
  6. // 第二步
  7. // 此时没有进行实例化
  8. ApplicationContext context = new ClassPathXmlApplicationContext("lazy-init-config.xml");ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  9. // 第三步
  10. // 此时进行实例化
  11. context.getBean("userInfo");
  1. // 第一步
  2. // 添加个userInfo的Bean并设置lazy-init属性为true
  3. // 目录: ./SpringDemo/src/main/resources/
  4. // 文件名: lazy-init-config2.xml
  5. <?xml version="1.0" encoding="UTF-8"?>
  6. <beans xmlns="http://www.springframework.org/schema/beans"
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  8. xsi:schemaLocation="http://www.springframework.org/schema/beans
  9. https://www.springframework.org/schema/beans/spring-beans.xsd">
  10. <bean id="userInfo" class="com.test.UserInfo" lazy-init="true"/>
  11. </beans>
  1. // 第二步
  2. // 创建一个测试类lazyInitTest进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: lazyInitTest2.java
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7. public class lazyInitTest2 {
  8. public static void main(String[] args) {
  9. ApplicationContext context = new ClassPathXmlApplicationContext("lazy-init-config2.xml");
  10. // 这一样必须加,不然不会提前进行实例化的
  11. context.getBean("userInfo");
  12. }
  13. }
  14. // 运行结果
  15. UserInfo被初始化了