lambda的特殊使用方式,springboot初始化中实例使用

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;
        
        }

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值