如何在Spring的applicationContext.xml中指定默认范围来请求范围?

2024-05-10

我想让所有 bean 请求默认作用域,但是 Spring 文档说默认作用域是 Singleton。 (第 3.4.1 和 3.4.2 节http://static.springsource.org/spring/docs/2.5.x/reference/beans.html http://static.springsource.org/spring/docs/2.5.x/reference/beans.html)

我想将默认范围声明为请求范围。

这是迄今为止我发现的最接近的东西——这是一个已经有一段时间没有被触及的缺陷了。 jira.springframework.org/browse/SPR-4994?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel#issue-tabs


没有默认范围spring-beans.xsd 文件中定义的属性。但根据Bean定义 http://static.springsource.org/spring/docs/2.5.6/api/org/springframework/beans/factory/config/BeanDefinition.html API

扩展 bean 工厂可能支持更多范围.

And Web应用程序上下文 http://static.springsource.org/spring/docs/2.5.6/api/org/springframework/web/context/WebApplicationContext.html- 扩展的ApplicationContext支持request scope

除了标准范围“单例”和“原型”之外还支持

因此,当您拥有 WebApplicationContext 时,使用请求范围才有意义。如果您想将 WebApplicationContext 中定义的所有 bean 注册为请求范围,您必须定义一个 BeanFactoryPostProcessor

public class RequestScopedPostProcessor implements BeanFactoryPostProcessor {

    public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException {
        for(String beanName: factory.getBeanDefinitionNames()) {
            BeanDefinition beanDefinition = factory.getBeanDefinition(beanName);

            beanDefinition.setScope("request");
        }
    }
}

并且不要忘记注册您的 BeanFactoryPostProcessor

<bean class="RequestScopedPostProcessor"/>

但请记住

这个方法不考虑祖先工厂。它仅用于访问该工厂的本地 bean 定义

因此,无论您的 bean 是否在 WebApplicationContext 中定义,上面定义的 BeanFactoryPostProcessor 都会覆盖范围属性

UPDATE

有没有办法覆盖一些默认的“请求”作用域 bean 是单例作用域 ?

您应该再次使用上面提供的相同 BeanFactoryPostProcessor。我不确定,但我认为设置其范围的唯一方法是使用beanDefinition.setScope方法。和有很多有用的方法可以检索有关任何 bean 的信息. See 可配置列表Bean工厂 http://static.springsource.org/spring/docs/2.5.6/api/org/springframework/beans/factory/config/ConfigurableListableBeanFactory.html such as

  • getBeanNamesForType

...

/**
  * Suppose Service is an interface
  *
  * And you want to define all of Service implementations as singleton
  */
String [] beanNameArray = factory.getBeanNamesForType(Service.class);
for(String beanName: beanNameArray) {
    BeanDefinition beanDefinition = factory.getBeanDefinition(beanName);

    beanDefinition.setScope("singleton");
}

我希望它有用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Spring的applicationContext.xml中指定默认范围来请求范围? 的相关文章

  • 如何提取文件 jre-9/lib/modules?

    In JRE 9 lib目录 至少在 Windows 上 有一个名为modules其大小约为107 MB 是否可以提取该文件或在其中列出 java 模块 我可以看到一个名为jmod可以在jdk 9 bin jmod exe 但那是为了阅读
  • 项目缺少所需的注释处理库

    我的 Eclipse IDE 突然在问题视图中显示 xxxx 项目缺少所需的注释处理库 xxxx M2 REPO 中的一些旧 jar 我用谷歌搜索 没有找到任何答案 为什么我的项目使用旧的 jar 以及错误来自哪里 To remove th
  • 如何为小程序提供对文件系统写入的访问权限

    我在设置小程序的策略文件时遇到问题 我是第一次这样做 不知道如何在java中设置小程序的策略文件 实际上我想授予小程序在文件系统上写入的权限 为此我必须向小程序授予文件权限 所以我创建了一个名为 java policy 的文件 并将以下代码
  • 当 JMS Prod 位于辅助 POJO 类中时,如何在事务中包含 JMS Producer

    简短的问题 有没有办法强制无状态 EJB 调用的 POJO 存在于 EJB 的上下文中 以便事务和资源注入可以在 POJO 中工作 具体来说 在我想要做的事情的上下文中 如何在 EJB 的事务中包含 POJO JMS 生产者 该生产者在调用
  • maven 无法下载 jacoco 0.7.10-SNAPSHOT jar

    我对此感到困惑 我的 pom xml 中有这个
  • Android volley使用RequestFuture.get()时出现超时异常

    在我的片段中 我尝试使用 TMDB 的开放电影数据库来获取有关 正在播放 电影的详细信息 如果我使用 RequestFuture get time TimeUnit 方法来执行此齐射请求 我总是会收到超时错误 如果我在 Safari 中手动
  • LocalDate 减去 period 得到错误的结果

    LocalDate减去一个Period 如 28年1个月27天 得到错误的结果 但减去一个Period 只有天单位 如 10282 天 得到正确的结果 有什么需要注意的吗 public static void main String arg
  • Java 中的 ExecuteUpdate sql 语句不起作用

    我正在学习如何将 SQL 与 Java 结合使用 我已成功安装 JDBC 驱动程序 并且能够从数据库读取记录并将其打印在屏幕上 我的问题发生在尝试执行更新或插入语句时 没有任何反应 这是我的代码 问题所在的方法 public static
  • 将现有 eclipse 项目导出到 war 文件时出现“模块名称无效”

    我正在尝试将现有 Eclipse 项目导出到 war 文件 但无论我在 WAR Export 对话框页面中输入什么 系统总是返回 模块名称无效 我不知道如何解决这个问题 谢谢您的帮助 我有同样的问题 我修复了它 请按照以下步骤操作 您可以创
  • 是否有最新的 Facebook Java SDK? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 好像没找到最近更新的 如果没有 是否有一个好的 Java 库来执行与 Facebook 的 API 交
  • 如何在 Bean Validation 1.0 中构造 ConstraintViolationException?

    我对 javax validation API 感到困惑 我正在编写一个简单的测试来理解它 Sample sample new Sample Set
  • 改变 Java 中凯撒移位的方向

    用户可以通过选择 1 向左或 2 向右移动字母来选择向左或向右移动 左边工作正常 右边不行 现在它显示了完全相同的循环 但我已经改变了所有 and 以不同的方式进行标记 最终我总是得到奇怪的字符 如何让程序将字符向相反方向移动 如果用户输入
  • 在 Twig 的父作用域中设置变量

    在Smarty你可以做 var bla scope parent 在 Twig 中可能吗 不建议使用块 我知道 我需要变量 如果您不想使用default 过滤器 即 当您想在整个父模板和子模板中多次使用该变量时 您实际上可以在父模板中定义一
  • Jetty Plugin 9启动不喜欢icu4j-2.6.1.jar

    我对 mortbay 的 Maven jetty 插件 6 有相同的配置
  • 如何配置Spring使JPA(Hibernate)和JDBC(JdbcTemplate或MyBatis)共享同一个事务

    我有一个数据源 我使用 Spring 3 0 3 Hibernate 3 5 1 作为 JPA 提供程序 我使用 MyBatis 3 0 2 进行一些查询 我的应用程序在 Tomcat 6 上运行 我有一个 HibernateDAO 和一个
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 传递 Android DialogFragment 参数时,onCreateDialog 捆绑参数意外为 null

    我正在尝试使用 DialogFragment 在 Android 中显示一个基本对话框 并使用对话框消息的参数 如中所述StackOverflow线程 https stackoverflow com questions 15459209 p
  • 如何清理 Runtime.exec() 中使用的用户输入?

    我需要通过命令行调用自定义脚本 这些脚本需要很少的参数并在 Linux 机器上调用 当前版本容易出现各种shell注入 如何清理用户给出的参数 参数包括登录名和路径 Unix 或 Windows 路径 用户应该能够输入任何可能的路径 该路径
  • Spring中什么时候触发ContextRefreshedEvent?

    我知道当 ApplicationContext 完全加载时它会被触发一次 但是之后在运行时怎么办 Refreshed 一词意味着它将在刷新时触发 但我想知道 Spring 是否符合 ApplicationContext 刷新的资格 跟进问题
  • 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

    我正在使用 Spring 和 Hibernate 以及 MySQL 开发应用程序 我是 Hibernate 新手 完成了基本任务 现在我需要在选择查询中应用联接以使用注释从多个表中获取数据 我已经搜索过但仍然没有任何想法 这是我的数据库表和

随机推荐