springboot抽象类中注入bean
1.问题为了能够让我们的代码复用,我们需要创建一个抽象类来完成公共代码的书写,或者是定义公共的规范规则。我们知道抽象类是无法实例化的。那么抽象类能不能注入bean呢?2.代码实例@Slf4jpublic abstract class Animal {@Autowiredprivate Drink drink;public void run(){System.out.println("all ani
·
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的话就会报异常。
更多推荐
已为社区贡献1条内容
所有评论(0)