Spring 用注解Annotation注入 abstract 抽象父类的属性

Spring 用注解Annotation注入 abstract 抽象父类的属性

原创  2016年08月10日 18:46:43
  • 12395

问题:

希望把子类公共的属性放在抽象类中。运行时,希望在Spring 扫描@Component注解,自动加载子类的同时,自动注入抽象父类的属性。

抽象父类:

@Component
public abstract class BaseCar {
    @Autowired
    Settings settings;
}
  • 1
  • 2
  • 3
  • 4
  • 5

子类:

@Component
public class SportsCar extends BaseCar{
    public void print(){
        //运行时报空指针异常,说明settings并没有通过@Autowired加载
        System.out.print(settings.getSpeed());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行时报空指针异常,说明子类中,super.settings并没有通过@Autowired加载

原因是 Spring Ioc 注入的对象是实例,而不是类。

实例化子类的时候,抽象父类不可能实例化,所以属性 settings 并没有自动加载。

解决办法:

父类:

public abstract class BaseCar {
    Settings settings;
}
  • 1
  • 2
  • 3

子类:

@Component
public class SportsCar extends BaseCar{
    //Autowired修饰方法时,根据方法参数类型判断实例化哪个类
    @Autowired 
    public void haha(Settings settings){
        super.settings=settings;//父类属性注入
    }

    public void print(){

        System.out.print(settings.getSpeed());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

测试类:

@Component
public class Test {
    @Autowired
    SportsCar sportsCar ;
    @PostConstrust
    public void test(){
        sportsCar.print();// 成功输出!abstract类的属性自动注入成功!
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

参考文献: 
[1] Kshitiz Sharma. http://stackoverflow.com/questions/16733509/proper-way-to-inject-parent-class-dependencies-with-spring-annotations May 24, 2013.

你可能感兴趣的:(Spring)