在Spring 3中使用@Autowired

时间:2013-10-14 05:49:46

标签: java spring

我有一个使用Spring 3的JPA应用程序。我试图使用@PostConstuct来使用特定的Facility代码来保护数据库。当我在具有@PostConstuct方法的类中持久化代码时 - 它可以工作。当我调用第二个类来保持代码时,它会失败。这与我使用@Autowired注释的方式有关吗?

这是Preloader类的一部分:

public class Preloader {
   @Autowired
   private FacilityService service;

   @PostConstruct
   public void init() {
      loadCodeSet();
   }

   private void loadCodeSet() {
      // This works
      Facility created = new Facility();
      created.setCode("Uni");
      created.setDescription("University");

      Facility returned = service.create(created);

      // This fails
      CodeSetLoader cl = new CodeSetLoader();
      l.load();
    }

这是加载类的一部分:

public class CodeSetLoader {

    @Autowired
        private FacilityService facilityService;

    public void load() {
        loadFacilities();
    }

    private void loadFacilities() {
        Facility test = new Facility();
        test.setCode("UNI");
        test.setDescription("University");

        Facility returned = facilityService.create(test);
    }

例外情况包括:

Caused by: java.lang.NullPointerException
    at util.CodeSetLoader.loadFacilities(CodeSetLoader.java:42)
    at util.CodeSetLoader.load(CodeSetLoader.java:24)
    at util.Preloader.loadCodeSet(Preloader.java:68)
    at util.Preloader.init(Preloader.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:344)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:295)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:130)
    ... 22 more

希望有人可以帮忙解决这个问题?

4 个答案:

答案 0 :(得分:3)

@Autowired@PostConstruct和朋友只能使用托管bean,而不是您调用new的对象。如果Spring不知道bean,它就不能自动装配它。

答案 1 :(得分:2)

您需要在Preloader中@Autowired CodeSetLoader:

public class Preloader {
   @Autowired
   private FacilityService service;
   @Autowired
   CodeSetLoader codeSetLoader;

   @PostConstruct
   public void init() {
      loadCodeSet();
   }

   private void loadCodeSet() {
      // This works
      Facility created = new Facility();
      created.setCode("Uni");
      created.setDescription("University");

      Facility returned = service.create(created);

      codeSetLoader.load();
    }
}

答案 2 :(得分:2)

仅为Spring创建的对象调用Autowired。

如果可能,您应该自动装配CodeSetLoader而不是调用new

public class Preloader {
   @Autowired
   private FacilityService service;

   @Autowired
   CodeSetLoader codeSetLoader;

答案 3 :(得分:1)

你自己构建CodeSetLoader而不是让Spring这样做。结果,facilityService从未获得自动装配。

你需要让Spring同时管理它们。