Spring5 接口 ImportBeanDefinitionRegistrar 中 default 方法

Posted kennywang0314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring5 接口 ImportBeanDefinitionRegistrar 中 default 方法相关的知识,希望对你有一定的参考价值。

环境:

java version "13.0.1" 2019-10-15

Java(TM) SE Runtime Environment (build 13.0.1+9)

 

今天在学习 Spring5 注解,想通过自定义的方式想 IOC 容器中加载类,其中一种方法为 用类实现 ImportBeanDefinitionRegistrar 接口,但是实现该接口后并未提示实现接口方法。

ImportBeanDefinitionRegistrar中定义了两个方法:

 

default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry,BeanNameGenerator importBeanNameGenerator)

 

default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry)

方法用 default 修饰,因此简单学习了下 default 修饰

1.在java8以后,接口中可以添加使用default修饰的方法,default修饰方法只能在接口中使用,在接口中被default标记的方法为普通方法,可以直接写方法体。

  因此实现类可以直接使用接口中的方法。

技术图片
public interface A {
    public default void a(){
        System.out.println("This is Interface A.a()");
    }
}

public class B implements A{
 
}

public class Test {
    public static void main(String[] args) {
        B b = new B();
        b.a();
    }
}
default 接口

2.如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法。因为,此时实现类不知道应该继承哪一个接口中的default方法。

技术图片
public interface A {
    public default void a(){
        System.out.println("This is Interface A.a()");
    }
}

public interface C {
    public default  void a(){
        System.out.println("This is Interface C.a()");
    }
}

public class B implements A,C {
    
}
default 继承两个接口

如以上代码,Idea会提示 :inherits unrelated defaults for a() from types A and C

所以说需要修改为:

技术图片
public class B implements A,C {
    @Override
    public void a() {
        System.out.println("This is Interface C.a()");
    }
}
default 添加方法实现

当类实例化时,会调用实现类当方法。

3.如果再有类分别继承实现类 和 实现接口,会调用实现类方法

技术图片
public class D extends B implements A{
}

public class Test {
    public static void main(String[] args) {
        D d = new D();
        d.a();
    }
}
default

This is Class B.a()

以上是关于Spring5 接口 ImportBeanDefinitionRegistrar 中 default 方法的主要内容,如果未能解决你的问题,请参考以下文章

Spring5源码分析之启动类的相关接口和注解

Spring5

Spring5 AOP 学习笔记

Spring_11-Spring5总结

Spring5:使用Spring中的MetadataReader来读取class文件并为接口执行jdk代理

Spring | Spring5学习笔记 #yyds干货盘点#