在Abstract类的@Autowired字段中获取null

时间:2019-05-31 20:32:33

标签: spring components autowired

我有一个抽象类,并被多个子类继承。在另一个类中,我获得了类名称,并且需要实例化该类以调用parent(abstract)类中的基本方法。但是我在基本方法中使用的@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 :(得分:0)

为避免空字段,您需要让spring管理Bean(对象),一种简单的方法是在@ComponentData1上使用Data2注释。

另外,请注意,如果您手动实例化一个对象(例如new Data1();),那么Spring将不会意识到该实例;

答案 1 :(得分:0)

为了进行@Autowire,您的对象应该位于弹簧ApplicationContext或IOC容器中,您不能通过反射直接创建它的实例,因为弹簧正在使用CGlib代理来增强您的类,并通过应用程序上下文将其插入到您的实现中。 the official documentation