Skip to content

Spring Boot

特点

SpringBoot 会根据类路径中的 jar包、类,为 jar 包里的类进行自动配置,这样就可以大大的减少配置的数量。

简单点说,就是 SpringBoot 会根据定义在 classpath 下的类,自动给你生成一些 Bean,并且加载到 Spring 的 Context 中。

原理

在 SpringBoot 内部,会读取 classpath 下 META-INF/spring.factories 文件中的所配置的类的全类名。

我们可以找到 key为 org.springframework.boot.autoconfigure.EnableAutoConfiguration 对应的值。

可以发现就是一系列的 xxxAutoConfiguration,随便找两个类看一下,就是标记了 @Configuration 的配置类,并且通过一些条件注解,来判断、决定哪些 Bean 应该自动注入到容器中。

核心注解

  • @SpringBootApplication:这是一个组合注解,相当于同时使用了 @Configuration@EnableAutoConfiguration 和 @ComponentScan 注解。它标记了主应用程序类,并告诉 Spring Boot 开始组件扫描、自动配置和装配。
  • @EnableAutoConfiguration:该注解用于启用 Spring Boot 的自动配置功能。它会根据应用程序的依赖关系和当前环境,自动注册所需的 bean。
  • @ComponentScan:该注解用于启用组件扫描,以便 Spring Boot 可以自动发现和注册标有 @Component@Service@Repository 和 @Controller 注解的类。
  • @ConditionalOnClass 和 @ConditionalOnMissingClass:这两个条件化注解用于根据类路径上是否存在特定的类来决定是否注册 bean。@ConditionalOnClass 在类路径上存在指定类时生效,而 @ConditionalOnMissingClass 在类路径上不存在指定类时生效。
  • @ConditionalOnBean 和 @ConditionalOnMissingBean:这两个条件化注解用于根据是否存在特定的 bean 来决定是否注册 bean。@ConditionalOnBean 在容器中存在指定的 bean 时生效,而 @ConditionalOnMissingBean 在容器中不存在指定的 bean 时生效。
  • @ConditionalOnProperty:该条件化注解用于根据配置属性的值来决定是否注册 bean。它可以根据配置文件中的属性值来决定是否启用或禁用特定的 bean。

api 相关

filter 与 interceptor

Filter是在servlet层面的,Interceptor是在Controller层面的。效果都是在自己写的代码上面Weaving一些其他的东西进去。

由于SpringBoot就一个servlet,所以Filter适合于做全局的,比如代码改为UTF-8,判断IP来源比对黑名单等等。Fiter主要是要实现doFilter这个方法,传入的参数有request、response、chain。务必记得最后要chain.doFilter(request,response),否则就是把request卡断在doFilter这里了。

Interceptor则适合更加精细粒度的。因为Spring MVC、Spring Boot是一个Servlet多个controller。URL mapping一般在Controller层面上实现。所以Interceptor实现了在URL上面进行拦截。

Interceptor可以选择实现preHandle()、postHandle()和afterCompletion()这几个方法。这些是在request被拦截之后不同阶段、条件执行的。pre这个能读到request、response和handler。其中handler就是被拦截的Controller里面的方法。Post这个方法多了一个controller读到的modelandview参数,如果不是空的话可以在上面做点工作,比如加一个footer之类。Interceptor往往只用request和response两个参数,而不管handler那个参数。