Spring中懒加载与非懒加载和初始化与销毁

本文深入探讨Spring框架中懒加载与非懒加载的区别,通过实例解析如何在配置文件中设置bean的懒加载属性,以及初始化和销毁方法的指定方式。文章通过对比懒加载和非懒加载的优缺点,帮助读者理解何时选择何种加载策略。

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

spring中懒加载与非懒加载

懒加载

新建一个duck类

package cn.java.lazy4;
/**
 * @Title:  Duck.java
 * @Package cn.java.lazy4
 * @author: Matthew
 * @date: 2019年3月6日 下午7:37:06
 */

public class Duck {
	
	public Duck() {
		System.out.println("Duck.....诞生了");
	}
	
	public void behavior() {
		System.out.println("鸭在水上漂");
	}
}

我们可以新建一个子配置文件然后再加入到主配置文件中

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

	<!-- 
		lazy-init:告诉spring容器是否以懒加载的方式创建对象
		取值有三个:true、false、default
			true/default:以懒加载的方式创建对象,当真正使用对象的时候才创建对象
			false:非懒加载,容器启动立刻创建对象
		
		懒加载与非懒加载的优缺点:
		懒加载:对象使用的时候才去创建。节省资源,但不利于提前发现错误
		非懒加载:容器启动时立马创建。消耗资源,有利于提前发现错误
	 -->
	<bean id="bigDuck" class="cn.java.lazy4.Duck" lazy-init="true"></bean>         

</beans>
<import resource="cn/java/lazy4/duck.xml"/>
package cn.java.lazy4;

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

/**
 * Description:单例与多例
 * @Title:  Window.java
 * @Package cn.java.ioc1
 * @author: Matthew
 * @date: 2019年3月6日 下午6:01:58
 */

public class Window {

	public static void main(String[] args) {
//		YellowMouseWolf yellow = new YellowMouseWolf();
//		1.启动框架(context代表spring容器)
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		System.out.println("----------");
//		2.获取spring容器中创建的对象(通过id值获得)
		Duck duck1 = (Duck)context.getBean("bigDuck");
		duck1.behavior();
	}
}

结果为:


Duck…诞生了
鸭在水上漂
我们可以发现duck诞生在-----之后,也就是说它并没有在启动框架的时候同时声明对象,它是在使用的时候再声明对象的。

非懒加载

将代码改为false

在这里插入图片描述
结果为
Duck…诞生了


鸭在水上漂

单例(singleton)是非懒加载,多例(prototype)是懒加载

<!-- 
		单例(singleton)是非懒加载,多例(prototype)是懒加载
	 -->
	<bean id="bigDuck" class="cn.java.lazy4.Duck" scope="prototype"></bean>

结果是:


Duck…诞生了
鸭在水上漂
在这里插入图片描述
懒加载与非懒加载的优缺点:
懒加载:对象使用的时候才去创建。节省资源,但是不利于提前发现错误
非懒加载:容器启动时立马创建。消耗资源,有利于提前发现错误

错误非常关键,所以一般来说都用非懒加载的方式

初始化与销毁

初始化与销毁只能指定一个方法

package cn.java.initAndDestroy3;
/**
 * @Title:  Ji.java
 * @Package cn.java.initAndDestroy
 * @author: Matthew
 * @date: 2019年3月6日 下午7:05:26
 */

public class Ji {
	

	public Ji() {
		System.out.println("Ji....鸡蛋生了");
	}
	
	public void init(){
		System.out.println("Ji.....我是小鸡还没长大");
	}
	
	public void behavior() {
		System.out.println("鸡会打鸣");
	}
	
	public void destroy() {//销毁方法
		System.out.println("鸡蛋羹");
	}
}

package cn.java.initAndDestroy3;

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

/**
 * Description:单例与多例
 * @Title:  Window.java
 * @Package cn.java.ioc1
 * @author: Matthew
 * @date: 2019年3月6日 下午6:01:58
 */

public class Window {

	public static void main(String[] args) {
//		YellowMouseWolf yellow = new YellowMouseWolf();
//		1.启动框架(context代表spring容器)
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//		2.获取spring容器中创建的对象(通过id值获得)
		Ji ji = (Ji)context.getBean("smallJi");
		ji.behavior();
//		3.关闭context容器,并且销毁容器中的所有对象
		((ClassPathXmlApplicationContext)context).close();
	}
}

<?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
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    
	<!-- 
		init-method:指定初始化方法,初始化方法是在构造方法执行之后执行
		destory-method:销毁方法,在我们调用的方法之后执行(当对象被销毁的时候才执行)
		值不用加()直接写方法名 
	-->
	
	<bean id="smallJi" class="cn.java.initAndDestroy3.Ji" init-method="init" destroy-method="destroy"></bean>
</beans>

结果是:
Ji…鸡蛋生了
Ji…我是小鸡还没长大
鸡会打鸣
三月 09, 2019 2:49:59 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@34c45dca: display name [org.springframework.context.support.ClassPathXmlApplicationContext@34c45dca]; startup date [Sat Mar 09 14:49:58 CST 2019]; root of context hierarchy
三月 09, 2019 2:49:59 下午 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
信息: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@606d8acf: defining beans [smallJi]; root of factory hierarchy
鸡蛋羹

在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值