我有一个抽象类,并被多个子类继承。在另一个类中,我获得了类名称,并且需要实例化该类以调用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();
}
}
答案 0 :(得分:0)
为避免空字段,您需要让spring管理Bean(对象),一种简单的方法是在@Component
和Data1
上使用Data2
注释。
另外,请注意,如果您手动实例化一个对象(例如new Data1();
),那么Spring将不会意识到该实例;
答案 1 :(得分:0)
为了进行@Autowire
,您的对象应该位于弹簧ApplicationContext
或IOC容器中,您不能通过反射直接创建它的实例,因为弹簧正在使用CGlib代理来增强您的类,并通过应用程序上下文将其插入到您的实现中。 the official documentation