如何从POJO调用Spring托管对象



我正在运行一个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请求访问Web服务器。

bean可以是pojo或xml,许多例子可能会有所帮助。您已经有了@autowired,但您没有创建属于用@Configuration

注释的类的@bean方法本身

您的问题可以使用spring的@Configurationfeature来解决。对于它,您可以用下面的这样的代码在xml中进行配置

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

在Java中,如下图所示:

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

有了这个配置,您可以受益于负载波动方面技术,该技术通过在Spring bean中构建AnnotationBeanConfigureAspect,您可以在用@configuration.注释的pojo中注入Spring bean。你可能有如下代码:

@Configurable
 public class Test{
    @Autowired
    private EPSQueueSender sender;

     public void method(){
       sender.dosomething(....); // gives null exception on epsMessageTemplate
    }
  }

当然,由于您使用的是负载波技术,因此您已经配置了一个代理来执行istruments。配置非常简单,您必须在jvm或tomcat的开头添加一行,如下所示:

java-javaagent:带有agent的jar路径/spring-instrument.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>

我希望这能帮助你

最新更新