我正在运行一个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
您的问题可以使用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>
我希望这能帮助你