`

IOC容器Bean的实例化方式

阅读更多
spring IOC容器实例化Bean的方式有:


  • singleton            在spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在.
  • prototype            每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new XxxBean()的操作.
  • request               每次HTTP请求都会创建一个新的Bean,该作用域仅适用于webApplicationContext环境.
  • session               同一个HTTP session共享一个Bean,不同HTTP session使用不同的Bean,该作用域仅适用于webApplicationContext环境.
  • globalSession   同一个全局session共享一个Bean,一般用于portlet应用环境,该作用域仅适用于webApplicationContext环境.




在低版本的spring中,由于只有两个Bean作用域,所以采用singleton="true|false"的配置方 式,spring2.0为了向后兼容,依旧支持这种配置方式.不过,spring2.0推荐采用新的配置方式:scope="<作用域类型>;"

-------------------------------------------------

singleton作用域


spring以容器的方式提供天然的单实例模式功能,任何POJO无须编写特殊的代码仅通过配置就可以了.

注意:spring将Bean的默认作用域定为singleton.

singleton例:

<bean id="car" class="com.baobaotao.scope.Car" scope="singleton"/>
<bean id="boss1" class="com.baobaotao.scope.Boss">
<property name="car" ref="car"/>
</bean>


Car Bean声明为singleton(因为默认是singleton,所以可以不显式指定).

在默认情况下,spring的ApplicationContext容器在启动时,自动实例化所有singleton的Bean并缓存于容器中.

虽然启动时会花费一些时间,但带来两个好处:首先对Bean提前的实例化操作会及早发现一些潜在的配置问题.

其次Bean以缓存的方式保存,当运行时使用到该Bean时就无须再实例化了,加快了运行效率.如果用户不希望在容

器启动时提前实例化singleton的Bean,可以通过lazy-init属性进行控制:


<bean id="boos1" class="com.baobaotao.scope.Boss" lazy-init="true">
<property name="car" ref="car"/>
</bean>


lazy-init="true"的Bean在某些情况下依旧会提前实例化:如果该Bean被其它需要提前实例化的Bean引用到,

spring也将忽略延迟实例化的设置.

-------------------------------------------------

prototype作用域



采用scope="prototype"指定非单实例作用域Bean,请看:

<bean id="car" class="com.baobaotao.scope.Car" scope="prototype"/>
<bean id="boss1" class="com.baobaotao.scope.Boss">
<property name="car" ref="car"/>
</bean>
<bean id="boss2" class="com.baobaotao.scope.Boss">
<property name="car" ref="car"/>
</bean>


boss1,boss2所引用的都是一个独立的Car实例.

在默认情况下,spring容器在启动时不实例化prototype的Bean.此外,spring容器将prototype的Bean交给调用

者后,就不再管理它的生命周期.

-------------------------------------------------

web应用环境相关的Bean作用域



如果用户使用spring的webApplicationContext,则可以使用另外3种Bean的作用域:request,session和globalSession.不过

在使用这些作用域之前,首先必须在web容器中进行一些额外的配置,在高版本的web容器中,则可以利用HTTP请求监听器进行配置:

<web-app>

...

<listener><listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class></listener>

...

</web-app>


细心的朋友可能有一个疑问:在介绍webApplicationContext初始化时,我们已经通过ContextLoaderListener将web容器与

spring容器整合,为什么这里又要引入一个额外的RequestContextListener以支持Bean的另外3个作用域呢?

在整合spring容器时使用ContextLoaderListener,它实现了ServletContextListener监听器接口,ServletContextListener

只负责监听web容器启动和关闭的事件.而RequestContextListener实现ServletRequestListener监听器接口,该监听器监听

HTTP请求事件,web服务器接收的每一次请求都会通知该监听器.

spring容器启动和关闭操作由web容器的启动和关闭事件触发,但如果spring容器中的Bean需要request,session,globalsession

作用域的支持,spring容器本身就必须获得web容器的HTTP请求事件,以HTTP请求的事件"驱动"Bean作用域的控制逻辑.



request作用域

顾名思义,request作用域的Bean对应一个HTTP请求和生命周期,考虑下面的配置:

<bean name="car" class="com.baobaotao.scope.Car" scope="request"/>


这样,每次HTTP请求调用到car Bean时,spring容器创建一个新的Car Bean,请求处理完毕后,销毁这个Bean.



session作用域

假设将以上car的作用域调整为session类型:

<bean name="car" class="com.baobaotao.scope.Car" scope="session"/>


这样配置后,car Bean的作用域横跨整个HTTP session,session中所有HTTP请求都共享同一个Car Bean,当HTTP Session结束后,实例

才被销毁.



globalSession作用域

下面的配置片断将car的作用域设置为了globalSession:

<bean name="loginController" class="com.baobaotao.scope.Car" scope="globalSession"/>


globalSession作用域类似于session作用域,不过仅在portlet的web应用中使用.Portlet规范定义了全局Session概念,它被组成portlet

web应用的所有子portlet共享.如果不在Portlet web应用环境下,globalSession自然等价于session作有域了
分享到:
评论

相关推荐

    Spring IOC容器应用实例

    **Spring IOC 容器应用实例** Spring 框架的核心组件之一是 Inversion of Control (IoC) 容器,也常被称为依赖注入(Dependency Injection)容器。IoC 是一种设计模式,它将对象的创建和管理从应用程序的业务逻辑中...

    Spring实例化Bean顺序

    4. **启动后处理器(BeanPostProcessor)**:这些是特殊类型的Bean,它们在所有常规Bean实例化之后,但初始化之前进行处理。它们的实例化顺序由`@Order`注解决定,或者通过实现`Ordered`接口来控制。 5. **...

    二、IOC容器bean的实例化.md

    java -cp KafkaOffsetMonitor-assembly-0.2.0.jar com.quantifind.kafka.offsetapp.OffsetGetterWeb --port 8088 --zk 192.168.164.110:2181,192.168.164.120:2181,192.168.164.130:2181 --refresh 10.seconds --...

    第四章 在Ioc容器中装配Bean

    在Spring框架中,Bean装配是指Spring容器将应用程序中的对象进行实例化、配置以及组装的过程。这涉及到依赖注入的概念,即容器负责将依赖关系注入到对象中,而不需要对象自己去创建或者查找这些依赖关系。 首先,...

    模拟Spring的IoC容器实现注解自动装配

    - **依赖注入**:在bean实例化后,处理@Autowired注解,完成依赖注入。 - **初始化回调**:调用bean的初始化方法,如 InitializingBean 的 afterPropertiesSet() 或 @PostConstruct 注解的方法。 - **单例管理**:...

    IOC容器简单实现

    注册时,容器会记录每个对象的类名、实例化方式以及其依赖的对象。 ```java class Container { Map, Object&gt; beans; // 存储对象的映射 Map, String&gt; dependencies; // 存储对象依赖关系的映射 } ``` #### 2.2 ...

    Spring的IoC容器初始化源码解析

    而控制反转则是将这种控制权交给外部容器(如Spring的IoC容器),由容器来负责实例化、配置和管理组件之间的关系。 ##### 2.2 依赖注入的实现方式 依赖注入(Dependency Injection,DI)是实现控制反转的一种常用...

    IoC容器的设计(利用反射、注解和工厂模式实现)

    实验要求 1. 利用注解、反射和工厂模式设计一个简单的IoC容器 2. 该IoC容器包含3个注解和一个IoC容器类(AnnotationConfigApplicationContext),其定义...接下来在test类中实例化IoC容器,并从中取得bean,调用其方法

    Spring IOC容器实现分析.pdf 下载

    2. Bean的实例化:当需要使用某个Bean时,IOC容器会根据Bean的定义创建实例。可以是单例模式,也可以是多例模式。 3. 依赖注入:在实例化Bean的过程中,容器会根据定义的依赖关系,将其他Bean注入到当前Bean中,...

    Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等).doc

    Spring 框架系列(8)- Spring IOC 实现原理详解之 Bean 实例化(生命周期、循环依赖等) 本文主要研究 Spring 框架中 Bean 的实例化过程,包括 Bean 的生命周期和循环依赖问题的解决方案。在 Spring 框架中,Bean ...

    Spring IoC容器实现的结构分析

    在执行过程中,Spring IoC容器首先通过`BeanDefinitionReader`加载和解析bean定义,然后`BeanFactory`根据`BeanDefinition`创建bean实例。如果bean配置了自动装配,`AutowireCapableBeanFactory`会处理依赖注入。...

    手写一个SpringIoc容器

    7. **事件监听**:Spring IOC容器允许注册监听器,监听Bean的生命周期事件,如实例化、初始化、销毁等。在自定义容器中,我们需要设计事件发布和订阅机制。 8. **元数据解析**:容器需要读取并解析Bean的定义信息,...

    关于SpringBoot获取IOC容器中注入的Bean(推荐)

    在给定的示例代码中,我们可以看到,作者使用了`@Configuration`注解来配置Bean对象,并使用`@Bean`注解来定义Bean对象的实例化方式。 四、SpringBoot Bean的作用域 在SpringBoot框架中,Bean对象可以有多种作用域...

    手动实现一个ioc容器.zip

    通过反转控制(Inversion of Control,简称IOC),应用不再直接创建对象,而是由容器负责实例化、组装和管理对象。这样,开发者可以专注于业务逻辑,而不用关心对象的创建和依赖关系的维护。 描述中提到的"手动实现...

    自定义IOC容器

    4. **依赖注入**:在Bean实例化后,根据其定义中的依赖关系,使用反射将依赖对象设置到相应属性上。 5. **处理生命周期**:提供初始化和销毁方法的调用接口,以便执行Bean的特定生命周期操作。 6. **作用域管理**...

    自己实现的ioc容器

    3. 处理属性注入,根据bean的依赖关系,查找并注入相应的bean实例。 4. 实现单例或多例管理,根据需求决定bean是否需要被单例化。 在实现BeanFactory时,可以使用工厂方法、构造函数注入或属性setter注入来创建和...

    自己实现IOC容器

    通常,我们会为Bean提供一个无参数的构造函数,以便于容器实例化。 ```java public class MyBean { private String property; public MyBean() { } // getter and setter } ``` #### 2.2 创建Bean注册表 接...

    Spring源代码解析(一):IOC容器.doc

    例如,XmlBeanFactory是一个基于XML配置的BeanFactory实现,它读取XML配置文件,解析Bean定义,然后根据这些定义实例化和管理Bean。在XmlBeanFactory之上,Spring提供了更抽象的实现,如AbstractBeanFactory和...

Global site tag (gtag.js) - Google Analytics