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

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值