Spring 用注解Annotation注入 abstract 抽象父类的属性
问题:
希望把子类公共的属性放在抽象类中。运行时,希望在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.
