SpringBoot源码简易篇

简介: SpringBoot源码简易篇

通过手写模拟SpringBoot源码了解其中的逻辑原理,自动配置,整合Tomcat,启动过程等。

目录

启动类

@MySpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class);
    }
}

MySpringBootApplication注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Configuration
@ComponentScan
@Import(AutoConfigurationImportSelector.class)
public @interface MySpringBootApplication {
}

SpringApplication类

public class SpringApplication {
    public static void run(Class clazz){
        AnnotationConfigWebApplicationContext applicationContext=new AnnotationConfigWebApplicationContext();
        applicationContext.register(clazz);
        applicationContext.refresh();
        WebServer webServer = getWebServer(applicationContext);
        webServer.start(applicationContext);
    }
    private static WebServer getWebServer(ApplicationContext applicationContext){
        Map<String, WebServer> webServers = applicationContext.getBeansOfType(WebServer.class);
       if(webServers.isEmpty()){
           throw new NullPointerException();
       }
       if(webServers.size()>1){
           throw new IllegalStateException();
       }
        return webServers.values().stream().findFirst().get();
    }
}

WebServerAutoConfiguration类

@Configuration
public class WebServerAutoConfiguration implements AutoConfiguration{
    @Bean
    @ConditionalOnClass("org.apache.catalina.startup.Tomcat")
    public TomcatWebServer tomcatWebServer(){
        return new TomcatWebServer();
    }
}

TomcatWebServer类

public class TomcatWebServer implements WebServer{
     public void start(AnnotationConfigWebApplicationContext applicationContext) {
        Tomcat tomcat=new Tomcat();
        Server server = tomcat.getServer();
        Service service = server.findService("Tomcat");
        Connector connector=new Connector();
        connector.setPort(8081);
        Engine engine=new StandardEngine();
        engine.setDefaultHost("localhost");
        Host host=new StandardHost();
        host.setName("localhost");
        String contextPath="";
        Context context=new StandardContext();
        context.setPath(contextPath);
        context.addLifecycleListener(new Tomcat.FixContextListener());
        host.addChild(context);
        engine.addChild(host);
        service.setContainer(engine);
        service.addConnector(connector);
        //Springmvc
        tomcat.addServlet(contextPath,"dispatcher",new DispatcherServlet(applicationContext));
        context.addServletMappingDecoded("/*","dispatcher");
        try {
            tomcat.start();
        } catch (LifecycleException e) {
            e.printStackTrace();
        }
    }
}

MyCondition 类

public class MyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        Map<String, Object> annotationAttributes = annotatedTypeMetadata.getAnnotationAttributes(ConditionalOnClass.class.getName());
        String className= (String) annotationAttributes.get("value");
        try {
            Class<?> aClass = conditionContext.getClassLoader().loadClass(className);
            return true;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return false;
        }
    }
}

ConditionalOnClass注解

@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(MyCondition.class)
public @interface ConditionalOnClass {
    String value();
}

AutoConfigurationImportSelector类

public class AutoConfigurationImportSelector implements DeferredImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        //jdk SPI
        ServiceLoader<AutoConfiguration> serviceLoader = ServiceLoader.load(AutoConfiguration.class);
        List<String> list=new ArrayList<>();
        for (AutoConfiguration autoConfiguration : serviceLoader) {
            list.add(autoConfiguration.getClass().getName());
        }
        return list.toArray(new String[0]);
    }
}

文件源码下载地址在我的文件资源:https://download.csdn.net/download/qq_43649937/87521102

番外篇


由于文字代码太多,文字太少,这里写个java学习路线总结


对于想要学习Java编程语言的人来说,制定学习路线是非常重要的。在这篇文章中,我将为您提供一个基础的Java学习路线,帮助您更快地掌握Java编程语言。


Java 基础


首先,您需要了解Java基础知识。这些知识包括Java语法、变量和数据类型、运算符、流程控制语句、数组、类和对象等。这个阶段最好通过阅读一些Java入门书籍或者在线教程来学习。我的建议是,如果您已经有编程经验,可以选择一些更深入的学习资源,例如《Java核心技术》或者《Thinking in Java》。


面向对象编程


Java 是一种面向对象的程序设计语言。因此,在学习Java时,必须熟悉面向对象编程思想。这个阶段,您应该学习对象、类、封装、继承、多态等面向对象编程的概念。我的建议是在学习Java的同时,也可以去学习其他语言的面向对象编程,如C++或Python等。


Java 集合框架


Java集合框架是Java中最重要的部分之一。它包括了Java中大部分用于数据存储和处理的类和接口。了解集合框架非常重要,因为它们是您在编写Java程序时必须使用的最常见工具之一。我的建议是学习ArrayList、LinkedList、HashMap、HashSet等基本的集合类。


Java 输入输出流


在Java编程中,输入输出流是必不可少的。Java提供了各种各样的类和接口来访问文件、网络和其他设备上的数据。这个阶段,您应该学习如何使用Java的输入输出流来读取和写入文件、网络连接和其他数据源。我的建议是学习Java.io包中的InputStream和OutputStream类。


Java 网络编程


Java 是一个广泛用于网络编程的语言。了解Java网络编程对于开发网络应用程序非常重要。这个阶段,您应该去了解Java网络编程所需要的Socket编程、TCP协议和UDP协议。我的建议是跟随一些使用Java进行网络编程的教程学习,例如《Java网络编程》或者《Head First Java》。


Java 多线程编程


Java 实现多线程编程非常容易,并且可以有效地提高程序的性能。了解多线程编程对于开发复杂的应用程序至关重要。这个阶段,您应该学习Java中的线程模型、线程安全、同步和锁等概念。我的建议是学习Java中的Thread类和Runnable接口。


Java 数据库编程


Java 与数据库的连接对于许多应用程序来说是至关重要的。Java提供了一个称为JDBC(Java Database Connectivity)的API,它允许您使用Java编写与各种关系型数据库进行交互的应用程序。这个阶段,您应该学习如何使用JDBC API来连接数据库、执行SQL语句和处理结果集。我的建议是学习Java中的JDBC技术。


Servlet 和 JSP


Servlet 和 JSP 是Java Web开发的基础。Servlet 允许在Web服务器上运行Java代码,而JSP 允许您在HTML文档中嵌入Java代码。这个阶段,您应该学习如何编写Servlet和JSP以及如何将它们部署到Web服务器上。我的建议是学习Java EE平台相关的知识,如Tomcat或者其他应用服务器。


SSM ,Springboot, Springcloud等框架


Spring 是一个非常流行的Java应用程序开发框架。它提供了大量的组件和工具,以帮助您更轻松地编写高质量的Java应用程序。Spring家族非常强大。


总结


以上就是基础的Java学习路线总结。学习Java需要长时间的投入和练习,但如果您按照上述路线进行学习,您将能够快速地掌握Java编程语言并开始开发自己的Java应用程序。记住,不要害怕犯错,不断尝试和实践,这是成为一名优秀Java程序员的关键。

相关文章
|
5天前
|
Web App开发 编解码 Java
B/S基层卫生健康云HIS医院管理系统源码 SaaS模式 、Springboot框架
基层卫生健康云HIS系统采用云端SaaS服务的方式提供,使用用户通过浏览器即能访问,无需关注系统的部署、维护、升级等问题,系统充分考虑了模板化、配置化、智能化、扩展化等设计方法,覆盖了基层医疗机构的主要工作流程,能够与监管系统有序对接,并能满足未来系统扩展的需要。
55 4
|
5天前
|
运维 监控 安全
云HIS医疗管理系统源码——技术栈【SpringBoot+Angular+MySQL+MyBatis】
云HIS系统采用主流成熟技术,软件结构简洁、代码规范易阅读,SaaS应用,全浏览器访问前后端分离,多服务协同,服务可拆分,功能易扩展;支持多样化灵活配置,提取大量公共参数,无需修改代码即可满足不同客户需求;服务组织合理,功能高内聚,服务间通信简练。
40 4
|
4天前
|
移动开发 供应链 Java
企业级智能制造MES系统源码,技术架构:springboot + vue-element-plus-admin
企业级智能制造MES系统源码,技术架构:springboot + vue-element-plus-admin。 企业级云MES全套源码,支持app、小程序、H5、台后管理。 生产调度:MES系统可以根据生产订单和资源状况,自动计算生产计划和调度,从而优化生产线的运作。
企业级智能制造MES系统源码,技术架构:springboot + vue-element-plus-admin
|
4天前
|
XML JavaScript 前端开发
springboot配合Freemark模板生成word,前台vue接收并下载【步骤详解并奉上源码】
springboot配合Freemark模板生成word,前台vue接收并下载【步骤详解并奉上源码】
|
5天前
|
监控 Java 应用服务中间件
Spring Boot 源码面试知识点
【5月更文挑战第12天】Spring Boot 是一个强大且广泛使用的框架,旨在简化 Spring 应用程序的开发过程。深入了解 Spring Boot 的源码,有助于开发者更好地使用和定制这个框架。以下是一些关键的知识点:
25 6
|
5天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
32 3
|
2天前
|
监控 安全 NoSQL
采用java+springboot+vue.js+uniapp开发的一整套云MES系统源码 MES制造管理系统源码
MES系统是一套具备实时管理能力,建立一个全面的、集成的、稳定的制造物流质量控制体系;对生产线、工艺、人员、品质、效率等多方位的监控、分析、改进,满足精细化、透明化、自动化、实时化、数据化、一体化管理,实现企业柔性化制造管理。
21 3
|
3天前
|
前端开发 Java
audio案例(1),2024年最新springboot项目源码
audio案例(1),2024年最新springboot项目源码
|
3天前
|
数据采集 监控 安全
java数字工厂MES系统全套源码Java+idea+springboot专业为企业提供智能制造MES解决方案
"MES" 指的是制造执行系统(Manufacturing Execution System)。MES在制造业中扮演着至关重要的角色,它是位于企业资源计划(ERP)系统和车间控制系统之间的系统,用于实时收集、管理、分析和报告与制造过程相关的数据。
10 0
|
5天前
|
前端开发 Java 关系型数据库
Java医院绩效考核系统源码B/S架构+springboot三级公立医院绩效考核系统源码 医院综合绩效核算系统源码
作为医院用综合绩效核算系统,系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修正,系统功能强大,完全模拟医院实际绩效核算过程,且每步核算都可以进行调整和参数设置,能适应医院多种绩效核算方式。
31 2