spring容器的懒加载lazy-init设置

本文详细介绍了Spring容器中的懒加载模式,包括其概念、原理及如何在配置文件中启用懒加载。通过示例代码展示了在不同配置下,对象实例化行为的变化,帮助开发者理解并灵活运用懒加载特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

默认情况下,spring的IOC容器中lazy-init是false的,即没有打开懒加载模式。

如果你没有看到这个lazy-init 的参数设置就说明是false啦。

那么什么是懒加载?

懒加载---就是我们在spring容器启动的是先不把所有的bean都加载到spring的容器中去,而是在当需要用的时候,才把这个对象实例化到容器中。

例如我有如下的代码:

package com.luch.spring.demo;

import org.springframework.beans.factory.annotation.Autowired;

import com.luch.spring.bean.Person;

public class NewPerson {

@Autowired
private Person person;

public NewPerson(){
System.out.println("lazy loading...");
}
public void printMsg(){
if(person !=null) {
System.out.println(person.getName());
} else {
System.out.println("no person initialize!");
}
}

public void setPerson(Person person) {
//this.person = person;
}


}

在无惨构造器里输出一句话,然后我先不设置懒加载模式:我有一个beans.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<context:annotation-config/>
<bean id="person" class="com.luch.spring.bean.Person">
<property name="id" value="22"></property>
<property name="name" value="Jack"></property>
</bean>

<bean id="newPerson" class="com.luch.spring.demo.NewPerson">
<property name="person" ref="person"></property>
</bean>

</beans>


然后我用一个junit来做测试:

package junit.test;

import static org.junit.Assert.*;

import org.junit.Test;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.luch.spring.demo.NewPerson;

public class JunitTest {

@Test
public void printMsg(){
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("/beans.xml");
//NewPerson test = (NewPerson) ctx.getBean("newPerson");
//test.printMsg();
}
}



这个时候输出的结果为:
[color=orange]四月 17, 2014 9:26:41 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@762efe5d: startup date [Thu Apr 17 21:26:41 CST 2014]; root of context hierarchy
四月 17, 2014 9:26:42 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [beans.xml]
四月 17, 2014 9:26:42 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@77caeb3e: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,person,newPerson,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy
lazy loading..[/color]
即对象被实例化了,也就是被加载到spring的容器中去了。


然后我们设置一下懒加载模式:我们beans.xml的配置文件. lazy-init="true"即

<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<context:annotation-config/>
<bean id="person" class="com.luch.spring.bean.Person">
<property name="id" value="22"></property>
<property name="name" value="Jack"></property>
</bean>

<bean id="newPerson" lazy-init="true" class="com.luch.spring.demo.NewPerson">
<property name="person" ref="person"></property>
</bean>

</beans>


再重新跑一次junit:结果为:
[color=orange]四月 17, 2014 9:33:54 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@762efe5d: startup date [Thu Apr 17 21:33:54 CST 2014]; root of context hierarchy四月 17, 2014 9:33:54 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [beans.xml]四月 17, 2014 9:33:54 下午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@77caeb3e: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,person,newPerson,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy[/color]
即没有了实例化的过程,这个时候只有在你需要它的时候,它才会出现。比如你执行了:
NewPerson test = (NewPerson) ctx.getBean("newPerson"); 这个时候你的bean就实例化出来了。
那么是不是我如果很多的bean都不想在IOC容器启动的时候就加载,而是要beans.xml的每个bean里都加上lazy-init属性呢。
不用的,spring提供了default-lazy-init方法来实现这个业务。
我们只要在beans的头里面加上这个就ok 了

< beans default-lazy-init ="true" >

以上代码本人亲测,可用

csdn博客真的垃圾,真心用不下去了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值