原因是我在一个开源项目中看到一个类,类上面没有使用 Spring 的注解,但是里面确使用了 @Autowired,起初我以为是通过 AutowireCapableBeanFactory 去另外注入的,后面发现这个类只被另外一个类所继承,不过子类有被注入 Spring。
于是,我想 Spring 对于这个子类,是不是也会自动帮他把父类里面的属性进行注入,因为父类的方法是公共的,要是属性不注入那就无法使用了。
测试:
@Component
public class CSource {
public void test(){
System.out.println("大鱼");
}
}
public class ConfigParent {
@Autowired
private CSource cSource;
public void test(){
cSource.test();
}
}
@Configuration
public class Config extends ConfigParent{
}
结果:
@Autowired
private Config config;
@Test
void contextLoads() {
// 输出结果:大鱼
config.test();
}
结果就是会帮忙自动注入属性,那 Spring 肯定是通过反射拿到了 父类的属性。当然,子类是无法拿到父类的私有属性的,但是子类可以拿到父类,所以可以通过递归的方式先拿父类。
void printAllDeclaredFields(Class<?> clazz) {
if (clazz == null) {
return;
}
// 打印当前类的所有声明字段
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
// 递归调用以打印父类的字段
printAllDeclaredFields(clazz.getSuperclass());
}