• 如何寻找Springboot自动装配的实现


    序言:

    springboot框架价值,可以简单快速的构建独立的spring生产级别应用。springboot主要有以下的特性:

    • 1 创建独立的Spring应用
    • 2 直接嵌入Tomcat 等Web容器(不需要部署WAR文件)
    • 3 提供固化的“starter”依赖,简化构建配置
    • 4 当条码满足时自动装配Spring 货第三方类库
    • 5 提供运维的特性,如指标信息,健康检查和外部配置
    • 6 不需要XML配置。

    下面就以spring boot启动的时候,是如何实现mybatis 自动装配

    1 从程序的使用去入手分析

    •   引入mybatis的starter依赖和相关的数据库驱动
    1.       <dependency>
    2.             <groupId>org.mybatis.spring.boot</groupId>
    3.             <artifactId>mybatis-spring-boot-starter</artifactId>
    4.             <version>2.2.0</version>
    5.       </dependency>
    • 程序使用
    1. //程序的启动类
    2. @SpringBootApplication
    3. public class HelloApplication {
    4. public static void main(String[] args) {
    5. SpringApplication.run(HelloApplication.class, args);
    6. }
    7. //服务类
    8. @Service
    9. public interface UserService {
    10. @Autowired
    11. private UserXmlMapper userXmlMapper;
    12. @Test
    13. public void testFindAll2() {
    14. List list = userXmlMapper.findAll();
    15. System.out.println(list);
    16. }
    17. }
    18. //Dao 操作
    19. @Mapper
    20. public interface UserXmlMapper {
    21. public List findAll();
    22. }

    上面的代码,大家都是很熟悉的,springboot是如何实现 @Mapper的注解,就可以操作数据库呢(就是中间有个桥梁,如何将springboot和mybatis连接起来的,而这个桥梁是如何实现的呢)

    •  从启动类 寻找桥梁

     通过源码可以知晓 

    桥梁 = @SpringBootApplication=>@EnableAutoConfiguration=>@Import({AutoConfigurationImportSelector.class})

    分析源码可知AutoConfigurationImportSelector的主要作用 

    • 扫描classpath下所有的jar包
    • 在META-INF/spring.factories配置好的AutoConfiguration
    • 扫描出来需要执行的AutoConfguration

    回想再使用mybatis的时候,是需要引入mybatis的starter依赖包的,再结合AutoConfigurationImportSelector的第二点功能,可以到对应的jar下找到mybatis的AutoConfguration。

     也就是说spring-boot启动【会创建个spring容器】的时候,会去执行 MybatisAutoConfiguration的逻辑【处理 @Mapper 的类(扫描出来注入到srping 容器)和数据库连接等功能】。

    关于MybatisAutoConfiguration的具体功能的逻辑,这块是设计到spring 源码的了。有兴趣的可以自行查找。

  • 相关阅读:
    Android 面(被)试(锤)现场还原~
    vue父页面与子组件之间的生命周期
    文本生成高精准3D模型,北京智源AI研究院等出品—3D-GPT
    2.6每日一题(不定积分)
    setInterval和setTimeout的区别
    vue.extend 实现表格,同时编辑多条数据
    c++ lambda 表达式
    SpringBoot 如何使用 Spring Data MongoDB 访问 MongoDB
    centos下
    【JavaScript-29】js的例子实现动画的无缝轮播,复制即可用
  • 原文地址:https://blog.csdn.net/vipshop_fin_dev/article/details/126441002