一、SpringBoot介绍
1.1 Spring缺点分析
Spring是一个非常优秀的轻量级框架,以IOC(控制反转)和AOP(面向切面)为思想内核,极大简化了JAVA企业级项目的开发。
虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。使用Spring进行项目开发需要在配置文件中写很多代码,所有这些配置都代表了开发时的损耗。
除此之外,Spring项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。比如Spring5.0以上只能使用Junit4.12以上的版本。
总结
Spring的缺点:
- 配置过于繁琐。
- 引入的依赖过多,版本控制复杂。
1.2 什么是SpringBoot
SpringBoot对Spring的缺点进行改善和优化,基于约定大于配置的思想,简化了Spring的开发,所谓简化是指简化了Spring中大量的配置文件和繁琐的依赖引入,提供了大量的默认配置。所以SpringBoot是一个服务于框架的框架,它不是对Spring功能的增强,而是提供了一种快速使用Spring框架的方式。
SpringBoot的优点:
- 配置简单
- 依赖引入简单
- 提供了一些大型项目的非功能特性,如嵌入式服务器,安全指标,健康监测等。
1.3 SpringBoot核心功能
自动配置
SpringBoot项目自动提供最优配置,同时可以修改默认值满足特定的要求。
起步依赖
SpringBoot的依赖是基于功能的,而不是普通项目的依赖是基于JAR包的。SpringBoot将完成一个功能所需要的所有坐标打包到一起,并完成了版本适配,我们在使用某功能时只需要引入一个依赖即可。
二、SpringBoot入门
2.1 通过IDEA脚手架搭建项目
1、在IDEA中新建项目,项目类型为Spring Initializr,选择JDK版本和搭建网站后点击下一步。
2、选择项目参数后,点击下一步
3、选择SpringBoot版本和需要的起步依赖,点击下一步。
4、确定项目位置完成项目搭建
注意:如果是jdk8最好创建的spring boot的版本是2.xxxx。
2.2 SpringBoot项目结构
POM文件
1、SpringBoot项目必须继承spring-boot-starter-parent,即所有的SpringBoot项目都是spring-boot-starter-parent的子项目。spring-boot-starter-parent中定义了常用配置、依赖、插件等信息,供SpringBoot项目继承使用。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.0</version> <relativePath/> <!-- lookup parent from repository --> </parent>
2、SpringBoot项目中可以定义起步依赖,起步依赖不是以jar包为单位,而是以功能为单位。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
3、spring-boot-maven-plugin插件是将项目打包成jar包的插件。该插件打包后的SpringBoot项目无需依赖web容器,可以直接使用JDK运行
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
启动类
启动类的作用是启动SpringBoot项目,运行启动类的main方法即可启动SpringBoot项目。在运行web项目的时候可以将项目放到内置的tomcat中运行,不需要使用外置的tomcat。
package com.zj.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
配置文件
由于SpringBoot极大简化了Spring配置,所以只有一个application.properties配置文件,且Spring的自动配置功能使得大部分的配置都有默认配置,该文件的功能是覆盖默认配置信息,该文件不写任何信息都可以启动项目。
2.3 编写JAVA代码
之前搭建的SpringBoot项目已经都整合了SpringMVC,我们编写一个控制器进行测试:
@Controller public class MyController { @RequestMapping("/hello") @ResponseBody public String hello(){ System.out.println("hello springboot!"); return "hello springboot!"; } }
启动类在启动时会做注解扫描(@Controller、@Service、@Repository......),扫描位置为同包或者子包下的注解,所以我们要在启动类同级或同级包下编写代码。
三、SpringBoot原理分析
3.1 起步依赖
查看spring-boot-starter-parent起步依赖
1、按住Ctrl
点击pom.xml
中的spring-boot-starter-parent
,跳转到了spring-boot-starter-parent
的pom.xml
,发现spring-boot-starter-parent
的父工程是spring-boot-dependencies
。
如果在pom文件中ctrl键突然失效了,无法查看源码,那可能是没有下载文档。
3.2 自动配置
3.3 核心注解
四、SpringBoot注册Web组件
4.1 注册servlet(有了controller谁还用servlet)
由于SpringBoot项目没有web.xml文件,所以无法在web.xml中注册web组件,SpringBoot有自己的方式注册web组件。
注册方式一
1、编写servlet
@WebServlet("/first") public class FirstServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response){ System.out.println("First Servlet........"); } }
2、启动类扫描web组件
@WebServlet("/first") public class FirstServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response){ System.out.println("First Servlet........"); } }
注册方式二
1、编写servlet
public class SecondServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response){ System.out.println("Second Servlet........"); } }
2、使用配置类注册servlet
@Configuration public class ServletConfig { //ServletRegistrationBean可以注册Servlet组件,将其放入Spring容器中即可注册Servlet @Bean public ServletRegistrationBean getServletRegistrationBean(){ // 注册Servlet组件 ServletRegistrationBean bean = new ServletRegistrationBean(new SecondServlet()); // 添加Servlet组件访问路径 bean.addUrlMappings("/second"); return bean; } }
4.2 注册Filter
注册方式一
1、编写filter
//过滤的是first请求 @WebFilter(urlPatterns = "/first") public class FirstFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException, IOException { System.out.println("进入First Filter"); filterChain.doFilter(servletRequest,servletResponse); System.out.println("离开First Filter"); } @Override public void destroy() { } }
2、启动类扫描web组件
@SpringBootApplication //SpringBoot启动时扫描注册@WebServlet、@WebFilter注解标注的Web组件 @ServletComponentScan public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
注册方式二
1、编写filter
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean getFilterRegistrationBean(){ // 注册filter组件 FilterRegistrationBean bean = new FilterRegistrationBean(new SecondFilter()); // 添加过滤路径 bean.addUrlPatterns("/second"); return bean; } }
4.3 注册Listener
注册方式一
1、编写Listener
这里选择注册上下文监听器
@WebListener public class FirstListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("First Listener Init......"); } @Override public void contextDestroyed(ServletContextEvent sce) { } }
2、启动类扫描web组件
@SpringBootApplication //SpringBoot启动时扫描注册@WebServlet、@WebFilter、@WebListener注解标注的Web组件 @ServletComponentScan public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
注册方式二
1、编写Listener
public class SecondListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("Second Listener Init......"); } @Override public void contextDestroyed(ServletContextEvent sce) { } }
2、使用配置类注册Listener
@Configuration public class ListenerConfig { @Bean public ServletListenerRegistrationBean getServletListenerRegistrationBean(){ ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean(new SecondListener()); return bean; } }