使用Pojo而不是Rest Controller时,Spring Service注入为空

时间:2015-10-12 14:38:07

标签: java spring dependency-injection

我试图使用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中访问服务(不总是将其作为参数传递)?

2 个答案:

答案 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。这称为工厂模式。