栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

记录一下关于看spring源码遇到的问题:ServletContextInitializer

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记录一下关于看spring源码遇到的问题:ServletContextInitializer

疑问点:  

                明明需要传入的是对象,但是getSelftInitialzer()方法里面又引用了 其他方法??

 传入的是:

this.getSelfInitializer()         这个方法,这个方法点进去之后又是this::selfInitialize;

后续打断点的时候

                执行onStartup()方法的时候就会执行到selfInitialize方法;

 讲解:

               是因为ServletContextInitializer是一个函数式接口,所以里面直接传入的是一段lambda表达式,该lambda表达式又用的是方法的引用;所以看起来比较复杂,下面我们拆分一下就应该明白了

  解析:

               1.创建ServletContextInitializer类型的数组,所以this.getSelfInitializer()返回的是ServletContextInitializer的实现类

        new ServletContextInitializer[]{this.getSelfInitializer()}

                2.函数式接口的实现类

        ServletContextInitializer是一个函数式接口        :有一个参数,没有返回值

                1.8之前:我们是通过匿名内部类实现:

 new ServletContextInitializer() {
            @Override
            public void onStartup(ServletContext servletContext) throws ServletException {

            }
        };

        1.8之后,引入了lambda表达式,我们可以写成下面的形式

        //java8 函数式接口    
        ServletContextInitializer s1 = d -> System.out.println("----"+实现onStartup()方法);

                3.方法引用

                

根据上面的我们就可以清楚的明白了嘛,

this::selfInitialize  调用的是方法的引用,返回了一段lambda表达式(其实也就是一个实现类的实现方式,只不过java8可以用lambda表达式这样写, 相当于也是一个实现类),因为
ServletContextInitializer是函数式接口

打断点:传过去的就是lambda表达式

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/530907.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号