1.问题

为了能够让我们的代码复用,我们需要创建一个抽象类来完成公共代码的书写,或者是定义公共的规范规则。我们知道抽象类是无法实例化的。那么抽象类能不能注入bean呢?

2.代码实例

@Slf4j
public abstract class Animal {

    @Autowired
    private Drink drink;

    public void run(){
        System.out.println("all animals can run");
    }


    public void drinkSomething(){
        drink.drink();
    }
}
@Component
public class Dog extends Animal{


    @Override
    public void run() {
        System.out.println("dog run");
    }

}
@Component
public class Drink {

    public  void drink(){
        System.out.println("drink");
    }
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestDemo {
    
    @Test
    public void test(){
        Animal animal = new Dog();
        animal.run();
        animal.drinkSomething();
    }
}

我们可以看到 如果我们在abstract的子类是标记了@Component 注解,那么在实例化的时候是会去把父类中的属性也实例化。AutowiredAnnotationBeanPostProcessor的方法buildAutowiringMetadata, 遍历父类,将注解了的field封装成InjectedElement 如下代码片段elements.addAll(0, currElements);targetClass = targetClass.getSuperclass();

如果我们的没有使用@Component的话就会报异常。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐