public class Test {
private Man testMan;
{
testMan = testRun();
}
// lambad方式
public Man testRun(){
return this::selfRun;
}
// 匿名内部类方式
public Man testRun2(){return new Man(){
@Override
public void run() {
selfRun();
}
};};
public void selfRun(){
System.out.println("xxxx");
}
public static void main(String[] args) {
Test test = new Test();
test.testMan.run();
test.testRun2().run();
}
}
@FunctionalInterface
interface Man{
void run();
}
TomcatStarter中ServletContextInitializer.onstartup 调用中用到了这种方法。其中调用到了ServletWebServerApplicationContext#selfInitialize
// ServletWebServerApplicationContext类
private void createWebServer() {
WebServer webServer = this.webServer;
ServletContext servletContext = this.getServletContext();
if (webServer == null && servletContext == null) {
ServletWebServerFactory factory = this.getWebServerFactory();
// 将TomcatStarter 添加到了 ServletContainerInitializer[]中, tomcat启动时会遍历调用 ServletContainerInitializer#onStartUp方法
this.webServer = factory.getWebServer(new ServletContextInitializer[]{this.getSelfInitializer()});
}
....
}
private ServletContextInitializer getSelfInitializer() {
return this::selfInitialize;
}
private void selfInitialize(ServletContext servletContext) throws ServletException {
this.prepareWebApplicationContext(servletContext);
this.registerApplicationScope(servletContext);
WebApplicationContextUtils.registerEnvironmentBeans(this.getBeanFactory(), servletContext);
Iterator var2 = this.getServletContextInitializerBeans().iterator();
while(var2.hasNext()) {
ServletContextInitializer beans = (ServletContextInitializer)var2.next();
beans.onStartup(servletContext);
}
}
TomcatStarter中遍历ServletContextInitializer#onStartup会调用上面的selfInitialize方法
//TomcatStarter类
public void onStartup(Set<Class<?>> classes, ServletContext servletContext) throws ServletException {
try {
ServletContextInitializer[] var3 = this.initializers;
int var4 = var3.length;
for(int var5 = 0; var5 < var4; ++var5) {
ServletContextInitializer initializer = var3[var5];
initializer.onStartup(servletContext);
}
} catch (Exception var7) {
this.startUpException = var7;
}
}