springboot的starter原理及整合各种组件

先总体理解一下springboot的自动注入原理

    springboot在开发web应用很快捷方便,比如自动注入RestTemplate对象。使用Rabbitmq时,只需引入相应的依赖, 在配置文件中配置属性,就可获取到ConnectionFactoryBean,然后就可以访问相应的中间件。

那么springboot是如何让java web开发如此方便的呢?

    ​ 这都要从一个注解开始说起:@SpringBootApplication ​ 它所在的依赖包就是spring-boot-stater,点开这个包,就可以看到有各种包,

amqp, data, kafka,jms....。这些都是被springboot纳入其标准的开发组件中了。有些以前不在,现在有了,比如quartz,springboot1.5版本没有,springboot2.1.5就加入了。对于这些标准组件,

在META-INF/spring.factories都有组件的完整路径。springboot就可以按照这些路径去加载相关的类,这些类就生成了各种Bean,我只需要注入就可使用。

    那么有些框架是没有纳入springboot标准组件中的,比如mybatis。这时候就需要我们手动创建相关的对象。在Springmvc的时代,是需要我们配置SqlSessionFactory的。在spirngboot时代,

官方提供了Mybaits-spring包,帮我们完成了SqlSessionFactory的注入问题,其中一个很重要并且含义简单的类:MybatisAtuoConfiguration。很多人很奇怪,这个类没有被调用,那它是怎么执行的呢?

其实原理很简单,就在@Configuration注解。Spring容器启动后,就会扫描带有该注解的类,

并且生成相应的对象。这个功能类似于Golang中的init函数,只是golang自带这个功能,很方便。

xxxFactoryBean的理解

  在很多代码中,需要我们手动创建xxxFactoryBean,然后交给Spring对象,但是最后我们却获取到了xxx对象,是不是觉得很奇怪?其实这就是FactoryBean的原理。

简单来说,我们创建XXXFactoryBean,spring容器为我们创建XXX对象,这算是工厂模式的使用吧,把生成我们所要的对象的复杂逻辑屏蔽了,非常简洁。比如

1
2
3
4
JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
factoryBean.setJobClass(MyJob.class);
factoryBean.setName("myJob");
factoryBean.setGroup("myJobGroup");<br>// 这些其实都是最后都是Job的属性

  

总结下Mybatis的使用要点。

 1. Mybatis的配置文件和部署掌握了,crud,maper接口和xml文件学会了,但是对于设计reslutMap等多表操作,理解起来还是有点吃力。这个就需要补补基本功了,多写一些sql脚本才行啊。为啥要使用mybatis呢? 为了自动实现orm,否则就要自己从ResultSet中取数据,与之相配套,我们就需要写entity,这样代码量虽然多了,但是层次更清晰了。在orm阶段,还有一个问题要注意,就是mysql的数据类型对应java中的什么对象,最常见的就是datatime对应java.util.Date;

 

 2.mybatis和springmvc或者spring boot的集成:其中集成的模块mybatis的开发者已经开发出来了,我们要做到就是在项目中指定要使用mybatis及引入相应的jar就可以了。具体怎么引入,这个过程spring boot基本不用做什么,而springmvc则要声明和生成相关的类,比如sqlSession

 

3.有时候报了create bean错误,大概是class文件和xml文件没有编译在一起。这时应该去target目录下查看,这就是小白和高手的差别,当报错时,高手明白原理,能够去定位错误。

 

4、“Invalid bound statement (not found) ”,而且报错的都是 MybatisPlus 生成的 BaseMapper 中的方法

 

5、@MapperScan一定要精确到具体的包,它是会注册包下面所有的接口,如果配置不对就会报错。

 

参考资料:

posted @   懂得了才能做一些改变  阅读(389)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示