`
zhangzuanqian
  • 浏览: 270849 次
  • 来自: ...
社区版块
存档分类
最新评论

spring bean 的作用范围

阅读更多

singletonSpringIoc容器只会创建该Bean的唯一实例,所有的请求和引用都只使用这个实例
Property: 每次请求都创建一个实例
request: 在一次Http请求中,容器会返回该Bean的同一个实例,而对于不同的用户请求,会返回不同的实例。需要注意的是,该作用域仅在基于Web的Spring ApplicationContext情形下有效,以下的session和global Session也是如此
session:同上,唯一的区别是请求的作用域变为了session
global session:全局的HttpSession中,容器会返回该bean的同一个实例,典型为在是使用portlet context的时候有效(这个概念本人也不懂)

注意:如果要用到request,session,global session时需要配置

servlet2.4及以上:
在web.xml中添加:
<listener>
<listener-class>org.springframework.web.context.scope.RequestContextListener />
</listener>

servlet2.4以下:
需要配置一个过滤器
<filter>
<filter-name>XXXX</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
<filter-mapping>
<filter-name>XXXX</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

另外,从2.0开始,可以自己定义作用域,但需要实现scope,并重写get和remove方法

特别要引起注意的是:
一般情况下前面两种作用域是够用的,但如果有这样一种情况:singleton类型的bean引用一个prototype的bean时会出现问题,因为singleton只初始化一次,但prototype每请求一次都会有一个新的对象,但prototype类型的beansingleton类型bean的一个属性,理所当然不可能有新prototpye的bean产生,与我们的要求不符

解决方法:
1.放弃Ioc,这与设计初衷不符,并代码间会有耦合
2,Lookup方法注入,推荐

但在用Lookup方法注入时也需要注意一点:需要在引用的Bean中定一个一个抽象地返回被引用对象的方法

package com.huyong.lookup;

import java.util.Calendar;

/**
* @author HuYong Email:yate7571@hotmail.com
*/
public class CurrentTime {
private Calendar now = Calendar.getInstance();

public void printCurrentTime() {
System.out.println("Current Time:" + now.getTime());
}

}


package com.huyong.lookup;

/**
* @author HuYong Email:yate7571@hotmail.com
*/
public abstract class LookupBean {
private CurrentTime currentTime;

public CurrentTime getCurrentTime() {
return currentTime;
}

public void setCurrentTime(CurrentTime currentTime) {
this.currentTime = currentTime;

}
public abstract CurrentTime createCurrentTime();

}

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

<bean id="currentTime" class="com.huyong.lookup.CurrentTime"
scope="prototype">
</bean>
<bean id="lookupBean" class="com.huyong.lookup.LookupBean"
scope="singleton">
<lookup-method name="createCurrentTime" bean="currentTime" />
<property name="currentTime" ref="currentTime"></property>
</bean>

</beans>


Main Test:
package com.huyong.lookup;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

/**
* @author HuYong Email:yate7571@hotmail.com
*/
public class LookupMain {

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
ClassPathResource resource = new ClassPathResource(
"applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);

LookupBean lookupBean = (LookupBean) factory.getBean("lookupBean");
System.out.println("----------first time---------");
System.out.println("getCurrentTime:");
lookupBean.getCurrentTime().printCurrentTime();
System.out.println("createCurrentTime:");
lookupBean.createCurrentTime().printCurrentTime();

Thread.sleep(12345);

System.out.println("---------second time---------");
System.out.println("getCurrentTime:");
LookupBean lookupBean02 = (LookupBean) factory.getBean("lookupBean");
lookupBean02.getCurrentTime().printCurrentTime();
System.out.println("createCurrentTime:");
lookupBean02.createCurrentTime().printCurrentTime();

}

}

分享到:
评论

相关推荐

    spring bean的生命周期

    - **XML配置**:在传统的Spring应用中,Bean的定义通常写在XML配置文件中,如`springbean-xml`中的配置。 - **注解配置**:使用`@Component`,`@Service`,`@Repository`和`@Controller`注解标记类,配合`@...

    普元eos-springbean开发

    - **开发SpringBean**:根据业务需求编写具体的SpringBean实现,包括定义Bean的类型、作用域等。 #### HelloWorld案例开发 在学习SpringBean的开发过程中,最经典的莫过于HelloWorld案例了。该案例主要用于演示...

    spring的bean作用域

    在Spring框架中,Bean的作用域是管理Bean实例创建和存活范围的重要概念。Bean的作用域决定了在特定上下文中,Spring容器如何管理和提供Bean的实例。在Spring中,有五种主要的Bean作用域: 1. **Singleton作用域**:...

    第八章 Spring4 bean作用范围

    NULL 博文链接:https://1151461406.iteye.com/blog/2390230

    Spring实例化Bean顺序

    8. **Singleton和Prototype范围**:Singleton Bean在容器启动时只实例化一次,而Prototype Bean每次请求都会创建新的实例。因此,Singleton Bean的实例化顺序与Prototype Bean不同。 9. **FactoryBean**:Spring的`...

    JSP 中Spring Bean 的作用域详解.docx

    Bean的作用域定义了在一个特定的范围内,Spring如何管理和实例化Bean。下面将详细介绍JSP中Spring Bean的五种作用域。 1. **Singleton作用域**: Singleton是Spring中最常见的一种作用域,它表示在整个Spring IoC...

    spring中bean的范围(xml/annotation)

    在Spring框架中,Bean的范围(Scope)是控制对象实例化和管理的重要概念。它定义了Bean在应用程序中创建和共享的方式。...正确理解和使用Bean范围能够帮助我们构建更加高效和健壮的Spring应用程序。

    Spring Bean 的生命周期.docx

    BeanPostProcessor接口的实现类通常作为Spring容器的附加组件注册,因此其影响范围是全局的,可以对所有Bean进行处理。这两个后处理器接口提供了灵活的扩展点,允许开发者在Bean生命周期的关键点进行自定义操作。 ...

    Spring项目bean基础配置代码

    本文将深入探讨Spring项目中的Bean基础配置、别名配置以及作用范围配置。 首先,我们来理解Bean的基础配置。在Spring中,一个Bean的定义通常包含以下几个关键属性: 1. `id`:这是Bean的唯一标识符,用于在配置...

    Spring学习笔记(9)----让Spring自动扫描和管理Bean

    除了基本的`@Component`家族,Spring还提供了一些高级注解,如`@Scope`用于定义Bean的作用域,`@Lazy`用于延迟初始化Bean,`@Qualifier`用于在多个相同类型的Bean中指定特定的一个。 ### **总结** Spring的自动...

    spring3零配置注解实现Bean定义

    在标签《spring3》的指引下,需要关注的范围被限定在Spring 3版本相关的特性上,特别是在该版本中新增或强化的注解配置特性。 根据提供的部分内容,可以详细解读的知识点包括: 1. Spring 3之前版本中Bean定义通常...

    spring管理bean应用实例代码

    - `singleton`:默认作用域,Spring容器中只有一个Bean实例。 - `prototype`:每次请求都会创建一个新的Bean实例。 - `request`、`session`、`globalSession`:这些是在Web应用中使用的,分别对应HTTP请求、会话...

    详解Spring中bean的scope以后使用

    **Global Session**作用域适用于门户应用中的Bean,它在全局范围内保持一致的状态,即使在不同端口之间也能保持会话的一致性。 启用Global Session作用域的方式与Request和Session作用域类似: ```xml ...

    JSP 中Spring Bean 的作用域详解

    在JSP(Java Server Pages)开发中,经常需要与Spring框架进行交互,而Spring框架中的Bean作用域定义了该Bean的生命周期以及在应用程序中的共享范围。Spring Bean的作用域有以下几种: 1. Singleton(单例) 单例是...

    spring 中特殊bean用法

    但有时我们需要每个请求都创建一个新的Bean实例,这时可以使用`@Scope("prototype")`注解将Bean声明为原型范围。这样每次请求时,Spring都会返回一个新的实例。 3. **AOP代理**: Spring的面向切面编程(AOP)允许...

    spring-scopes:自定义 Spring Bean 范围

    自定义 Spring Bean Scopes 用于默​​认设置不起作用的情况 可用范围 Route Scope - 提供每个路由执行范围的范围 页面范围 - 提供每页范围的范围 线程范围 - 提供每个线程范围的范围 继承的线程范围 - 提供每个线程...

    Java开发学习(三)----Bean基础配置及其作用范围.doc

    - **scope属性**:bean的作用范围决定了Spring容器如何管理bean的生命周期和实例化策略。 - **单例(singleton)**:这是默认的bean作用范围。当设置为`singleton`时,Spring容器会在启动时创建bean的一个实例,并...

    SSH笔记-bean的作用域

    在Spring框架中,Bean的作用域是管理对象生命周期和作用范围的关键概念。Bean的定义通常包含在XML配置文件中,通过`&lt;bean&gt;`标签进行配置。当我们谈论"SSH笔记-bean的作用域"时,这里SSH指的是Spring、Struts和...

    使用 Spring LDAP 读取数据并映射到 Java Bean 中

    这篇博客文章“使用 Spring LDAP 读取数据并映射到 Java Bean 中”主要探讨了如何通过Spring LDAP来查询LDAP目录信息,并将查询结果转换为Java对象,以便在应用程序中进一步处理。 首先,`pom.xml`文件是Maven项目...

Global site tag (gtag.js) - Google Analytics