spring ioc 单例 和多例模式学习

spring ioc中默认为单例,当scope设置为prototype的时为多例,设置为多例时,对象的创建时发生改变,无论lazy-init为什么值,都是在context.getBean();时创建对象


多例模式例子:

package zju_001.maven_test_1;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Scope;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.stereotype.Component;  

@Component(value="user")  //  
//@Scope(value="prototype") //创建多实例 
public class User {

	private String name;
	private int id;
	 public void fun() {
		 System.out.println("dao");
	 }

	public User() {
	System.out.println("初始化User实例");
	}
	

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
		System.out.println("name is"+ name);
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
		System.out.println("id is "+id);
	}
	
	public static void main(String[] args) {
		System.out.println("加载context文件");
		ApplicationContext context = new FileSystemXmlApplicationContext("src\\bean1.xml");
		System.out.println("第1个ioc");
		User u1=(User) context.getBean("user");
		u1.setId(123);
		
		System.out.println("第2个ioc");
		User u2=(User) context.getBean("user");
		u2.setId(456);
		
		System.out.println("u1的id是:"+u1.getId());
		System.out.println("u1的id是:"+u2.getId());
		
		
		
	}
	
}

输出为:

第1个ioc
初始化User实例
id is 123
第2个ioc
初始化User实例
id is 456
u1的id是:123
u2的id是:456

单例模式情况:

没有设置:@Scope(value="prototype")

输出为:

初始化User实例
第1个ioc
id is 123
第2个ioc
id is 456
u1的id是:456
u1的id是:456

可以看到差别是,单例模式中, 初始化在加载context文件时发生,而多例模式中,初始化在ioc是发生。

并且,单例模式 两次给不同的变量进行注入后,实际上两个变量指向同一个实例,改变其中一个另一个也改变。


你可能感兴趣的:(javaweb)