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作有域了
相关推荐
3. 依赖注入:在实例化Bean的过程中,容器会根据定义的依赖关系,将其他Bean注入到当前Bean中,实现依赖关系的自动装配。 4. 初始化处理:如果Bean定义了初始化方法,容器会在所有依赖注入完成后调用该方法,完成...
**Spring IOC 容器应用实例** Spring 框架的核心组件之一是 Inversion of Control (IoC) 容器,也常被称为依赖注入(Dependency Injection)容器。IoC 是一种设计模式,它将对象的创建和管理从应用程序的业务逻辑中...
而控制反转则是将这种控制权交给外部容器(如Spring的IoC容器),由容器来负责实例化、配置和管理组件之间的关系。 ##### 2.2 依赖注入的实现方式 依赖注入(Dependency Injection,DI)是实现控制反转的一种常用...
这里,我们主要探讨的是Spring如何通过其IoC(Inversion of Control)容器来实例化Bean,并理解其背后的逻辑。 首先,我们要知道Spring IoC容器是通过XML配置文件、注解或Java配置类来管理Bean的生命周期。Bean的...
容器根据Bean的定义解析其依赖关系,通过构造函数、setter方法或字段注入来实例化Bean。对于复杂依赖关系,可以使用工厂方法或者Prototype作用域的Bean来处理。 3. **Bean的生命周期管理**:容器需要提供初始化和...
此外,`AbstractBeanFactory`和`DefaultListableBeanFactory`是实际的bean工厂实现,它们处理bean的实例化和管理。 `ApplicationContext`是`BeanFactory`的扩展,增加了更多企业级应用的功能,如国际化、事件发布和...
在Spring框架中,Bean装配是指Spring容器将应用程序中的对象进行实例化、配置以及组装的过程。这涉及到依赖注入的概念,即容器负责将依赖关系注入到对象中,而不需要对象自己去创建或者查找这些依赖关系。 首先,...
浅谈Spring IOC实例化Bean的三个方法 Spring IOC(Inversion of Control,控制反转)是Spring Framework中的一种核心机制,用于管理Bean的生命周期。实例化Bean是IOC的核心步骤之一,本文将详细讲解Spring IOC实例...
在这些配置中,Spring 容器将读取 Bean 的配置信息,形成 Bean 定义注册表,然后实例化 Bean,将其放入 Bean 缓存池中,供应用程序使用。 二、Bean 基本配置 Bean 的基本配置包括 Bean 的命名、依赖注入和自动...
这个过程包括解析配置文件、实例化Bean定义、处理依赖注入等。 3. **依赖注入(DI)**:是IOC的核心。Spring容器负责管理Bean的生命周期,并根据Bean之间的依赖关系进行实例化和装配。依赖可以通过属性注入、构造...
2. **Bean实例化**:根据BeanDefinition,Spring容器创建Bean实例,可以是单例或多例。 3. **依赖注入**:Spring容器根据BeanDefinition中的依赖关系,为Bean注入依赖对象。 4. **初始化**:Spring容器调用Bean的...
接下来,Spring使用Java的反射机制来实例化Bean。反射允许程序在运行时动态地获取类的信息(如类名、方法名等)并调用它们。在上述例子中,Spring会创建一个`MyClass`的实例,并根据`property`标签设置相应的属性值...
1.spring中bean实例化的俩种方式 2.spring中bean的各种元素如何使用 3.spring中的bean管理 4.spring中不同类型bean的作用域 5.spring中bean的生命周期 通过我的项目,可以跟着学习SPringIoC容器和Bean管理,帮助你...
refresh 方法实现了 IOC 容器的启动逻辑,包括准备容器、加载 BeanDefinition、实例化单例 Bean、注册事件监听器等步骤。 首先,refresh 方法会首先准备容器,包括准备 BeanFactory、加载 BeanDefinition 等步骤。...
- **依赖注入**:在bean实例化后,处理@Autowired注解,完成依赖注入。 - **初始化回调**:调用bean的初始化方法,如 InitializingBean 的 afterPropertiesSet() 或 @PostConstruct 注解的方法。 - **单例管理**:...
1. **无参数构造函数配置**:最基础的配置方式,如`<bean id="happyComponent" class="com.itbignyi.ioc_01.HappyComponent"></bean>`,容器会使用无参构造函数创建`HappyComponent`实例。 2. **工厂方法配置**:...
3. **Bean工厂**(BeanFactory):BeanFactory是Spring容器最基础的实现,它负责Bean的实例化、依赖注入以及生命周期管理等核心功能。 4. **工厂Bean**(FactoryBean):FactoryBean是一种特殊的Bean,它可以通过...
我们创建一个XML文件,例如`beans.xml`,用于注册bean定义,这样IoC容器就能根据这些定义来实例化和管理对象。bean定义通常包含类名、属性和它们的值,以及与其他bean的关系。 在`YQIoc`这个压缩包中,可能包含了...