疑问点:
明明需要传入的是对象,但是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表达式