初识SpringBoot

参考

早有耳闻 SpringBoot,这次终于是见识到了,在见识之前就有听说过“started”,“脚手架”,“简化开发”等等关于 SpringBoot的优点,这次总算是初识庐山真面目了。

首先我要说雷丰阳2021版SpringBoot2零基础入门springboot全套完整版(spring boot2)讲的真是太棒了,第一次接触真的能收获太多了,尤其感觉讲的非常有条理,循序渐进,先讲简单应用,再从源码分析原理。有一次看到一个章节直呼SpringBoot实在是太妙了,感叹了半天。

自动装配原理

我不奢求能把它说清楚,我只是想把我目前的理解说一说,有不对的还请见谅。

首先

要知道SpringBoot几个基本注解

@Configuration

  • 声明为配置类
  • proxyBeanMethods 默认为true,表示组件是单实例的

@Bean@Component@Controller@Service@Repository

  • 这些在Spring、SpringMVC都见识到了,都是用来配置组件的

@ComponentScan@Import

  • 组件扫描和组件导入

@Conditional

  • 条件装配,非常重要,在我看来自动装配主要由它实现

@ImportResource

  • SpringBoot几乎不使用Spring传统的xml配置,如果还是想用则可以使用这个配置,声明xml的classpath即可

@ConfigurationProperties

  • 属性绑定
  • 因为它可以在配置文件实现properties或是yaml配置

@EnableAutoConfiguration

  • 依据配置自动导入相关配置,重要,理解自动装配,要研读源码中的xxxAutoConfiguration相关类

原理初解

自动装配就是利用上面的注解(当然还有许多其他的)实现的

查看如下SpringBoot是如何实现web.servlet的自动装配的

1
2
3
4
5
6
7
8
9
10
11
12
13
package org.springframework.boot.autoconfigure.web.servlet;

...

@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {

@Configuration(proxyBeanMethods = false)

  • 声明配置类,并不使用单例模式(实现单例模式相对于不实现更快一些,因为不用检查)

@ConditionalOnWebApplication(type = Type.SERVLET)

  • 条件装配,这个表示是web项目时装配

@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })

  • 条件装配,类路径下有指定的类时装配

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

  • 条件装配,当容器中没有该组件时装配

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)

  • 声明类加载优先级

@AutoConfigureAfter(...)

  • 声明类加载在...之后
1
2
3
4
5
6
7
@Bean
@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
@ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled", matchIfMissing = false)
public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new OrderedHiddenHttpMethodFilter();
}

@Bean

  • 组件声明

@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)

  • 条件装配,当没有xxx组件时装配

@ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled", matchIfMissing = false)

  • 配置绑定,前缀时"spring.mvc.hiddenmethod.filter",该配置为前缀下的”enabled“属性
  • matchIfMissing若缺少配置这配置为false,相当于默认配置

小结

自动装配

  • 加载自动配置类
  • 条件装配
  • 用户配置优先

下面是复制的一段

SpringBoot优点

  • Create stand-alone Spring applications

    • 创建独立Spring应用
  • Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)

    • 内嵌web服务器
  • Provide opinionated 'starter' dependencies to simplify your build configuration

    • 自动starter依赖,简化构建配置
  • Automatically configure Spring and 3rd party libraries whenever possible

    • 自动配置Spring以及第三方功能
  • Provide production-ready features such as metrics, health checks, and externalized configuration

    • 提供生产级别的监控、健康检查及外部化配置
  • Absolutely no code generation and no requirement for XML configuration

    • 无代码生成、无需编写XML

SpringBoot是整合Spring技术栈的一站式框架

SpringBoot是简化Spring技术栈的快速开发脚手架

SpringBoot缺点

  • 人称版本帝,迭代快,需要时刻关注变化
  • 封装太深,内部原理复杂,不容易精通