• SpringBoot中个常见的几个问题


    一、SpringBoot、SpringMVC和Spring有什么区别

    spring是一个IOC容器,用来管理bean,使用依赖注入实现控制反转,可以很方便的整合各种框架,提供AOP机制,弥补OOP的代码重复机制,更方便将不同类不同方法中的共同处理抽取成切面、自动注入给方法执行,比如日志、异常等。

    springMVC是spring对web框架的一个解决方案,提供了一个总的前端控制器Servlet,用来接收请求。然后定义了一套路由策略(url到handle的映射)及适配执行handle,将handle结果使用视图解析技术生成视图展示给前端。

    springboot是spring提供的一个快速开发工具,让程序员能更方便、更快速的开发spring+SpringMVC应用,简化了配置(约定了默认配置),整合了一系列的解决方案(starter机制)、redis、mongodb、es,可以开箱即用。

    二、SpringBoot是如何启动Tomcat的

    1、首先,SpringBoot在启动时会先创建一个Spring容器
    2、在创建spring容器的的过程中,会利用@ConditionOnClass技术来判断当前classpath中是否存在tomcat依赖,如果存在则会生成一个启动的tomcat的Bean
    3、spring容器创建完之后,就会获取启动Tomcat的bean,并创建tomcat对象,并绑定端口等,然后启动tomcat

    三、SpringBoot中常用的注解

    1、@SpringBootApplication:标识了这是一个SpringBoot工程,它实际上是另外三个注解的组合。即
    @SpringBootConfiguration:这个注解实际上就是一个@Configuration,表示启动类是一个配置类
    @EnableAutoConfiguration:向Spring容器中国导入一个Selector,用来加载ClassPath下的SpringFactories在所定义的自动配置类,将这些自动加载为配置Bean
    @ComponentScan:标识扫描路径,因为默认是没有配置实际扫描路径,所以SpringBoot扫描的路径是启动类所在的当前目录

    2、@Bean:用来定义Bean,类似于XML中的标签,在spring启动时,会对家了@Bean注解的方法进行解析,将方法的名字作为BeanName,并通过执行方法得到bean对象

    3、@Controller
    @Service
    @ResponseBody
    @Autowired

    四、SpringBoot中配置文件的加载顺序

    优先级从高到低,高优先级的配置会覆盖低优先级的配置,所有配置会形成互补配置。
    1、命令行参数,素有的配置都可以在命令航上面进行指定
    2、Java系统属性(System.getProperties)
    3、操作系统环境变量
    4、jar包外部的application(profile).properties或application.yml(带spring.profile)配置文件
    5、jar包内部的application(profile).properties或application.yml(带spring.profile)配置文件,再来加载不带profile
    6、jar包外部的applicatio.properties或application.yml(不带spring.profile)配置文件
    7、jar包内部的applicatio.properties或application.yml(不带spring.profile)配置文件
    8、@Configuation注解类上面的PropertlySource

    五、SpringBoot自动配置原理

    在这里插入图片描述
    @AutoConguration注解使用了@Import来导入了AutoConfigurationPackageRegistrar.class(是一个内部类),通过这个内部类实际上是手动注册了一个bean,这个bean是用来保存扫描路径的。

    通过@Import导入了类AutoConfigurationImportSelector.class,类里面有个方法slectImpots,会返回一个字符串数组,存放的是类的全路径。spring读到这些类的全路径之后,会通过反射的方式将类放入Spring容器中,最终都会变成bean。
    返回的字符串数组中的数据是哪来的呢?这些字符串是放在META-INF/spring.factories文件中。该文件是key-value的形式,在自动装配的过程中要是读取key=EnableAutoConfiguration 的值,会有很多字符串,这些字符串都是类的全路径,SpringFactoriesLoader.loadFactoryNames(Spring提供的一个API)配合Import注解,利用反射,将这些类全部加载到Spring容器中。

    例如MyBatis,正常拖入mybatis包,还需要在xml文件中配置mybatis相关的一些bean标签。如果使用自动装配的话,mybatis只需提供一个META-INF/spring.factories文件,将bean的全路径去全部放进去,就会自动把这些需要的bean加载进去。

    简单归纳下:
    (1)、@Import + @Configuration + Spring spi
    (2)、自动配置类由各个start提供,使用@Configuration + @Bean定义配置类,放到META-INF/spring.factories下
    (3)、使用Spring spi扫描META-INF/spring.factories下的配置类
    (4)、使用@Import导入自动配置类

  • 相关阅读:
    2023.10.10 关于 线程安全 问题
    required a bean of type …… that could not be found.
    OSEK network management
    “益路同行”栏目专访第12期——泰格智能AI英语·李勤骞老师
    Qt鼠标跟踪
    Docker搭建RK3568开发环境
    Vite2.0+Vue3.0+Element-Plus+TypeScript 项目配置及初始化
    06目标检测-One-stage的目标检测算法
    4 运算符与表达式
    DMPE-PEG-Mal 二肉豆蔻酰磷脂酰乙醇胺-聚乙二醇-马来酰亚胺避光储藏
  • 原文地址:https://blog.csdn.net/sxl123sxl/article/details/125901983