Spring框架简介④

bean的延迟加载

需要声明一点, 按照之前的例子来讲, User默认情况下是在容器初始化的过程中被创建的, 也就是默认并没有使用延迟加载

所有的bean在默认情况下都是非延迟加载的, 容器创建bean就会被创建, 并且是单例的, 单例后续再讲

此时的配置文件是:

<?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-3.2.xsd">

	<bean id="user" class="com.rl.spring.model.User" ></bean>
	
</beans>

如要配置成延迟加载状态 只需添加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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

	<bean id="user" class="com.rl.spring.model.User" lazy-init="true"></bean>
	
</beans>

如需配置全局, 还可设置默认为延迟加载

<?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-3.2.xsd" default-lazy-init="true">

	<bean id="user" class="com.rl.spring.model.User" ></bean>
	<bean id="userDao" class="com.rl.spring.dao.impl.UserDaoImpl"></bean>
</beans>

bean的作用域

此时涉及到单例(singleton)或者是多例(prototype), 默认情况下是单例的形式

单例的情况下是不管怎么getBean都只会得到一个实例, 单例可设置延迟加载或非延迟加载(默认情况), 如图

测试类:

package com.rl.spring.test;

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

import com.rl.spring.model.User;

public class TestSpring {

	@Test
	public void test() {
		ApplicationContext ctx =
				new ClassPathXmlApplicationContext(new String[]{"ApplicationContext1.xml"});
		User user = (User) ctx.getBean("user");
		User user1 = (User) ctx.getBean("user");
		System.out.println(user);
		System.out.println(user1);
	}
}

输出:

扫描二维码关注公众号,回复: 2714903 查看本文章

com.rl.spring.model.User@650e52
com.rl.spring.model.User@650e52

多例的情况是必须"延迟加载", 因为容器不知道要给你创建多少个实例, 所以只能延迟加载, 等到你需要创建该实例的时候再给你创建即可

<?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-3.2.xsd" >

	<bean id="user" class="com.rl.spring.model.User" scope="prototype"></bean>
	
</beans>

bean的生命周期

生命周期因延迟加载跟非延迟加载而不同 下面进行测试

在User中定义两个方法 init() 和 destroy()

package com.rl.spring.model;

public class User {
	
	private Integer userId;
	
	private String username;
	
	public User() {
		System.out.println("user被创建");
	}

	public void init(){
		System.out.println("我出来了");
	}
	public void destroy(){
		System.out.println("20年后又是一条好汉");
	}
	
	public Integer getUserId() {
		return userId;
	}

	public void setUserId(Integer userId) {
		this.userId = userId;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}
}

在配置文件中设置这两个方法

<?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-3.2.xsd" >

	<!-- <bean id="user" class="com.rl.spring.model.User" scope="prototype"></bean> -->
	<bean id="user" class="com.rl.spring.model.User" init-method="init" destroy-method="destroy"></bean>
	
</beans>

设置好之后, 运行测试代码

package com.rl.spring.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.rl.spring.model.User;

public class TestSpring {

	@Test
	public void test() {
		ApplicationContext ctx =
				new ClassPathXmlApplicationContext(new String[]{"ApplicationContext1.xml"});
		User user = (User) ctx.getBean("user");
		
		//强制转换为其子类, 这样才能进行close容器
		AbstractApplicationContext actx = (AbstractApplicationContext)ctx;
		//关闭容器
		actx.close();
	}
}

此时当默认非延迟加载创建容器的时候, 实例bean被创建出来, 之后init方法被调用, 当容器被关闭(销毁), 之后调用destroy方法

猜你喜欢

转载自blog.csdn.net/ip_JL/article/details/81476739