zoukankan      html  css  js  c++  java
  • 学习SpringBoot整合SSM三大框架源码之SpringBoot

    Spring Boot源码剖析

    一.Spring Boot 项目的启动入口流程分析

      Spring Boot项目的启动入口main线程上有一个@SpringBootApplication( @Configuration + @EnableAutoConfiguration + @ComponentScan )注解, 表明是主配置类, 让程序自动识别并进行必要的配置

      项目启动后, 首先进行自动配置, 源码如下: 

    ---在org.springframework.boot.autoconfigure 包下有一个接口实现类:  AutoConfigurationImportSelector

    public class AutoConfigurationImportSelector
            implements ... {
             ...try {
                AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
                        .loadMetadata(this.beanClassLoader);
                AnnotationAttributes attributes = getAttributes(annotationMetadata);
                List<String> configurations = getCandidateConfigurations(annotationMetadata,
                        attributes);
                ...
            }
            catch (IOException ex) {
                throw new IllegalStateException(ex);
            }
        }
    }

      通过SpringFactoriesLoader扫描默认的资源路径( 源码如下 ), 返回  List<String> configurations (我的项目中, 97个配置项), 在经过一系列方法处理后, 留下必要的配置( 23个 ), 随后经历一个重要的 Spring框架的类的方法, 逐步部署项目, 即 AbstractApplicationContext 类的 refresh() 方法.

    public abstract class SpringFactoriesLoader {
      ...  
        public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
      ...    
    }

    ps: 不妨在自己的SpringBoot项目中找到这个类, 在红色代码( 创建候选配置集合 )处添加断点, debug启动来跟进SpringBoot的加载过程.

     二.Spring Boot 启动时如何加载各种框架配置类? 举例: Mybatis

      1. springboot启动时, 通过扫描到的注解 @EnableConfigurationProperties(MybatisProperties.class) 加载了mybatis框架配置类: MybatisAutoConfiguration

      2. 查看mybatis框架的配置类

    public class MybatisAutoConfiguration {
    
      private final MybatisProperties properties;
       ... 
         
      @Bean
      @ConditionalOnMissingBean
      public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
       ...
      }

      3. 查看mybatis的详细配置信息

    @ConfigurationProperties(prefix = MybatisProperties.MYBATIS_PREFIX)
    public class MybatisProperties {
    
      public static final String MYBATIS_PREFIX = "mybatis";
      ...    
    }

      4. 查看mybatis-spring-boot-autoconfigure.jar 包下的 META-INF 资源路径

    三.自研mybatis-demo框架与Spring Boot整合

      1. 分析: 自研框架的jar包, 需要哪些核心类?

    类比Mybatis, 需要的核心类, 有 SqlSessionFactory,

      MybatisAutoConfiguration,

      SqlSessionFactory method..(),

      MybatisProperties.

      2.创建项目 demo-mybatis, 项目结构如下, 进行maven install 打成 jar包, 模拟框架的发布

      项目源码地址见本篇博文尾部, 欢迎指正!

       3. 新建SpringBoot项目, 添加SpringMvc依赖, 即 boot-web-starter

        ① 引入我们打好的demo-mybatis 自研框架的 jar 包

        依赖如下:

    <dependency>
        <groupId>com.demo</groupId>
        <artifactId>demo-mybatis</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

        ②  编辑Controller    

    @RestController
    public class DemoController {
        @Autowired
        SqlSessionFactory sessionFactory;
        
        @RequestMapping("/demo-mybatis")
        public String demo() {
            return sessionFactory.getSqlSession();
        }
    }

        ③ 修改yml文件自定义 框架的配置属性

    com:
      demo:
        mybatis:
          hello: hi!
          world: new world!

        ④ 启动项目, 会看到控制台输出了自研框架内的"假"信息:

        ⑤ 访问测试地址: http://localhost:8080/demo-mybatis

     

        访问成功!!!

      就这样, 我们剖析了SpringBoot的加载原理, 并仿造Mybatis框架, 自研了一个demo框架, 并整合到SpringBoot项目中!!!

    源码地址, 可以参考我的GitHub: https://github.com/93LifeAfterLife/Demo-Mybatis

    欢迎交流指正~

  • 相关阅读:
    常用git指令操作
    eclipse中常用快捷键整理
    Java Dom解析xml文件
    Spring IOC的注入方式
    Spring framework bean的作用域,生命周期
    android中的bundle使用
    python ftplib模块
    python requests用法总结
    限制字符串 剔除费需要字符然后将多余空格删除
    MFC Edit Control 编辑控件 属性和API
  • 原文地址:https://www.cnblogs.com/sansheng93/p/11354033.html
Copyright © 2011-2022 走看看