【问题标题】:Injecting spring beans into legacy web app POJOs [duplicate]将spring bean注入遗留Web应用程序POJO [重复]
【发布时间】:2015-09-19 20:57:01
【问题描述】:

为了在我的旧 Web 应用程序 (Tomcat 8.0.26) 中提供 POJO 发送 ActiveMQ 消息的能力,我接受了将 Camel (2.15.2) / Spring (4.2.1) 引入应用程序的建议纯粹是为了管理池化 MQ 连接。我希望没有更简单的方法。

以 Spring 的方式做事我认为一切都需要基于 MVC 架构,其中 HTTP servlet 感知控制器可以访问 servlet 上下文,因此可以访问 Spring 上下文,以便将 beanFactory bean 注入使用 @Controller 注释的类中和@Service (实际上必须有一个Spring @Controller 类使Spring 能够注入@Service 类。

但是,正如我所说,这是不会使用 Spring Web 框架的遗留代码。

在经历了很多痛苦之后,似乎我可以将 beanFactory bean 注入我的 POJO 的唯一方法是走 AspectJ 和 Weaving 路线。在我走这条路之前,有人能告诉我这是目前最好的方法吗(我读到的描述这个解决方案的内容来自 2011 Can't get Spring to inject my dependencies - Spring Newbie)?你能指出我的文档和一个工作示例吗?

非常感谢。

【问题讨论】:

  • 这已经足够接近(而且我在移动设备上,Spring 标签上没有 dupehammer),我将在我的文章中标记为副本。我建议使用 AspectJ 方法;它需要您的用例的最小实施工作。

标签: spring


【解决方案1】:

1) 带有@Configurable 的aspectj

在您的@Configuration 注释类/es 中

您可以添加更多注释 @Configuration @EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED) @EnableSpringConfigured @EnableAspectJAutoProxy

启用aspectj和@Configurable注解, 您需要将 aspectj lib 导入您的项目并在您的 tomcat lib 文件夹中添加 spring tomcat 可检测的 java 代理(看看这里,它解释了如何配置 tomcat)http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/instrument/classloading/tomcat/TomcatInstrumentableClassLoader.html

如果您要使用“new”创建您的 pojo,这对您没有帮助 MyPojo p = new MyPojo(); // 这没有什么黑魔法,你需要自己满足依赖关系)但这会很有帮助,例如,当你通过像 hibernate 这样的框架加载一些实体并且你想向它们注入一些东西时。@Configurable 这是一个选项可以在这些情况下进行评估,对于您所描述的我宁愿不使用它。

2) 你可以有一些静态方法使用一些静态设置的 spring-beans 并从你的 pojos 中使用它们,比如

class Util{

私有静态 SprintBeanWithJmsSupport x;

公共静态 setSpringBeanToHandleJmsMessages(SprintBeanWithJmsSupport x){ 实用程序.x = x; }

公共静态 sendJmsMessage(JmsMessage m){ x.sendMessage(m) } } 你可以使用 Util.sendJmsMessage(...)

这有点糟糕,但它确实有效,我个人不喜欢这种方法

3) 在你的 pojo 中设置你的 spring bean,当他们需要使用它们时(可能在一些适合你的领域的漂亮接口后面)

如果您使用 spring mvc,您可能最终会拥有一些将使用某些服务的控制器(通常它们处理安全/数据库访问,并且是启动“用例”的入口点),因为这些层中的所有内容都是由 spring 处理,将 spring-bean 传递给你的 pojos 处理 jms 消息将非常简单,在我看来,这似乎是一个很好的解决问题的方法

我主要是根据记忆去的,有些东西可能不完全准确,再加上我的英语是..它是什么,所以无论如何希望这能有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2012-03-05
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多