手记

【备战春招】第17天 Spring入门

课程名称: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作用域的介绍非常实用,期待后续的更多应用课程讲解。


0人推荐
随时随地看视频
慕课网APP