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()

posted @ 2020-02-06 21:59  KennyWang0314  阅读(271)  评论(0编辑  收藏  举报