课程名称:Spring入门
课程章节:第2章 Spring Bean作用域
课程讲师: 西昆仑
课程内容:
一、Bean作用域
1、Singleton作用域
<bean id="bean" class="...">
bean将通过Spring注入以下三个bean中:
<bean id="anotherBean1" class="...">
<property name="bean" ref="bean">
</bean>
<bean id="anotherBean2" class="...">
<property name="bean" ref="bean">
</bean>
<bean id="anotherBean3" class="...">
<property name="bean" ref="bean">
</bean>
在Singleton作用域下,Bean只会被实例化一次,这个Bean被注入到任何需要它的地方。
代码示例:
//Bean2.class
public class Bean1 {
……
}
//Bean1.class
public class Bean1 {
private Bean2 bean2;
……
}
//spring.xml
<bean class="com.imooc.spring.ioc.class07.Bean2" id="bean2" scope="singleton">
<bean class="com.imooc.spring.ioc.class07.Bean1" id="bean1">
<property name="bean2" ref="bean2">
</bean>
//Class007Test.class
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
Bean2 bean2_1 = context.getBean("bean2",Bean2.class);
Bean2 bean2_2 = context.getBean("bean2",Bean2.class);
Bean1 bean1 = context.getBean("bean1",Bean1.class);
}
运行结果:
在同一个Spring的上下文环境中,是单例模式,如果是多上下文环境,则单例模式失效。
2、Prototype作用域
<bean id="bean" class="...">
<bean id="anotherBean1" class="...">
<property name="bean" ref="bean">
</bean>
<bean id="anotherBean2" class="...">
<property name="bean" ref="bean">
</bean>
<bean id="anotherBean3" class="...">
<property name="bean" ref="bean">
</bean>
在Prototype作用域下,有多个Bean被创建,每次向Spring上下文请求该Bean都会new一个新的实例。
代码示例(仅差异部分):
//spring.xml,如不指定scope,则默认是singleton模式
<bean class="com.imooc.spring.ioc.class07.Bean2" id="bean2" scope="prototype">
运行结果:
3、Singleton、Prototype组合效果
1)bean1及bean1中注入的bean2均为singleton模式
//spring.xml
<bean class="com.imooc.spring.ioc.class07.Bean2" id="bean2" scope="singleton">
<bean class="com.imooc.spring.ioc.class07.Bean1" id="bean1" scope="singleton">
<property name="bean2" ref="bean2">
</bean>
//Class007Test.class
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
Bean1 bean1_1 = context.getBean("bean1",Bean1.class);
Bean1 bean1_2 = context.getBean("bean1",Bean1.class);
}
运行结果
2)bean1为singletone,bean1中注入的bean2为prototype模式
//spring.xml
<bean class="com.imooc.spring.ioc.class07.Bean2" id="bean2" scope="prototype">
<bean class="com.imooc.spring.ioc.class07.Bean1" id="bean1" scope="singleton">
<property name="bean2" ref="bean2">
运行结果
3)bean1为prototype,bean1中注入的bean2为singletone模式
//spring.xml
<bean class="com.imooc.spring.ioc.class07.Bean2" id="bean2" scope="singleton">
<bean class="com.imooc.spring.ioc.class07.Bean1" id="bean1" scope="prototype">
<property name="bean2" ref="bean2">
运行结果
4)bean1及bean1中注入的bean2均为prototype模式
//spring.xml
<bean class="com.imooc.spring.ioc.class07.Bean2" id="bean2" scope="prototype">
<bean class="com.imooc.spring.ioc.class07.Bean1" id="bean1" scope="prototype">
<property name="bean2" ref="bean2">
运行结果
5)组合代码回顾
6)方法注入
//Bean1.class差异部分
public abstract class Bean1 {
private abstract Bean2 createBean2();
……
}
//spring.xml
<bean class="com.imooc.spring.ioc.class07.Bean2" id="bean2" scope="prototype">
<bean class="com.imooc.spring.ioc.class07.Bean1" id="bean1">
<lookup-method name="createBean2" ref="bean2">
</bean>
运行结果
二、Web应用作用域
1、环境准备
spring web的上下文环境
在web.xml中增加listener或filter
代码示例:
在pom.xml中引入spring-web、spring-webmvc包
修改web.xml,spring web的上下文环境
//RequestController.class
@Controller
public class RequestController {
@RequestMapping("testRequest")
@ResponseBody
public String test() {
return this.toString();
}
}
//SessionController.class
@Controller
public class SessionController {
@RequestMapping("testSession")
@ResponseBody
public String test() {
return this.toString();
}
}
//ApplicationController.class
@Controller
public class ApplicationController {
@RequestMapping("testApplication")
@ResponseBody
public String test() {
return this.toString();
}
}
//spring.xml
<bean class="com.imooc.spring.ioc.class08.RequestController" scope="request"/>
<bean class="com.imooc.spring.ioc.class08.SessionController" scope="session"/>
<bean class="com.imooc.spring.ioc.class08.ApplicationController" scope="application"/>
需要准备Severlet容器,将代码部署至Tomcat
在浏览器中输入访问地址,运行结果:
可修改Controller的作用域,验证浏览器刷新后实例是否变化;
request:每个request请求都会创建一个单独的实例。
session:每个session都会创建一个单独的实例。
application:每个servletContext都会创建一个单独的实例。
websoket:每个websoket都会创建一个单独的实例。
课程收获:
当前WEB开发越来越频繁,本节课程的WEB应用Bean作用域的介绍非常实用,期待后续的更多应用课程讲解。
共同学习,写下你的评论
评论加载中...
作者其他优质文章