1.SpringBoot是Spring框架对“约定大于配置(Convention over Configuration)”理念的最佳实践
2.SpringBoot应用本质上就是一个基于Spring框架的应用
3.快速创建生成一个基于 Maven的Spring Boot项目
(1)打开网址:start.spring.io,填写对应信息,如图所示
(2)解压后的项目文件在myeclipse中打开以后,我们会看到如下的项目结构
(3)生成好的项目中的SpringbootDemoApplication.java文件,内容如下
(4)最耀眼的就是@SpringBootApplication注解以及在main方法中运行的SpringAppliation.run()了,那我们要揭开SpringBoot应用的奥秘,很明显就要拿这二位开刀了
<1>@SpringBootApplication注解
(1)@SpringBootApplication其实是一个复合的注解
(2)主要作用的就是@SpringBootConfiguration、@EnableAutoConfiguration以及@ComponentScan 三个注解组成
(3)即 @SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan
(4)如果我们把SpringBoot启动类改写成如下方式,整个SpringBoot应用依然可以与之前的启动类功能一样
<2>SpringAppliation.run()
(1)run方法干了两件事:
1.创建SpringApplication对象:在对象初始化时保存事件监听器,容器初始化类以及判断是否为web应用,保存包含main方法的主配置类。
2.用创建好的SpringApplication对象调用run方法:准备spring的上下文,完成容器的初始化,创建,加载等。会在不同的时机触发监听器的不同事件
4 springboot自动装配原理
(1)springboot解决了spring以及springmvc繁琐的配置的痛点,以“约定大于配置”为原则,实现了自动装配
(2)把bean放入到Spring的Ioc容器叫做装配
(3)在装配Bean的时候,首先要知道哪些类需要被装配,实现这一方式的途径总体上说分为两种 :传统的xml方式,另一种则是注解方式
(4)SpringBoot利用Spring 模式注解装配、Spring @Enable 模块装配、Spring 条件装配装配及Spring 工厂加载机制来实现其自动装配的原理
5.springboot 是如何帮我们省去web.xml配置的
(1)web.xml就是非常重要的一个配置,无论是servlet、filter、listener都需要在web.xml里面配置下
(2)在servlet3.0里,这个配置得到了简化。可以通过java配置(注解等)省去web.xml配置。
(3)一个非常重要的类:javax.servlet.ServletContainerInitializer,初始化servlet代替了web.xml
<1>这个类会在web容器启动阶段被回调,可以在onStartup方法里做一些servlet、filter、listener的注册等操作
<2>SpringBoot会默认注册几个servlet、filter、listener
(4)实现自定义的Filter (2种方式)
方式一:
<1>在Filter实现类加入@WebFilter注解
<2>然后在SpringBootApplication类上添加@ServletComponentScan
方式二:
<1>添加component注解
(5)Servlet和Listener
<1>Servlet与Listener的支持与Filter大同小异
<2>分别是通过@WebServlet、@WebListener进行注解
(6)实现自定义拦截器
<1>编写拦截器实现类,此类必须实现接口HandlerInterceptor
public class OneInterceptor implements HandlerInterceptor{
/**
* 在请求处理之前进行调用(Controller方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
}
/**
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
*/
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
/**
* 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
*/
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
public void returnErrorResponse(HttpServletResponse response, LeeJSONResult result) throws IOException, UnsupportedEncodingException {
}
<2>编写拦截器配置文件主类 WebMvcConfigurer 此类必须继承 WebMvcConfigurerAdapter 类
<3>重写其中的方法 addInterceptors
<4>在主类上加上注解 @Configuration
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter{
/**
* Description:重写增加自定义拦截器的注册,某一个拦截器需要先注册进来,才能工作
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new OneInterceptor()).addPathPatterns("/one/**");
registry.addInterceptor(new TwoInterceptor()).addPathPatterns("/one/**")
.addPathPatterns("/two/**");
super.addInterceptors(registry);
}
}
总结:综上是对自动配置原理
(1)一定要记得XxxxProperties类的含义是:封装配置文件中相关属性
(2)XxxxAutoConfiguration类的含义是:自动配置类,目的是给容器中添加组件。
(3)其他的主方法启动,则是为了加载这些五花八门的XxxxAutoConfiguration类