0x01 描述
lazy-init: 懒加载,指Spring延迟加载Bean,true=延迟加载,false=不延迟加载,默认为falseSpring在启动的时候会加载一些对象实例(由ApplicationContext实现)像初始化Action、Service、Dao、数据库连接、等...此时在Spring启动时,就会对所有的标签scope属性为singleton的提前进行实例化这样可以减轻web服务器运行时的负担,但在本地进行开发时并不适合所以可以在对应Bean标签中使用lazy-init=true,或是通过注解@Lazy(value="true")设置延长启动后面会在第一次请求时通过GetBean获得实例注意一: lazy-init="false"只对scope属性为singleton才有效注意二: 如果scope属性为prototype,无论lazy-init的属性值是什么,都只在通过GetBean时进行实例化
0x02 小例子
0x02.1 前置操作
// 在./SpringDemo/src/main/java/com/test/创建个UserInfo.java// 目录: ./SpringDemo/src/main/java/com/test/// 文件名: UserInfo.javapackage com.test;public class UserInfo { public UserInfo() { System.out.println("UserInfo被初始化了"); }}
0x02.2 例子一
// 一般情况下,执行情况// 第一步// 打开applicationContext.xml,添加如下信息// 设置为false时, 在Spring启动时,就会对所有的标签scope属性为singleton的提前进行实例化// 注: 不设置lazy-init属性,默认为false<bean id="userInfo" class="com.test.UserInfo" lazy-init="false"/>// 第二步// 此时就会进行实例化ApplicationContext context = new ClassPathXmlApplicationContext("lazy-init-config.xml");
// 第一步// 添加个userInfo的Bean并设置lazy-init属性为false// 目录: ./SpringDemo/src/main/resources/// 文件名: lazy-init-config.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" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userInfo" class="com.test.UserInfo" lazy-init="false"/></beans>
// 第二步// 创建一个测试类lazyInitTest进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: lazyInitTest.javaimport org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class lazyInitTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("lazy-init-config.xml"); }}// 运行结果UserInfo被初始化了
0x02.3 例子二
// lazy-init=true时,执行情况// 第一步// 如果不想提前进行实例化, 可以设置lazy-init的属性值为true// 这样就不会在Spring启动时进行实例化, 而是在第一次通过GetBean获取Bean时实例化<bean id="userInfo" class="com.test.UserInfo" lazy-init="true"/>// 第二步// 此时没有进行实例化ApplicationContext context = new ClassPathXmlApplicationContext("lazy-init-config.xml");ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// 第三步// 此时进行实例化context.getBean("userInfo");
// 第一步// 添加个userInfo的Bean并设置lazy-init属性为true// 目录: ./SpringDemo/src/main/resources/// 文件名: lazy-init-config2.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" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="userInfo" class="com.test.UserInfo" lazy-init="true"/></beans>
// 第二步// 创建一个测试类lazyInitTest进行测试// 目录: ./SpringDemo/src/test/java/// 文件名: lazyInitTest2.javaimport org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class lazyInitTest2 { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("lazy-init-config2.xml"); // 这一样必须加,不然不会提前进行实例化的 context.getBean("userInfo"); }}// 运行结果UserInfo被初始化了