我试图使用Spring和Jhipster访问某些数据库。我想使用注入服务。
当使用休息控制器时,我没有问题,但是当我尝试在pojo中使用注入服务时,此服务为空。
@RestController
public class TheRestController {
@Autowired
protected TheService theService;
@RequestMapping("/test")
public void test() {
if (theService == null) {
System.out.println("rest : null");
}
{
System.out.println("Rest : service is not null");
}
System.out.println("Call Pojo ");
Pojo pojo = new Pojo();
pojo.process();
}
}
该服务不为null,可用于访问数据库。 但是当我尝试使用Pojo时,在其余控制器中或直接在main()中,服务为空。
我的Pojo与Rest控制器完全相同:
public class Pojo {
@Autowired
protected TheService theService; // this one is allways null.
public void process(){
if (theService == null){
System.out.println( "POJO : null" );
}else{
System.out.println("POJO : service is not null");
}
}
}
发送请求时,我有输出:
Rest : service is not null
Call Pojo
POJO : null
我试过@Autowired,@ Resource和@Inject,结果相同。
如何在Pojo中访问服务(不总是将其作为参数传递)?
答案 0 :(得分:2)
Spring容器只能管理在该容器中创建的bean(对象) - 如果使用new
关键字创建对象,Spring无法注入依赖项(它甚至不知道该对象存在) 。如果您想在main()
中使用依赖项,则必须:
在Spring配置中声明Pojo,或将其注释为@Component
或@Service
在main中创建一个新的Spring容器:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register("path.to.your.package");
context.refresh();
获取Pojo的(Spring管理的)实例:
Pojo myPojo = context.getBean(Pojo.class);
答案 1 :(得分:0)
我只会添加Jiri的答案(除非Pojo是单身人士,否则我不建议这样做。)
你应该了解生命周期。如果Pojo不是单身人士,我建议您不要使用Spring来管理Pojo或autowire或两者的实例(虽然可以做到这一点很慢,只是自动装配和管理之间存在差异。)
如果您根据请求创建Pojo,则不应使用Spring 来管理对象的连线和创建。
对于一般的启发,你可以通过正常的对象构造自动连接bean,即new Pojo
通过AspectJ和@Configurable
。这些豆子是由春天自动装配但不是由春天管理。
Spring还支持管理和自动装配非单例bean(see Spring scope),但我真的不建议这样做。
相反,您应该创建单例(弹簧管理组件,即@Service
或@Component
)来创建非单例对象,如Pojo
。这称为工厂模式。