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(); } }