模拟Springboot<1>

我们都知道Springboot  利用Springboot 让我们的开发更加简单了,也更加容易上手了
使用也更加方便了
首先Springboot的项目在pom导入Springboot的依赖,然后在main方法中
添加启动配置 这样对于Springboot就可以起来了
--------------------<<<<<<<<<<<<<<<<
一个注解调用他的run方法就可以使用Springboot了
启动Springboot  启动之后 就可以正常访问Controller了
包括依赖注入 什么的
当然我们平时也是这么用的 例如如下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当我们启动Springboot的时候 
访问localhost:8080/test 自然就会访问到我们的Controller中 我们平时就是这么用的
但是当我们启动Springboot的时候 针对于Springboot到底会发生那些操作么?

在这里插入图片描述

如果我自己写Springboot  我要做那些事情
这些Bean比如说(UserController UserService)
我run方法中 首先创建一个容器

在这里插入图片描述

我首先在main方法中吧这个MyApplication类传过来 并且此时开启Spring容器

在这里插入图片描述

MyApplication  是我Spring的一个配置类
启动这个容器 解析 MyApplication   配置类

 然后看我的自定义注解 当启动main方法的时候
 启动main--->MyApplication--->LvhaoSpringbootApplication
 --->@Configuration作为配置类
 --->@ComponentScan   扫描
对于Spring发现有一个ComponentScan  注解  对于Spring而言就要去扫描了
但是扫描路径是哪里呢?,一般@ComponentScan("com.lvhao")   后面是有一个路径的
对于spring而言 会去扫描当前这个类所在的包路径当作扫描路径

在这里插入图片描述

也就是说会扫描到这个包下,这样来说就会吧我们@Controller @Service之类的注解扫描出来,继而加入到Spring容器中
也就是说我此时代码一执行完毕 我的容器中至少有controller  service   这些bean,这是我们run方法做的第一个事情  启动容器 
呢么接下来我们还要做什么?接受浏览器的请求,像Springboot中默认用的tomcat,所以启动run方法的同时启动tomcat,在tomcat中添加DispatcherServlet,这样我tomcat 启动 所有的 请求都会交给我这个dispathcertServlet 来处理请求

在这里插入图片描述

也就是我启动run方法 第一步开启Spring容器 将controller service这些
加入到Spring容器中 第二步开启tomcat用来接受请求
这样当我们访问localhost:8080/test的时候controller就可以接收到 
并且进行响应
tomcat--->接受到请求 会吧这个请求交给DispathcerServlet 来处理 
Dispathcer拿到请求 根据url 匹配是那个bean(基于Spring容器去匹配)
找到对应的方法 就去执行
我现在一点点的代码就实现了Springboot的功能 因为对于Springboot
就是这么用 你写一个类加上Springboot注解,一个注解代表他是一个配置类
还有一个是扫描类
springboot解析的时候他就会去扫描
我们此时run中创建容器 扫描bean 启动tomcat  他就可以正常接受请求 并且可以执行spmvc 的controller 这一套
这就是一个很简单的springboot
再慢慢的添加功能,springboot中可以不用tomcat,如果我们不想用tomcat,
想用jetty 该怎么去做
一般来说我们会在Springboot的项目中排除对应tomcat的依赖 然后添加jetty的依赖 因为对于Springboot来说默认用的tomcat接受的请求

在这里插入图片描述

因为Springboot默认用的tomcat 我们一个系统如果不想用tomcat排除就可以
呢么针对我此时的这个user项目 怎么去切换  我该 怎么做才能让我此时只需要修改依赖就可以 其他任何东西不用动 就可以达到这种效果呢
我也想达到这种效果,我该怎么实现


在这里插入图片描述

我可以这样 从容器中获取getWebServer返回的具体信息就是使用的tomcat
还是Jetty

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在springboot中,webServer 就表示tomcat,jetty这些
我现在如果判断你项目中用的jetty  或者tomcat
如果用的jetty 我就基于jetty生成一个bean放入到Spring容器中
如果用的tomcat  我就基于tomcat生成一个bean放入到Spring容器中
然后从容器中获取 
这个时候就可以用到Spring中的条件注解

在这里插入图片描述

可以在spring内部创建一个配置类 利用 @Conditional(LvhaoCondition.class)这个条件注解
比如说 我此时Spring在创建容器的时候扫描到了WebServiceAutoConfiguration 这个配置类的话 他就会解析@Bean注解进而将返回值放入到Spring的ioc容器中
但是此时有一个 @Conditional(LvhaoCondition.class)  这个条件注解
意思是如果返回为true  
Matches
true ------->条件生效	bean生效(可以放入到IOC容器中)
False  ------->条件不生效  bean 不能生效(不能可以放入到IOC容器中)

在这里插入图片描述

基于上述前置知识  我们可以这样做 当然Springboot也是这样做的

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以按照这样的思路去进行,我现在要去判断我当前项目中有没有tomcat的依赖
或者jetty的依赖
如果我可以加载到 就表示这个条件是符合的  呢么他这个bean 就可以生效 就可以放入到我们spring容器中
整个流程还是入口main-->run--->创建Spring容器
在启动Spring容器的时候他就会去解析@ConditionOnBean的逻辑,进一步解析条件注解  Spring就会判断当前那个bean可以加载到Spring容器中
如果@ConditionOnBean  的逻辑为true 就可以吧当前的bean放入到Spring容器中

如果tomcat的依赖和jetty的依赖都符合的化  我的bean都会存在我spring容器中
这在spring容器启动的时候做的
我然后getbean,你就可能拿到2个也有可能拿不到 也有可能拿到一个   说白了到底拿出来几个 看你项目依赖是怎么配置的

这样就可以达到 我user系统只需要修改pom 文件就可以切换tomcat 和jetty了

在这里插入图片描述

main方法--->run-->解析myApplication-->启动tomcat容器
解析myApplication 的时候有2个注解
第一个注解 ComponentScan--->扫描 可以将@Controller @Service之列的注解解析成为bean 放入到Spring容器中
@Configuration 代表此时是一个配置类
需要注意的是一点  之前这个配置类 在启动的时候是扫描不到的 我们可以通过@Import导入进来 ,Spring还是很强大的

在这里插入图片描述
在这里插入图片描述

 我们可以继续封装 ~ 就像Springboot中的@Enablexxx一样 ,这样tomcat和jetty只有1 个,对于我用户而言我此时只需要更改我pom就可以
刷新我 pom 就可以
Springboot  我用classLoad去加载 加载到了就代表此时这个@Bean 生效 可以放入到Spring容器中
否则就不生效不能放入到Spring容器中
总结下我们Springboot中的自动配置,帮我们做了什么事情
首先第三方的@Bean是springboot帮我们配自动配置的,我们现在除开
我们的tomcat或者Jetty ,对于Springboot来说,这些bean其实都是Springboot帮我们自动配置好的, 我们不用再写一堆xml文档了
Spring事务的大致原理也是一样如果不用Springboot很有可能就是这些@bean都交给我们程序员去配置了
如果使用Springboot的话 这些东西就不用配置, 这个就是自动配置
就是说Springboot自动帮我们配置了很多个bean
比如说aop  也就是说我们后续还可以加其他的autoConfig,如果我现在又加一个autoConfig  我就会更改我的源码,而且还得再加@Import

在这里插入图片描述

类似于这样,我可能会导入很多,因为我此时有各种各样的AutoConfig
呢么此时我该怎么办
Springboot是怎么做的呢 是有个Spring.factories 文件  这个时候才涉及到我们的Spi 

在这里插入图片描述

我可以在这些自动配置类中添加@Bean 进行自动注入

在这里插入图片描述

然后在meta-inf中进行配置就可以了  这样的话 对于用户来说是无感知的
这样写就规范很多 至少至少可以根据文件(meta-inf) 就可以知道我到底那些自动配置类要生效

这样写有什么好处呢 1. 可扩展,Springboot不可能吧市面上所有的框架都给你
整合进来,比如说Mybatis 整合Springboot的时候  我除了引用mybatis的jar 我还要配置sqlsessionfactory
我mybatis现在想整合springboot, 你Springboot默认没有sqlsessionFactorybean 有关的autoconfig
对于mybatis而言我也只需要写这个meta-inf 文件就可以了

在这里插入图片描述

再思考个问题Springboot如何做到批量注入bean

在这里插入图片描述

使用spi机制读取meta-inf的文件 就可以了,这就是Springboot这么改造的另外一个好处 Springboot不可能迎合所有的事务啊 什么的aop啊,
都给你配好  但是我会通过这种机制 也是spi  我可以让第三方很好的开发自己的自动配置的东西
为什么Springboot这么来设计 这么设计的好处是什么 为了让第三方你也想提供一些自动配置的东西 你也可以这么来做  按照我这个规范 1. meta-inf   autoconfig {@bean}

springboot在启动的时候就会去解析这些自动配置类每解析这么一个配置类	
每解析一个配置类,就会有关@bean的所定义的bean对象加载到容器中 此时会有@Condition做限制,解析@Bean时候就会判断这个bean是否生效,符合条件@Bean生效 不符合条件@Bean 不生效


大致的流程  DeferredImportSelector  为什么实现这个接口??? 
说白了我现在返回的自动配置类	主要的作用还是
把我们定义的一些Bean放到Spring容器中
呢现在我程序员自己定义一个tomcatWebService呢

在这里插入图片描述
在这里插入图片描述

呢么此时Springboot该用哪一个呢
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值