【问题标题】:How to call a Spring managed object from a POJO?如何从 POJO 调用 Spring 托管对象?
【发布时间】:2016-05-07 10:27:15
【问题描述】:

我正在运行一个 web 应用程序,它有一个公开的类(可用于其他 POJO 类)并且有一个自动装配的私有成员。

Spring 托管类

public class EPSQueueSender {
   @Autowired
   private AmqpTemplate epsMessageTemplate;

   public void dosomething(...){
     epsMessageTemplate.convertAndSend(...); // Here epsMessageTemplate is null if instance of EPSQueueSender taken from other POJO 
   }
}

POJO 类

   public class Test{
       EPSQueueSender sender = new EPSQueueSender();
       sender.dosomething(....); // gives null exception on epsMessageTemplate
   }

Spring 代码(作为 WebApp 运行)和 POJO 类代码(不同的 Jar)在同一个 JVM 上。 POJO 无法获取已初始化的自动装配对象。但是,如果我在 webApp 项目中使用它,它会被初始化。

有人可以提出一些建议,我该如何克服这个问题? 我想尝试的最后一件事是将网络服务器作为来自 POJO 的 http 请求。

【问题讨论】:

  • 你期望spring如何注入mesageTemplate?您是在 xml 中定义 bean 还是依赖 spring 4?
  • 在xml中定义,xml是从servlet导入的。所以这个 bean 正确地自动装配并在 spring 端代码初始化
  • 你如何实例化这个调用?是春节前吗?可以分享一下你的 spring 配置吗?

标签: java spring pojo applicationcontext


【解决方案1】:

beans 可以是 pojo 或 xml,许多 examples 可能会有所帮助。您已经拥有@autowired,但您没有创建属于使用@Configuration 注释的类的@bean 方法本身

【讨论】:

    【解决方案2】:

    您的问题可以使用 spring 的 @Configurable 功能来解决。为此,您已经在 xml 中配置了类似 belove 的代码

    <context:annotation-config/>
    
        <context:spring-configured/>
        <context:load-time-weaver/> 
    

    在Java配置中如下:

    @Configuration
    @EnableAspectJAutoProxy
    @EnableSpringConfigured
    @EnableLoadTimeWeaving
    public class ConfigApplicationContext {
    }
    

    使用此配置,您可以受益于通过内置 Spring bean AnnotationBeanConfigureAspect 的负载波动方面技术,您可以将 Spring bean 注入使用 @Configurable 注释的 pojo 中。你应该有如下代码:

    @Configurable
     public class Test{
    
        @Autowired
        private EPSQueueSender sender;
    
    
         public void method(){
           sender.dosomething(....); // gives null exception on epsMessageTemplate
    
        }
      }
    

    当然,因为您使用的是负载波技术,所以您已经配置了一个代理来执行这些工具。配置非常简单,你可以在 jvm 或 tomcat 的开头添加如下一行:

    java -javaagent:agent/spring-instrument.jar的jar路径

    当然记得插入aop和spring aop maven依赖:

     <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aop</artifactId>
          <version>yourVersion</version>
      </dependency>
    
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aspects</artifactId>4
          <version>yourVersion</version>
      </dependency>
    
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-instrument</artifactId>
          <version>yourVersion</version>
      </dependency>
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      相关资源
      最近更新 更多