12
12
13
13
部署:不需要单独的 Web 服务器。这意味着您不再需要启动 Tomcat 或其他任何东西。
14
14
15
+ ## Spring Boot 启动流程⭐
16
+
17
+ 首先 prepareEnvironment 配置环境,然后准备 Context 上下文,ApplicationContext 的后置处理器,初始化 lnitializers,通知处理上下文准备和加载时间,然后开始refresh。
18
+
19
+ prepareEnvironment
20
+
21
+ createApplicationContext
22
+ postProcessApplicationContext
23
+ applylnitializers
24
+ listeners.contextPrepared
25
+ listeners.contextLoaded
26
+ refreshContext
27
+
15
28
### Spring Boot提供了两种常用的配置文件:
16
29
17
30
- properties文件
18
31
- yml文件
19
32
33
+ ## Spring Boot 的核心注解是哪个?⭐
34
+
35
+ 启动类上面的注解是@SpringBootApplication ,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
36
+
37
+ @SpringBootConfiguration :组合了 @Configuration 注解,实现配置文件的功能。
38
+
39
+ @EnableAutoConfiguration :打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication (exclude = { DataSourceAutoConfiguration.class })。
40
+
41
+ @ComponentScan :Spring组件扫描。
42
+
43
+ ## Spring Boot 自动配置原理是什么⭐
44
+
45
+ @EnableAutoConfiguration 这个注解开启自动配置,它的作用:
46
+
47
+ * 利用EnableAutoConfigurationImportSelector给容器中导入一些组件
48
+ * 这个类父类有一个方法:selectImports(),这个方法返回 ** configurations** :
49
+ * List<String > configurations = getCandidateConfigurations(annotationMetadata, attributes);获取候选的配置
50
+ * 将 类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中
51
+ * 加载某个组件的时候根据注解的条件判断每个加入的组件是否生效,如果生效就把类的属性和配置文件绑定起来
52
+ * 这时就读取配置文件的值加载组件
53
+
20
54
### SpringBoot、SpringMVC和Spring区别
21
55
22
56
spring boot只是一个配置工具,整合工具,辅助工具.
@@ -29,4 +63,105 @@ Spring 框架就像一个家族,有众多衍生产品例如 boot、security、
29
63
30
64
- Spring 是一个“引擎”;
31
65
- Spring MVC 是基于Spring的一个 MVC 框架;
32
- - Spring Boot 是基于Spring的条件注册的一套快速开发整合包。
66
+ - Spring Boot 是基于Spring的条件注册的一套快速开发整合包
67
+
68
+ ## SpringBoot 拦截器和过滤器
69
+
70
+ 1、Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。
71
+
72
+ 2、Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理的方式来执行。
73
+
74
+ 3、Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。
75
+
76
+
77
+
78
+ ``` java
79
+ @WebFilter (urlPatterns = " /*" , filterName = " logFilter" )
80
+ public class LogCostFilter implements Filter {
81
+ @Override
82
+ public void init (FilterConfig filterConfig ) throws ServletException {
83
+
84
+ }
85
+
86
+ @Override
87
+ public void doFilter (ServletRequest servletRequest , ServletResponse servletResponse , FilterChain filterChain ) throws IOException , ServletException {
88
+ long start = System . currentTimeMillis();
89
+ filterChain. doFilter(servletRequest, servletResponse);
90
+ System . out. println(" LogFilter Execute cost=" + (System . currentTimeMillis() - start));
91
+ }
92
+
93
+ @Override
94
+ public void destroy () {
95
+
96
+ }
97
+ }
98
+ ```
99
+
100
+
101
+
102
+ 这段代码的逻辑比较简单,就是在方法执行前先记录时间戳,然后通过过滤器链完成请求的执行,在返回结果之间计算执行的时间。这里需要主要,这个类必须继承Filter类,这个是Servlet的规范,这个跟以前的Web项目没区别。 这里直接用@WebFilter 就可以进行配置,同样,可以设置url匹配模式,过滤器名称等。这里需要注意一点的是@WebFilter 这个注解是Servlet3.0的规范,并不是Spring boot提供的。除了这个注解以外,我们还需在配置类中加另外一个注解:@ServletComponetScan ,指定扫描的包。
103
+
104
+ ``` java
105
+ @SpringBootApplication
106
+ @MapperScan (" com.pandy.blog.dao" )
107
+ @ServletComponentScan (" com.pandy.blog.filters" )
108
+ public class Application {
109
+ public static void main (String [] args ) throws Exception {
110
+ SpringApplication . run(Application . class, args);
111
+ }
112
+ }
113
+ ```
114
+
115
+ 上面我们已经介绍了过滤器的配置方法,接下来我们再来看看如何配置一个拦截器。我们使用拦截器来实现上面同样的功能,记录请求的执行时间。首先我们实现拦截器类:
116
+
117
+ ``` java
118
+ public class LogCostInterceptor implements HandlerInterceptor {
119
+ long start = System . currentTimeMillis();
120
+ @Override
121
+ public boolean preHandle (HttpServletRequest httpServletRequest , HttpServletResponse httpServletResponse , Object o ) throws Exception {
122
+ start = System . currentTimeMillis();
123
+ return true ;
124
+ }
125
+
126
+ @Override
127
+ public void postHandle (HttpServletRequest httpServletRequest , HttpServletResponse httpServletResponse , Object o , ModelAndView modelAndView ) throws Exception {
128
+ System . out. println(" Interceptor cost=" + (System . currentTimeMillis()- start));
129
+ }
130
+
131
+ @Override
132
+ public void afterCompletion (HttpServletRequest httpServletRequest , HttpServletResponse httpServletResponse , Object o , Exception e ) throws Exception {
133
+ }
134
+ }
135
+ ```
136
+
137
+ 这里我们需要实现HandlerInterceptor这个接口,这个接口包括三个方法,preHandle是请求执行前执行的,postHandler是请求结束执行的,但只有preHandle方法返回true的时候才会执行,afterCompletion是视图渲染完成后才执行,同样需要preHandle返回true,该方法通常用于清理资源等工作。除了实现上面的接口外,我们还需对其进行配置:
138
+
139
+ ``` java
140
+ @Configuration
141
+ public class InterceptorConfig extends WebMvcConfigurerAdapter {
142
+
143
+ @Override
144
+ public void addInterceptors (InterceptorRegistry registry ) {
145
+ registry. addInterceptor(new LogCostInterceptor ()). addPathPatterns(" /**" );
146
+ super . addInterceptors(registry);
147
+ }
148
+ }
149
+ ```
150
+
151
+ 这里我们继承了WebMVCConfigurerAdapter,看过前面的文章的朋友应该已经见过这个类了,在进行静态资源目录配置的时候我们用到过这个类。这里我们重写了addInterceptors这个方法,进行拦截器的配置,主要配置项就两个,一个是指定拦截器,第二个是指定拦截的URL。
152
+
153
+
154
+
155
+ ## spring boot处理一个http请求的全过程
156
+
157
+ * 由前端发起请求
158
+ * 根据路径,Springboot会加载相应的Controller进行拦截
159
+ * 拦截处理后,跳转到相应的Service处理层
160
+ * 跳转到ServiceImplement(service实现类)
161
+ * 在执行serviceimplement时会加载Dao层,操作数据库
162
+ * 再跳到Dao层实现类
163
+ * 执行会跳转到mapper层
164
+ * 然后MallMapper会继续找对应的mapper.xml配置文件
165
+ * 之后便会跳转到第4步继续执行,执行完毕后会将结果返回到第1步,然后
166
+ * 便会将数据以JSON的形式返回到页面,同时返回状态码,正常则会返回200,便会回到步骤1中查询判断。
167
+
0 commit comments