Spring注入Servlet

2024-02-07

所以我看到了这个问题:

Spring依赖注入到其他实例 https://stackoverflow.com/questions/9127807/spring-dependency-injection-to-other-instance

并想知道我的方法是否有效。

1)在我的Spring应用程序上下文中声明bean

    <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="initialSize" value="${jdbc.initialSize}" />
        <property name="validationQuery" value="${jdbc.validationQuery}" /> 
        <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />
    </bean>

    <bean id="apiData" class="com.mydomain.api.data.ApiData">
        <property name="dataSource" ref="dataSource" />
        <property name="apiLogger" ref="apiLogger" />
    </bean>

    <bean id="apiLogging" class="com.mydomain.api.data.ApiLogger">
        <property name="dataSource" ref="dataSource" />
    </bean>

2) 重写我的 servlet 的 init 方法,如下所示:

    @Override
    public void init(ServletConfig config) throws ServletException {
       super.init(config);

       ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

       this.apiData = (ApiData)ac.getBean("apiData");
       this.apiLogger = (ApiLogger)ac.getBean("apiLogger");
    }

这是否可行,或者 Spring 尚未准备好在 Web 应用程序部署中向我的 servlet 交付 Bean?我需要做一些更传统的事情吗,比如把豆子放进去web.xml?


我想利用 Sotirios Delimanolis 提供的解决方案,但添加透明的自动装配。 这个想法是将普通的 servlet 转变为自动装配感知对象。

因此,我创建了一个父抽象 servlet 类,它检索 Spring 上下文、获取具有自动装配功能的工厂,并使用该工厂自动装配 servlet 实例(实际上是子类)。我还将工厂存储为实例变量,以防子类需要它。

所以父抽象 servlet 看起来像这样:

public abstract class AbstractServlet extends HttpServlet {

    protected AutowireCapableBeanFactory ctx;

    @Override
    public void init() throws ServletException {
        super.init();
        ctx = ((ApplicationContext) getServletContext().getAttribute(
                "applicationContext")).getAutowireCapableBeanFactory();
        //The following line does the magic
        ctx.autowireBean(this);
    }
}

sevlet 子类如下所示:

public class EchoServlet extends AbstractServlet {

    @Autowired
    private MyService service;

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
        response.getWriter().println("Hello! "+ service.getMyParam());
    }
}

请注意,EchoServlet 唯一需要做的就是在常见的 Spring 实践中声明一个 bean。魔法是在超类的 init() 方法中完成的。

我还没有彻底测试过。但它与一个简单的 bean MyService 一起使用,该 bean 还从 Spring 管理的属性文件中自动装配属性。

Enjoy!


Note:

最好使用 Spring 自己的上下文侦听器加载应用程序上下文,如下所示:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

然后像这样检索它:

WebApplicationContext context = WebApplicationContextUtils
    .getWebApplicationContext(getServletContext());
ctx = context.getAutowireCapableBeanFactory();
ctx.autowireBean(this);

只需要导入spring-web库,不需要导入spring-mvc。

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

Spring注入Servlet 的相关文章

  • (Java) App Engine 中的静态文件无法访问

    The 示例文档 http code google com appengine docs java gettingstarted staticfiles html表示您只需将文件放在 war 或子目录 中 并且应该可以从主机访问它们 只要它
  • 如何将jscrollpane添加到jframe?

    我有以下源代码 有人可以给我建议如何将 jscrollpane 添加到 jframe 上吗 我尝试了几次将其添加到 jframe 但没有任何进展 它甚至没有显示 public class Form3 JFrame jframe new JF
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • FileNotFoundException - Struts2 文件上传

    Strange FileNotFoundException使用Struts2上传文件时 这是 JSP 的一部分
  • 在 MongoDB 和 Apache Solr 之间同步数据的简单方法

    我最近开始使用 MongoDB 和 Apache Solr 我使用 MongoDB 作为数据存储 并且希望 Apache Solr 为我的数据创建索引 以实现应用程序中的搜索功能 经过一些研究 我发现 基本上有两种方法可以在 MongoDB
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • Java:如何确定文件所在的驱动器类型?

    Java 是否有一种独立于平台的方法来检测文件所在的驱动器类型 基本上我有兴趣区分 硬盘 可移动驱动器 如 USB 记忆棒 和网络共享 JNI JNA 解决方案不会有帮助 可以假设 Java 7 您可以使用 Java 执行 cmd fsut
  • Spring Data JPA:查询如何返回非实体对象或对象列表?

    我在我的项目中使用 Spring Data JPA 我正在演奏数百万张唱片 我有一个要求 我必须获取各种表的数据并构建一个对象 然后将其绘制在 UI 上 现在如何实现我的 Spring 数据存储库 我读到它可以通过命名本机查询来实现 如果指
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • Play.application() 的替代方案是什么

    我是 Play 框架的新手 我想读取conf文件夹中的一个文件 所以我用了Play application classloader getResources Data json nextElement getFile 但我知道 play P
  • 使用Java绘制维恩图

    我正在尝试根据给定的布尔方程绘制维恩图 例如 a AND b AND c我想在 Android 手机上执行此操作 因此我需要找到一种使用 Java 来执行此操作的方法 我找到了一个完美的小部件 它可以完成我在这方面寻找的一切布尔代数计算器
  • 集成 Spring Webflow 2 和 Apache Tiles [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我最近开始升级一些应用程序以使用 Spring Webflow 2 并且我想利用 Webflow 2
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • 使用 Java https 上传到 Imgur v3 错误

    我目前正在尝试使用他们当前的 API v3 上传到 imgur 但是我不断收到错误 错误 javax net ssl SSLException 证书中的主机名不匹配 api imgur com imgur com OR imgur com
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • 检查应用程序是否在 Android Market 上可用

    给定 Android 应用程序 ID 包名称 如何以编程方式检查该应用程序是否在 Android Market 上可用 例如 com rovio angrybirds 可用 而 com random app ibuilt 不可用 我计划从
  • 动态更改 FOSUserBundle 的服务参数值

    我问的是对 FOSUserBundle 使用多个实体管理器 https stackoverflow com questions 14475180 multiple entity manager for fosuserbundle之前 事实证

随机推荐

  • Python - re.findall 返回不需要的结果

    re findall 100 0 9 0 9 0 9 89 这仅返回结果 89 我需要退还全部 89 请问有什么想法怎么做吗 gt gt gt re findall 100 0 9 0 9 0 9 89 89 当有捕获组时findall仅返
  • mongodb第二个id字段自动递增

    我想在我的 mongodb 集合中有一个额外的 ID 字段 objectId 非常适合获取唯一 ID 但我需要更短的 ID 来进行用户管理 这些 ID 应该类似于100001 100002等等 是否可以通过自动增量获得这些 Thx Mong
  • 使用 Flex 和 Bison 编译时未定义对“_yyerror”的引用

    我正在尝试为迷你 Pascal 语言制作一个编译器 我为此使用了 Flex 和 Bison 并且出现了这个错误 我的 Flex 文件 include y tab h include
  • PyTorch ROCm 已推出 - 如何选择 Radeon GPU 作为设备

    由于 Pytorch 发布了 ROCm 版本 这使我能够使用 nvidias 之外的其他 GPU 我如何在 python 中选择我的 radeon gpu 作为设备 显然 像 device torch cuda is available 或
  • 将布尔属性编辑器转换为 MVC 视图中的下拉列表

    我目前已经搭建了一个视图 其中模型的布尔属性被传递给 Html EditorFor 帮助器 Html EditorFor model gt model EndCurrentDeal 一切都很好 但我真正想做的是将其按摩到下拉菜单中 例如
  • 在reactJS中下载文件的按钮

    我目前正在制作个人作品集 我正在尝试制作一个按钮 如果您单击它 则应下载简历 code
  • 需要详细说明未处理的延续参考

    我们的公司门户无法从 AD 中获取某个用户的组 在门户日志中 我们看到此错误 javax naming PartialResultException 未处理的继续引用剩余名称 我在 Google 上搜索了该错误 似乎描述此情况的最佳症状以及
  • C# 中的 Unix 时间转换 [重复]

    这个问题在这里已经有答案了 我正在尝试以unix时间获取GMT 我使用以下代码 public static long GetGMTInMS var unixTime DateTime Now ToUniversalTime new Date
  • CloudFormation 问题:无法删除堆栈

    我为我们的资源创建 CloudFormation 模板 它包括 Lambda 函数 API 网关 角色等 为了验证我们的模板 我使用它创建 CloudFormation 堆栈 检查我更新的一些资源 然后删除堆栈 但上次我尝试删除堆栈时收到这
  • Git 查找历史上所有的二进制文件

    抱歉 如果这与上一个问题重复 但我找不到我要找的东西 我正在将一个大型 cvs 代码集 20 多个具有 15 年历史的存储库 10 15 GB 大小 转换为 git 大部分大小是由于过去与代码一起提交的二进制文件造成的 虽然某些二进制文件是
  • 在 R 中绘制简单数据

    我有一个逗号分隔的文件 名为foo csv包含以下数据 scale serial spawn for worker 5 0 000178 0 000288 0 000292 0 000300 10 0 156986 0 297926 0 0
  • 在 Android Studio 中调试时证书验证路径错误

    我刚刚生成了示例应用程序https flutter dev docs get started codelab https flutter dev docs get started codelab 当我点击 Android Studio 中的
  • Objective-C:在应用程序上播放 Youtube 视频

    我正在尝试探索在 iOS 应用程序开发中我还能做些什么 现在我尝试在我的应用程序中包含一个视频 我下面有这段代码 旨在在视图加载时播放 YouTube 视频 但我得到的只是一个黑色的 webView NSString videoURL ht
  • R 中是否有 FoldLeft 函数?

    我想知道R中是否有foldLeft函数 和foldRight 的实现 该语言应该是 相当 面向功能的 因此我认为应该有类似的东西 但我在文档中找不到它 对我来说 foldLeft 函数适用于列表并具有以下签名 foldLeft B z B
  • 我应该分配或重置 unique_ptr 吗?

    考虑到所拥有对象的生命周期与其所有者相关联的常见情况 我可以通过以下两种方式之一使用唯一指针 它可以被赋值 class owner std unique ptr
  • iPhone开发:如何为UIActionSheet创建彩色或半透明背景?

    当您尝试在 iPhone 的 便笺 应用程序中删除便笺时 会弹出 UIActionSheet 该片材是半透明的 但不是黑色半透明的 这是如何实现的 是否可以将 UIActionSheet 的背景设置为某种颜色 我通常实现以下委托方法 voi
  • 通过内联汇编锁定内存操作

    我对低级的东西很陌生 所以我完全不知道你可能会遇到什么样的问题 我什至不确定我是否正确理解 原子 一词 现在我正在尝试通过扩展程序集围绕内存操作制作简单的原子锁 为什么 为了好奇心 我知道我正在重新发明轮子 并且可能过度简化了整个过程 问题
  • 在绘图中同时使用组和颜色

    我正在尝试绘制多个维度r使用plotly 是否可以同时使用color and group因子变量上的参数是否有一条改变颜色的线 Example grp lt c letters c 1 1 1 1 2 2 2 2 a lt c 1 2 3
  • 设置操作栏标题和副标题

    我想在编译之前设置操作栏的标题和副标题 我有办法这样做 ActionBar ab getActionBar ab setTitle My Title ab setSubtitle sub title 但我不想在运行时这样做 是否有任何 xm
  • Spring注入Servlet

    所以我看到了这个问题 Spring依赖注入到其他实例 https stackoverflow com questions 9127807 spring dependency injection to other instance 并想知道我