目录
一、什么是SpringBoot
二、SpringBoot的特点
三、springboot快速入门
四、介绍配置文件的种类
五、开发环境配置文件的切换
六、读取springboot配置文件中的内容
七、Springboot注册web三大组件
八、SpringBoot的底层原理
8.1 包扫描的原理
8.2 springboot自动装配原理
一、什么是SpringBoot
大家想一想,在我们搭建spring应用程序时,你认为什么最麻烦。
配置xml文件麻烦。---spring的配置文件。web.xml
很多依赖。
tomcat启动速度很忙。
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置【自动装配类】,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
二、SpringBoot的特点
(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;--xml配置文件麻烦
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。
三、springboot快速入门
具备条件:
JDK至少1.8以上。
maven至少3.2.5以上。
开发工具---idea [eclipse]
要把pom文件中的版本号更改
创建一个HelloController类,该类所在的包必须是主函数下的包或子包下。
四、介绍配置文件的种类
springboot支持两种配置文件的类型:
第一种: 属性文件[.properties] 格式: key=value
第二种: yaml文件 [.yml] 格式: 层级关系 key: value
不管是哪种,他们的前置必须都是application.
属性文件properties:
# 设置tomcat的端口号
server.port=8888
# 上下文访问路径
server.servlet.context-path=/aaa
yaml文件:
# 设置端口号
server:
port: 8887
# 设置上下文路径
servlet:
context-path: /bbb
上面两种配置文件可以同时存在,里面的内容如果相同,则properties的优先级高于yaml文件。
五、开发环境配置文件的切换
我们在真实开发过程中:会存在很多环境,而且每个环境他们的配置文件的内容可能不同。
比如: 开发环境 测试环境 线上环境。
我就根据不同的环境给出不同的配置内容,你只需要切换环境---即可变成相应环境下的配置。
定义多个环境下的不同配置文件: application-环境名.properties
在application.properties配置文件中激活相应的配置
# 引入相关的环境配置--激活开发环境
spring.profiles.active=test
# 写一些不同环境下相同的配置
六、读取springboot配置文件中的内容
springboot中提供了两种读取配置文件内容的方式
第一种: 把读取的内容封装到实体类中
@Autowired
private AliPay aliPay;
@RequestMapping("/index")
public AliPay index(){
return aliPay;
}
测试:
第二种: 单个属性读取
七、Springboot注册web三大组件
web三大组件: [1] servlet 、[2] filter、 [3] 监听器 listene
思考: servlet定义的步骤。
(1) 创建一个类并继承HttpServlet
(2) 重写service方法 【doGet 或doPost方法】
(3)把自定义的servlet注册到web.xml容器中。
我们现在springboot不存在web.xml文件了。
注册Servlet组件
public class MyServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
}
}
package com.ykq.config;
import com.ykq.servlet.MyServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.http.HttpServlet;
@Configuration //====>表示该类为配置类 等价于我们之前的xml文件
public class MyConfig {
@Bean //xml文件中<bean class=""> 把方法返回的对象交于spring容器来管理
public ServletRegistrationBean<HttpServlet> registrationBean(){
ServletRegistrationBean<HttpServlet> servletServletRegistrationBean=new ServletRegistrationBean<>();
servletServletRegistrationBean.setName("my");
servletServletRegistrationBean.addUrlMappings("/my");
servletServletRegistrationBean.setServlet(new MyServlet());
return servletServletRegistrationBean;
}
}
注册Filter组件
步骤: 1.定义一个过滤器类并实现Filter接口
2.重写接口中的抽象方法
3. 在web.xml文件中注册过滤器。
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器编码");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
//过滤的注册
@Bean
public FilterRegistrationBean<Filter> filterRegistrationBean(){
FilterRegistrationBean<Filter> filterRegistrationBean=new FilterRegistrationBean<>();
filterRegistrationBean.setName("encondigFilter");
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.setFilter(new MyFilter());
return filterRegistrationBean;
}
八、SpringBoot的底层原理
8.1 包扫描的原理
springboot创建的包必须在主类所在的包以及子包下,才可以被容器扫描到。
为什么会在主类所在的包以及子包下扫描?
在主函数中调用run方法,而run方法传递了一个被@SpringBootApplication注解修改的类的反射类对象 该@SpringBootApplication它是复合注解。
@EnableAutoConfiguration 开启自动配置的注解,而该注解也是一个复合注解。
这里@AutoConfigurationPackage 该注解完成包的自动扫描。
通过上面的源码分析 我们得到默认扫描的是主类所在的包以及子包。
我们是否可以自定义包扫描。---可以
8.2 springboot自动装配原理
思考: 我们并没有配置DispatcherServlet。 为何为拦截请求路径到相应的mapping中。
因为springboot在启动时会加载一个自动装配类,而这些自动装配会完成相应的自动装配功能。
流程:
(1)主函数调用run方法,而run方法加载了一个被@SpringBootApplication注解修饰的类。
而该注解是一个复合注解。其中包含@EnableAutoConfiguration该注解可以开启自动装配,而@EnableAutoConfiguration这个也是一个复合注解。其中包含@Import({AutoConfigurationImportSelector.class})而import注解导入了一个AutoConfigurationImportSelector类,该类用来加载需要的自动装配类。而这些自动装配类完成对应的自动装配功能。
思考: 根据源码 我们看到上来加载了所有的自动装配了,而所有的自动装配类默认127个。这127个从哪来的。
分析: 自动装配类如何完成自动装配功能
(1)DipatchServletAutoConfiguration [可以完成DispatchServlet的自动装配功能
发现传递中文没有乱码,而且返回的json数据中也没有出现乱码,因为springboot加载了编码过滤的自动装配了,而这个装配类完成了编码设置的自动装配。