最近头发掉的厉害了,整理下SpringBoot系列及周边的技术,总的来看分为配置、日志、web、docker、数据访问、缓存、消息、检索、任务、安全、分布式、开发习惯、监控等,慢慢更新
为了简化开发,尊崇约定大于配置的思想,干掉复杂的配置,让咱码农能把精力都用在开发上。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@RestController
public class HelloController {
@RequestMapping("/hello")
public String getHello(){
return "Hello! SpringBoot";
}
}
这里的 @RestController 来看一下
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
* @since 4.0.1
*/
@AliasFor(annotation = Controller.class)
String value() default "";
}
这里边放了@ResponseBody注解,所以HelloController 里边所有的方法都不用再写@ResponseBody注解了
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.3.3.RELEASE)
2020-09-05 21:29:04.859 INFO 1948 --- [ main] hellospringboot.demo.DemoApplication : Starting DemoApplication on 7RX0H6QOXGFFX6A with PID 1948 (F:\work\JavaProject\demo\target\classes started by Administrator in F:\work\JavaProject\demo)
2020-09-05 21:29:04.951 INFO 1948 --- [ main] hellospringboot.demo.DemoApplication : No active profile set, falling back to default profiles: default
2020-09-05 21:29:06.798 INFO 1948 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2020-09-05 21:29:06.839 INFO 1948 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2020-09-05 21:29:06.839 INFO 1948 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.37]
2020-09-05 21:29:06.986 INFO 1948 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2020-09-05 21:29:06.986 INFO 1948 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1844 ms
2020-09-05 21:29:07.324 INFO 1948 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2020-09-05 21:29:07.599 INFO 1948 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2020-09-05 21:29:07.631 INFO 1948 --- [ main] hellospringboot.demo.DemoApplication : Started DemoApplication in 4.341 seconds (JVM running for 9.855)
2020-09-05 21:29:22.614 INFO 1948 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-09-05 21:29:22.614 INFO 1948 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-09-05 21:29:22.626 INFO 1948 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 11 ms
访问到了,从启动信息可以看到,此项目用了自带的tomcat9,初始化并启动了Spring任务调度、前端控制器DispatcherServlet 等
第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping(处理器映射器)查找Handler
第三步:处理器映射器HandlerMapping向前端控制器返回Handler执行链
第四步:前端控制器调用处理器适配器(HandlerAdaptor)去执行Handler
第五步:适配器执行完成后给前端控制器返回ModelAndView;
第六步:前端控制器请求视图解析器(ViewResolver)去进行视图解析,根据逻辑视图名解析成真正的视图
第七步:视图解析器向前端控制器返回View
第八步:前端控制器进行视图渲染
第九步:前端控制器向用户响应结果
不废话,直接贴图,噢对了,首先得有springboot maven插件,这个一般创建工程的时候就已经弄好了,这里也贴一下
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
有插件后------>直接打包,这个默认是打成了jar包
运行成功后在target里就可以找见项目jar包,可以直接拖到桌面 cmd java -jar jar包名部署运行
部署环境里没有tomcat也没事,因为包里自带了,至于为什么,请往下瞅
根据上边,根本没写几行代码,也没去搞复杂的配置,就直接运行了,来细细瞅瞅pom文件里是不是有下边这个parent父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
点进去看看,还有一个parent父项目,再点进去可以看到好多已经定好依赖版本,所以我们在引入需要的依赖时,是不需要写版本号的,它已经定义好了,不写就是在用默认的版本,如果没有在版本仲裁中心管理的依赖,需要写版本号
我们这个项目明明没有导入spring mvc、也没导入tomcat,它就搞定了,那它是咋弄的?
还记得我们引入了一个spring-boot-starter-web吧,点进去看看,tomcat、mvc…都在里边了, spring-boot-starter-web场景启动器会帮我们导入web模块正常运行所需要的依赖。咱这个项目只用到了web模块,那别的模块呢?跟web模块类似,导一个就能搞定一票子需要的依赖了。
被@SpringBootApplication标注的类就是SpringBoot的启动类,自动配置就是它完成的,点进去看下
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
这里边每个注解的作用,原理等详细信息想深研究可以自行百度或者看书,我们在这里只看下字面意思就能基本明白它是咋搞的了,@SpringBootConfiguration是SpringBoot的配置类,那就是做配置的呗,@EnableAutoConfiguration就是自动配置呗。需要注意的一点是,启动类必须与咱的controller、service、mapper等包平级,跳出项目之外那肯定就扫不到了呗,我前几年学这个的时候手贱建错包,第一个demo就报错哭了一个月