Spring中的单例bean
1. 无论我们是否主动获取bean对象,spring上下文一加载就会创建bean对象
2.无论获取多少次,拿到的都是同一个对象
测试:
package com.yuan.demo;
public class Notepad {
public Notepad() {
super();
System.out.println("NotePad的构造函数...."+this.toString());
}
}
<?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.xsd"> <bean id = "notepad" class="com.yuan.demo.Notepad"></bean> </beans>
package com.yuan.demo;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class NotePadTest {
@Test
public void test01(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Notepad notepad1 = (Notepad)context.getBean("notepad");
Notepad notepad2 = (Notepad)context.getBean("notepad");
System.out.println(notepad1 == notepad2);
}
} package com.yuan.demo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class NotePadAutowired {
@Autowired
private Notepad notepad1;
@Autowired
private Notepad notepad2;
@Test
public void test01(){
System.out.println(notepad1==notepad2);
}
}
bean的作用域
scope属性定义作用域
单例(singleton):整个程序只创建bean的一个实例
原型(prototype):每次注入或者通过spring获取上下文时,都会创建一个新的bean实例
会话(session):web应用中,为每个会话创建一个bean实例
请求(request):web应用中,为每个请求创建一个bean实例
自动装配中定义bean的作用域
@Scope("prototype")
@Scope(scopeName ="prototype")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Scope(scopeName ="prototype")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
延迟加载
通过设置lazy-init实现
<bean id = "notepad" class="com.yuan.demo.Notepad" lazy-init="true"></bean>或者通过@Lazy注解实现,只针对singleton的情况
对象的初始化和销毁
目标:让spring自动调用init和destory方法
package com.yuan.demo;
public class Notepad {
public Notepad() {
super();
System.out.println("NotePad的构造函数...."+this.toString());
}
public void init(){
System.out.println("NotePad的初始化方法");
}
public void destory(){
System.out.println("NotePad的销毁方法");
}
} <bean id = "notepad" class="com.yuan.demo.Notepad" destroy-method="destory" init-method="init"></bean>
package com.yuan.demo;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class NotePadTest {
@Test
public void test01(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Notepad notepad1 = (Notepad)context.getBean("notepad");
// Notepad notepad2 = (Notepad)context.getBean("notepad");
// System.out.println(notepad1 == notepad2);
context.destroy();
}
}

京公网安备 11010502036488号