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

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

记录一下关于看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表达式

 

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5522827.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-13
下一篇2022-12-13

发表评论

登录后才能评论

评论列表(0条)

    保存