为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Java

课程名称: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的上下文环境中,是单例模式,如果是多上下文环境,则单例模式失效。

https://img1.sycdn.imooc.com//63f6f1860001309714540816.jpg

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">

运行结果:

https://img1.sycdn.imooc.com//63f6f1950001427e14520816.jpg

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

}

运行结果

https://img1.sycdn.imooc.com//63f6f1a700015f2214520818.jpg

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">

运行结果

https://img1.sycdn.imooc.com//63f6f1b20001afae14480816.jpg

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">

运行结果

https://img1.sycdn.imooc.com//63f6f1bb0001c44814540816.jpg

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">

运行结果

https://img1.sycdn.imooc.com//63f6f1c20001be0014540818.jpg

5)组合代码回顾

https://img1.sycdn.imooc.com//63f6f1c900015b9514480816.jpg

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>

运行结果

https://img1.sycdn.imooc.com//63f6f1d50001f7e214540816.jpg

二、Web应用作用域

1、环境准备

spring web的上下文环境

https://img1.sycdn.imooc.com//63f6f1dc0001d57414500814.jpg

在web.xml中增加listener或filter

https://img1.sycdn.imooc.com//63f6f1e30001ca9914480814.jpg

https://img1.sycdn.imooc.com//63f6f1e90001255e14480816.jpg

代码示例:

在pom.xml中引入spring-web、spring-webmvc包

https://img1.sycdn.imooc.com//63f6f1f00001d9de14500814.jpg

修改web.xml,spring web的上下文环境

https://img1.sycdn.imooc.com//63f6f1f80001621614480814.jpg

//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

在浏览器中输入访问地址,运行结果:

https://img1.sycdn.imooc.com//63f6f2010001d5e614540812.jpg

可修改Controller的作用域,验证浏览器刷新后实例是否变化;

request:每个request请求都会创建一个单独的实例。

session:每个session都会创建一个单独的实例。

application:每个servletContext都会创建一个单独的实例。

websoket:每个websoket都会创建一个单独的实例。

课程收获:

当前WEB开发越来越频繁,本节课程的WEB应用Bean作用域的介绍非常实用,期待后续的更多应用课程讲解。


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消