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

原文地址:https://www.cnblogs.com/KennyWang0314/p/12271156.html

时间: 2024-08-10 13:57:03

Spring5 接口 ImportBeanDefinitionRegistrar 中 default 方法的相关文章

浅谈Java 8中的方法引用(Method References)

本人接触Java 8的时间不长,对Java 8的一些新特性略有所知.Java 8引入了一些新的编程概念,比如经常用到的 lambda表达式.Stream.Optional以及Function等,让人耳目一新.这些功能其实上手并不是很难,根据别人的代码抄过来改一下,并不要知道内部的实现原理,也可以很熟练地用好这些功能.但是当我深究其中一些细节时,会发现有一些知识的盲区.下面我就来谈一下Java 8中的Method References这个概念. 首先我给出官方对于这一概念的详细解释,https:/

教你在Java接口中定义方法

基本上所有的Java教程都会告诉我们Java接口的方法都是public.abstract类型的,没有方法体的. 但是在JDK8里面,你是可以突破这个界限的哦. 假设我们现在有一个接口:TimeClient,其代码结构如下: import java.time.*; public interface TimeClient { void setTime(int hour, int minute, int second); void setDate(int day, int month, int yea

Java 8 中为什么要引出default方法

(原) default方法是java 8中新引入进的,它充许接口中除了有抽象方法以外,还可以拥用具有实现体的方法,这一点跟jdk8之前的版本已经完全不一样了,为什么要这样做呢? 拿List接口举例,在java 8以前的老系统中有一个开发人员自己写了一个类DefinedList,它继承于List接口. 毫无疑问,DefinedList将会实现List接口中的所有抽象方法. 在java 8中,甲骨文觉得其实可让List做更多的事,比如开发中常用的给List数据进行排序,于是它们想加一个sort方法.

jdk1.8新特性之接口default方法

众所周知,default是java的关键字之一,使用场景是配合switch关键字用于条件分支的默认项.但自从java的jdk1.8横空出世以后,它就被赋予了另一项很酷的能力--在接口中定义非抽象方法. 众所周知,java的接口只能定义静态且不可变的常量或者公共抽象方法,不可能定义非抽象的具体方法.但自从jdk1.8横空出世以后,它就被default关键字赋予了另一项很酷的能力--在接口中定义非抽象方法.好了不废话了,看具体例子吧: 1.父接口Iterable,定义了两个default方法forE

Java8新特性(一)_interface中的static方法和default方法

为什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Collection中的default方法.所以准备专门写写关于java8新特性的文章,虽然现在10已经发布了.但还是要认真的去了解下新版本的变化. static方法 java8中为接口新增了一项功能:定义一个或者更多个静态方法.用法和普通的static方法一样. 代码示例 public interface

java8 接口的default方法和静态方法

以前,接口里的方法要求全部是抽象方法,java8以后允许在接口里定义默认方法和类方法.不同的是:默认方法可以通过实现接口的类实例化的对象来调用,而类方法就相对于工具方法了.需要注意的是,此处的静态方法只能被public修饰(或者省略不写),不能是private或者protected. 好处:在Java 8 之前,接口不能有静态方法,因此按照惯例,接口Type 的静态工厂方法被放一个名为ypes 的不可实例化的伴生类中.例如Java Collections Framework的集合接口有45 个工

List接口中特有方法

import java.util.ArrayList; import java.util.List; /* List接口中特有方法: 添加 add(int index, E element) addAll(int index, Collection<? extends E> c) 获取: get(int index) indexOf(Object o) lastIndexOf(Object o) subList(int fromIndex, int toIndex) 修改: set(int i

Java接口中的方法

接口中可以含有变量和方法.但是,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private.protected.static. final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法. 这些都是大家熟知的,但是

证明接口interface中定义的方法的访问权限为public

如题,证明Java中接口文件中定义的方法访问权限为public. 众所周知,接口中的方法默认是public abstract 类型的,它必须由子类实现之.那怎么证明呢,反射. 定义接口文件 package com.zhangqi.jvm; import java.util.Date; public interface ITest { double PI = 3.14; Date CREATE_TIME = new Date(); void play(); String getName(); }