0x01 描述
lazy-init: 懒加载,指Spring延迟加载Bean,true=延迟加载,false=不延迟加载,默认为false
Spring在启动的时候会加载一些对象实例(由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.java
package 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.java
import 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.java
import 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被初始化了