получить значение null в поле @Autowired в классе Abstract - PullRequest
0 голосов
/ 31 мая 2019

У меня есть абстрактный класс, унаследованный несколькими подклассами.В другом классе я получаю имя класса и должен создать экземпляр класса для вызова базового метода в родительском (абстрактном) классе.Но я получил значение null в поле «кеш» @Autowired, которое используется в базовом методе.ClassName - это поле ввода от внешнего интерфейса.Так что я думаю, что мне нужно создать экземпляр нового объекта для вызова метода.Заранее спасибо!

public abstract class Data(){
   @Autowired protected Cache cache;

   private Abc getDataContent(){
      if(cache.containsKey()){
        //do something
      }else{
        //do something else
      }
    }    
}

public class Data1 extends Data(){
  public Data1(){
    super();
  }
}

public class Data2 extends Data(){
  public Data2(){
    super();
  }
}


public class Resource(){

  public Abc getContent(){
    Class<Data<?>> className = getClassName();
    //className  will be the classCanonicalName of Data1 or Data2;

    return className.newInstance().getDataContent();
  }

}

Ответы [ 2 ]

0 голосов
/ 01 июня 2019

Чтобы @Autowire, ваш объект должен быть в пружине ApplicationContext или в контейнере IOC, вы не можете напрямую создать его экземпляр с помощью отражения, потому что пружина использует прокси-сервер CGlib для улучшения ваших классов и создания егодоступны через контекст приложения для внедрения в вашу реализацию. фасоль и инъекция

0 голосов
/ 01 июня 2019

Чтобы избежать пустого поля, вам нужно разрешить Spring управлять bean-объектами (объектами), и простой способ сделать это - использовать аннотации @Component для Data1 и Data2.

Также обратите внимание, что если вы создаете экземпляр объекта вручную (например, new Data1();), то Spring не будет знать об этом экземпляре;

...