问题:
希望把子类公共的属性放在抽象类中。运行时,希望在Spring 扫描@Component注解,自动加载子类的同时,自动注入抽象父类的属性。
抽象父类:
@Component public abstract class BaseCar { @Autowired Settings settings; }
子类:
@Component public class SportsCar extends BaseCar{ public void print(){ //运行时报空指针异常,说明settings并没有通过@Autowired加载 System.out.print(settings.getSpeed()); } }
运行时报空指针异常,说明子类中,super.settings并没有通过@Autowired加载
原因是 Spring Ioc 注入的对象是实例,而不是类。
实例化子类的时候,抽象父类不可能实例化,所以属性 settings 并没有自动加载。 解决办法:
父类:
public abstract class BaseCar { Settings settings; }
子类:
@Component public class SportsCar extends BaseCar{ //Autowired修饰方法时,根据方法参数类型判断实例化哪个类 @Autowired public void haha(Settings settings){ super.settings=settings;//父类属性注入 } public void print(){ System.out.print(settings.getSpeed()); } }
测试类:
@Component public class Test { @Autowired SportsCar sportsCar ; @PostConstrust public void test(){ sportsCar.print();// 成功输出。abstract类的属性自动注入成功。 } }
参考文献:
[1] Kshitiz Sharma. http://stackoverflow.com/questions/16733509/proper-way-to-inject-parent-class-dependencies-with-spring-annotations May 24, 2013.