俗话说“好记性不如烂笔头”,编程的海洋如此的浩大,养成做笔记的习惯是成功的一步!

此笔记主要是spring-boot-1.5.6版本的笔记,并且笔记都是博主自己一字一字编写和记录,有错误的地方欢迎大家指正。

另:SpringBoot是最近几年新出现的框架,简便了Spring Framework框架的冗长配置,是的Spring于其他框架的整合根更加的简单。SpringBoot本身提供了一套默认的配置,使用约定大于配置的思想,使其开发人员的开发效率更高。博主在学习SpringBoot的时候,一边学习一边写demo项目,demo项目可以加博主创建的java交流群(左上角公共栏),博主将会群里讲demo项目共享给大家。demo项目主要整合了:Spring Boot+SpringMVC+Spring data jap +Hibernate+Shiro+Freemarker+Thymeleaf


一、基础知识:
1、Spring Boot是由Spring的Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。
   Spring Boot的出现,不是代替Spring,而是简化Spring的使用,为Spring生态系统提供了一种固定的、约定优于配置风格
   的框架,不需要配置大量的XMl文件来实现功能,同时提供了对很多框架的整合,只需要引入相关的依赖配置,即可实现对
   某个框架的整合,从而省去很多配置工序。Spring Boot支持使用Maven的依赖配置或者是Groovy的Gradle配置。
   官方网站: http://projects.spring.io/spring-boot/
   快速创建基本项目:https://start.spring.io/
   在线文档:http://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/htmlsingle/#boot-documentation-about

附加:
Spring Boot内置支持Tomcat、Jetty等服务器,直接通过Main方法就可以提供web服务。如果配合Docker虚拟容器技术,可以方便快捷的搭建运行环境,实现简单快捷的部署。

2、Spring Boot的简便性,体现在定制了一套默认的规则,通过Maven引入相关的依赖包,Spring Boot检测到依赖包导入后,就将
   相应的bean加入IOC容器中,而使用者无需关系整合某个框架需要做的配置,直接获取框架核心类即可使用。

3、demo目录下是使用Spring Boot的案例。
spring-boot-basic.zip:是通过官方网站生成的最基本的Spring Boot项目,可以直接在此项目上进行开发。
spring-boot-demo:是学习Spring Boot框架的练习项目。

4、Spring boot还提供了一个CTL(command line tool)命令行工具,可以安装此工具,然后通过命令来操作Spring项目,并且
   可以使用groovy的脚本,可以根据需要进行安装此工具。
   
   
5、Spring Boot在通过SpringApplication.run()方法启动项目的时候,会判断当前是否web环境(通过判断是否存在javax.servlet.Servlet
   或org.springframework.web.context.ConfigurableWebApplicationContext类并能否加载为Class来断定),如果是web环境,则创建
   StandardServletEnvironment类,否则创建StandardEnvironment类。

6、使用maven打包Spring Boot项目为jar包后,会产生两个jar包,例如 spring-boot-demo.jar 和 spring-boot-demo.jar.original
   其中有original后缀的文件是maven编译的原生jar包,里面只有编译后的项目文件和资源文件。而spring-boot-demo.jar包是
   spring-boot-maven-plugin插件编译的jar包,里面除了项目文件和资源文件外,还有依赖的jar包和Spring Boot项目启动增加
   的额外class文件。部署项目时,应该使用spring-boot-demo.jar 这个jar包。

7、Spring Boot项目打包为jar包后,会把依赖的jar包和Spring Boot项目启动增加的额外class文件都加入此包,那么就会出现jar包
   里面有jar包的情况,即jar in jar的情况,而JDK只能支持单个jar包加载的情况,为此Spring Boot做了扩展,定义了自己的
   LaunchedURLClassLoader类加载器,以及相应的jar处理类进行了扩展。Spring Boot会把jar解压方到临时目录(临时目录是读取
   System.getProperty("java.io.tmpdir")的属性),然后在解压的临时文件读取相应的jar包。

8、Spring Boot支持logback、log4j2,jdk (java util logging)三种日志框架,其中默认是使用logback框架。默认会顺序加载
   classpath目录下的logback-spring.xml、logback.xml,log4j2-spring.xml、log4j2.xml,logging.properties这几种日志配
   置文件。官方建议优先使用-spring.xml的配置形式,以便让spring完全可以控制日志的初始化,使得日志框架可以使用Spring
   的一些特殊功能和环境变量,例如可以使用springProfile。
   
   附加:如果application.properties和logback.xml定义了相同的配置,则以application.properties为准。

二、使用笔记;
1、快速使用Spring框架,创建一个包含main方法入口类,增加SpringBootApplication配置即可。
@SpringBootApplication
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
}

2、Spring Boot默认支持thymeleaf和freemarker模板,只需要在pom.xml文件中引入依赖的jar包即可。
<!--引入thymeleaf模板-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<!--引入freemarker模板-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

说明:对thymeleaf或者freemarker模板的配置,可以在application.properties文件中进行相关的配置。
      thymeleaf和freemarker模板是可以共存的。即会优先使用freemarker判断模板页面是否存在,如果
  存在,则使用freemarker模板,如果不存在,则再通过thymeleaf监测模板页面是否存在,存在则解析
  模板并返回给前端,反之抛出异常。
  
  
附加:通常Spring的ViewResolver视图解析器是有多个的,将会根据Order顺序来排序,按顺序检查是否有符合
      解析的视图,如果有则使用该视图。freemarker和thymeleaf视图的Order返回值都是2147483642,即优先级
  是一样的,此时是根据Bean的注册顺序来排序,freemarker是比thymeleaf优先注册的,故能确保freemarker
  视图在thymeleaf视图之前被解析。
  
  
注意:不能手动设置thymeleaf视图的Order值,必须要保证其在freemarker视图后面执行。因为thymeleaf不会判断
      模板页面是否存在,当模板页面不存在时,会直接抛出异常,而不会再尝试使用其他视图解析器。

3、如果想增加Spring MVC的静态资源或者是拦截器等配置,可以新建一个配置类,继承WebMvcConfigurerAdapter,然后
   在此类增加@Configuration注解即可。代码如下:
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
//覆盖需要增加配置的方法。
@Override
publicvoid addInterceptors(InterceptorRegistry registry) {
// 多个拦截器组成一个拦截器链
// addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截
registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**");
registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}

4、在Spring Boot应用程序启动后,如果想执行一些操作(例如加载数据),可实现CommandLineRunner接口,并且此类必须交给
   Spring管理。在项目启动完后,会依次遍历执行实现CommandLineRunner接口的bean,bean执行顺序可以通过@Order注解或者
   实现Order接口来设定(其中数值越小,优先级越高,默认是最大数值,即最小优先级)。
   
   
   
5、Spring Boot的application.properties配置文件是支持不同环境的配置的,命名形式为application-环境标识.properties,
   例如application-dev.properties 、 application-prd.properties 等形式。可以在application.properties配置中指定
   默认的环境,例如spring.profiles.active=dev。Spring Boot会加载application.properties配置,然后根据环境再加载
   application-dev.properties配置,并覆盖已经在application.properties中配置的内容。
   
   指定环境的方式多种:
方式一(通过spring boot插件运行): mvn spring-boot:run -Drun.profiles=dev
    方式二(通过命令运行jar文件):java -jar -Dspring.profiles.active=dev demo-0.0.1-SNAPSHOT.jar
方式三(通过IDE运行java类):在启动的java类上,则增加Program arguments参数 --spring.profiles.active=dev

附加:(1)Spring框架本身就支持不同环境下的配置,如果是普通的javaee项目,可以在web.xml文件下指定环境:
   <context-param>    
<param-name>spring.profiles.active</param-name>    
<param-value>dev</param-value>    
   </context-param>

(2)Spring框架的bean本身也支持不同环境下生成不同的bean,如果是使用注解则在类上增加 @Profile("dev")配置,
   如果是xml配置, 则声明属性<beans profile="dev">。

6、Spring Boot在启动的时候的banner标语默认为Spring,可以自己进行个性化定制,定制方式有两种:
第一种:src/main/resouces下新建banner.txt,通过banner.txt文件来定制标语。

第二种:实现org.springframework.boot.Banner接口,然后不再使用SpringApplication.run()方法,
而是自己手动new SpringApplication()对象,通过此对象的setBanner(banner)方法指定实现类。

附加:如果不想显示banner标语,还可以在application.properties中配置spring.main.show-banner=false

7、Spring Boot默认只扫描启动类的同包和子包下的注解类,其余包路径下的注解将不会被扫描,可以在启动类中增加@ComponentScan注解
   来指定扫描的包路径。
   
   
   
8、默认情况下,自己的项目pom.xml文件是继承spring-boot-starter-parent的,如果本身自己项目有父maven项目,可以将对Spring Boot
   框架的继承改为组合关系,修改如下:
<dependencyManagement>  
<dependencies>  
<dependency>  
<groupId>org.springframework.boot</groupId>  
<artifactId>spring-boot-dependencies</artifactId>  
<version>1.3.3.RELEASE</version>  
<type>pom</type>  
<scope>import</scope>  
</dependency>  
</dependencies>  
</dependencyManagement>

9、Spring Boot对jsp页面的支持不友好,官方也不推荐使用jsp,推荐使用thymeleaf或者是freemarker模板。Spring Boot打包出来的
   项目是jar包形式的,而使用jsp是基于标准的war包形式的规范,故使用Spring Boot打包成jar包时jsp页面的存放路径成了问题,
   并且Spring Boot使用的是web3.0的标准,而jsp的jstl根据web3.0会出现兼容性问题。

10、在Spring Boot中使用Spring框架自带的轻量级定时任务:
(1)增加@EnableScheduling注解,即可扫描@Scheduled注解。@Scheduled注解就是指定定时任务的方法和运行时间。

(2)Spring的定时任务,默认情况下是同步串行执行的。所谓同步,是指同一个定时任务在执行完毕后才开始重新计时,保证同一
  个定时任务不会同时运行。串行执行,是指在执行多个定时任务时是按顺序一个个执行的,而不是同时执行。
  
(3)如果要想将定时任务并行执行,可以让含有@EnableScheduling注解的类实现org.springframework.scheduling.annotation.SchedulingConfigurer
接口,根据接口的configureTasks方法的参数ScheduledTaskRegistrar.setScheduler设定自定义的Executor线程池。

(4)如果想将定时任务异步执行,可以让含有@EnableScheduling注解的类实现org.springframework.scheduling.annotation.AsyncConfigurer接口,
   并在此实现类上增加@EnableAsync注解。同时,在含有@Scheduled注解的定时任务方法上,增加@Async注解。
   
附加:Spring定时任务可以实现异步并行的模式,只需要同时满足(3)、(4)点的要求即可。但通常情况下,定时任务都是要求同步执行的。

11、Spring Boot对SpringMVC有着默认的配置,正常情况下只需要直接配置@Controller或@RestController注解就可以使用。在使用SpringMVC时,
    如果需要制定Controller层的异常,只需要在控制层增加个异常处理方法,在方法上增加@ExceptionHandler注解即可。如果需要定制全局异常,
则在全局异常类上面增加@ControllerAdvice注解,然后定制@ExceptionHandler注解异常处理方法。

注意:详细的异常处理方法优先于父类的异常方法(即如果是ArithmeticException异常,那么定制有ArithmeticException异常将优先于Exception异常),
      同时局部异常处理器又优先于全局异常处理器。即先以局部为优先,如果局部有多个异常处理方法,则优先使用完全匹配的异常。

12、如果需要在freemarker中使用shiro标签,引入如下依赖:
<dependency>
<groupId>net.mingsoft</groupId>
<artifactId>shiro-freemarker-tags</artifactId>
<version>0.1</version>
</dependency>

然后在Spring Boot启动完毕后(可实现CommandLineRunner接口来确定在启动完毕后执行业务),注入FreeMarkerConfigurer对象,然后操作此对象,
增加siro标签解析的模板 freeMarkerConfigurer.getConfiguration()setSharedVariable("shiro", new ShiroTags());
最终在ftl页面类似于macro宏来使用,例如<@shiro.principal />。

/**********************************************************附加*********************************************************/
1、Spring Boot项目有两种启动方式:
方式一:通过IDE的run as - java application启动。
方式二:通过maven执行命令 spring-boot:run方式启动。

停止方式都可以直接在IDE的console输出面板的  terminate 按钮来终止服务。

2、Spring Boot默认情况下是不支持热部署的,但如果是在开发环境,可以借助springloaded设置为热部署状态,从而减少服务器
   的启动次数。但是并不是任何情况下都能实现代码的热部署,如果发现部署不成功,则还是需要重新启动服务器。
   
   方式一(通过IDE的run as启动):
在启动main方法的类中,配置run as的jvm启动参数: 
-javaagent:E:\javaSerial\springloaded-1.2.6\springloaded-1.2.6.RELEASE.jar -noverify

如果想运行debug模式,则直接执行debug as 方式即可。

方式二(通过maven启动):
步骤一:配置pom.xml文件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin </artifactId>
<!--如果不需要运行为debug模式,则注释掉jvmArguments标签内容-->
<configuration>
    <!--配置远程debug模式-->
<jvmArguments>
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
</jvmArguments>
<!--配置启动的main方法类-->
<mainClass>com.example.springbootdemo.SampleController</mainClass>
</configuration>
<dependencies>
<!--springloaded hot deploy -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.6.RELEASE</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

步骤二:通过maven启动项目,执行maven命令 spring-boot:run

步骤三:配置远程deubg。在eclipse编辑器的Run-》Debug Configurations-》Remote Java Application -》new一个,
        选择正确的Project,然后修改Port端口为5005,最后点击Debug按钮即可。

说明:使用方式二来执行debug模式时,使用eclipse输出面板的terminate按钮无法终止服务器,需要通过系统的任务
      管理器来终止java.exe进程,这是spring-boot-maven-plugin的一个bug,目前还未修复。故不推荐使用方式二
  来执行debug模式,建议使用方式一通过IDE来运行,简单又方便。

3、Spring Boot的项目默认是嵌入tomcat或jetty服务器,通过将项目打包为jar包的形式运行的。如果想将项目外包为war包,
   部署到外部服务器上,可以做以下处理:
    步骤一:启动类继承SpringBootServletInitializer方法,并覆盖configure方法指定启动类,示例代码如下:
@SpringBootApplication
public class SpringBootDemoApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}

/** 
* 如果想把Spring Boot项目部署到外部的服务器,必须要覆盖此方法,指定Spring Boot的启动类。

*/
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SpringBootDemoApplication.class);
}
}

步骤二:修改pom文件,将<packaging>jar</packaging>修改为<packaging>war</packaging>。

步骤三:修改pom文件,将tomcat或jetty服务器的jar包修改为provided的域,防止部署时与外部服务器的jar包冲突。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--修改域的依赖关系,打包时取出tomcat包-->
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--spring-boot-starter-web默认是依赖tomcat服务器的,预防冲突,最好在此排除tomcat包。-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>

说明:Spring Boot项目生成的war包是没有web.xml文件的,之所以能正常的部署到服务器中,并被正常的解析web项目,
      是因为Spring Boot借助了Servlet3.0版本的特性,使用javax.servlet.ServletContainerInitializer类来定制
  Servlet容器的启动,通过JDK的SPI来指定服务类(在/META-INF/services/目录下配置),Spring MVC框架对此接
  口有个实现类org.springframework.web.SpringServletContainerInitializer,此方法通过注解来指定获取的
  Class类型,@HandlesTypes(WebApplicationInitializer.class),会对所以实现了WebApplicationInitializer
  接口的类都扫描出来,然后执行自己的初始化逻辑。SpringBootServletInitializer定义了抽象类来实现了此接口,
  故需要我们的启动类来继承SpringBootServletInitializer类,实现服务器的启动逻辑。

4、Spring Boot中常用的注解:
@SpringBootApplication   负责启动Spring Boot项目时的必要注解,声明了注解扫描,注解配置,默认配置等功能。

@ControllerAdvice    对spring web中的Controller进行aop切入,通常是为了执行Controller类的公共处理,配合
  @ExceptionHandler, @InitBinder, or @ModelAttribute 等注解使用。

@ExceptionHandler 声明异常处理,用在处理异常的方法,并且要求此类必须有@ControllerAdvice注解。

@RestController 声明此Controller是提供RESTful接口的类,所以处理方法返回的结果都是写入相应结果中。
可参照@ResponseBody的功能。

@ServletComponentScan  开始扫描是否有自定义的Servlet类(此类必须加@WebServlet注解)、过滤器类(此类必须加
@WebListener注解)和监听器类(此类必须加@WebListener注解)

@Profile 根据不同环境来确定是要生成此bean。

@Import 增加需要扫描的Bean,相当于xml的<import>元素。此实现类需要实现ImportBeanDefinitionRegistrar接口。

@ConfigurationProperties 读取配置文件的信息并通过setter方法设置到当前bean中,可以设定读取的配置文件,
默认是读取application.properties文件。此注解需要配合@EnableConfigurationProperties
注解来使用。

@EnableConfigurationProperties  开启对@ConfigurationProperties注解的支持,并将指定的有@ConfigurationProperties类
作为bean对象放入容器中,可以注入到其他bean。

@Configuration  指定某个类有通过@Bean注解来注册的bean对象。

@ImportResource  指定xml配置文件,并加载。配置路径时,支持classpath:前缀和file:前缀,通常使用classpath:前缀表示相对
目录为当前编译目录。
 
 
@SpringBootTest   运行junit单元测试的注解配置,会自己模拟web环境,并且会自动扫描启动类并进行启动。

5、Spring Boot的DAO层通常使用 Spring Data JPA来快速方便的操作数据库,JPA的实现者通常为Hibernate框架。在pom.xml文件增加
   jpa依赖即可使用:
   <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

关于Spring Data JPA的使用方式,可以参考官方文档:
https://docs.spring.io/spring-data/jpa/docs/1.11.7.RELEASE/reference/html/

转载于:https://www.cnblogs.com/catgwj/p/7609418.html

SpringBoot私人学习笔记相关推荐

  1. 8. SpringBoot基础学习笔记

    SpringBoot基础学习笔记 课程前置知识说明 1 SpringBoot基础篇 1.1 快速上手SpringBoot SpringBoot入门程序制作 1.2 SpringBoot简介 1.2.1 ...

  2. 【SpringBoot】最新版2019Spring Boot配置解析,源码解析(速成SpringBoot)——学习笔记版【2】

    SpringBoot配置文件 文章目录 SpringBoot配置文件 四.配置文件 1.简介 2.YAML用法 2.1 简介 2.2语法 3.为属性注入值 3.1使用.yml配置文件 3.1编写.ym ...

  3. Mbatis-Plus整合springboot详细学习笔记

    文章目录 Mbatis-Plus 学习笔记 一.基本架构 二.查询方法 2.1.构造条件查询 2.2.嵌入sql查询 2.3.分组查询 2.4.只返回一条数据 2.5.返回指定列数据 2.6.在字段上 ...

  4. 进大厂必看!拼多多大佬总结出来的10万字Springboot经典学习笔记PDF版本,分享给大家!

    大家好,我是武哥,今天给大家免费分享我写的 10万字 Spring Boot 学习笔记(带完整目录)以及对应的源码.这是我之前在 CSDN GitChat 开的一门课,所以笔记非常详细完整.课程现在已 ...

  5. SpringBoot经典学习笔记

    本文非原创,仅为自己方便查看转载,作者信息在下方,侵权删,感谢! 作者信息 本课程首发于 CSDN GitChat 达人课<跟武哥一起学Spring Boot>,该文档为课程详细笔记. 作 ...

  6. 最通俗易懂的SpringBoot经典学习笔记讲解

    导读:课程概览 1. Spring Boot是什么 我们知道,从 2002 年开始,Spring 一直在飞速的发展,如今已经成为了在Java EE(Java Enterprise Edition)开发 ...

  7. Springboot框架学习笔记------项目搭建、程序解析、配置文件的作用

    今天开始学习spring boot,这个框架整合spring和springmvc,简化了很多的配置,这是目前的理解. 搭建流程: 1.从idea搭建,利用maven创建项目,前提是联网,需要下载mav ...

  8. 硬核3万字,SpringBoot框架学习笔记

    Spring Boot是Spring家族下的一个全新开发框架,其设计目的主要是用来简化Spring应用的创建及开发过程,它提供了自动配置,starter依赖等特性,从而使开发人员从大量的XML配置中解 ...

  9. ZooKeeper私人学习笔记

    俗话说"好记性不如烂笔头",编程的海洋如此的浩大,养成做笔记的习惯是成功的一步! 此笔记主要是ZooKeeper3.4.9版本的笔记,并且笔记都是博主自己一字一字编写和记录,有错误 ...

最新文章

  1. 小霸王双核/四核手机最新参数曝光
  2. 数学对于编程来说重要吗?编程大佬眼里的线性代数
  3. ros如何编译python文件_Python为ROS编写一个简单的发布者和订阅者
  4. 浅谈OpenGL、OpenGL ES
  5. 红橙Darren视频笔记 Behavior的工作原理源码分析
  6. 优达学城深度学习之三(上)——卷积神经网络
  7. Python 实现信息自动配对爬虫排版程序
  8. 克隆版JLINK-V8固件的烧录与破解
  9. Android.mk文件官方使用说明
  10. 实现人人网爬去数据(opener)
  11. 换个角度看发国难财的行为
  12. 3小时GIS入门教程(一):为什么要学GIS
  13. 如何卸载deepfreeze(冰点还原)
  14. 【动态规划 记忆化搜索】JZOJ_6287 扭动的树
  15. 索尼xz1c 日版融卡扩容经验分享(无需root,索尼XZP机型也适用)
  16. 哈密顿算子在直角坐标系的矩阵表示
  17. matlab 批量修改文件名常见错误
  18. uniapp小程序发布过程中,图片跟音频资源超过200K无法上传
  19. 【Linux】_面试题之权限、ACL、磁盘空间管理、VDO、SELinux、逻辑卷、服务管理、防火墙策略、故障修复i
  20. 关于vue3中无config文件

热门文章

  1. 第五章节 类的继承(继承的概述)
  2. php 字符串hash比较,分析两个 url 查询字符串和 hash 的区别
  3. jquery的Dom操作查找节点
  4. [leetcode]5354. 通知所有员工所需的时间
  5. 硬币支付问题(贪心策略)
  6. bzoj 4956: [Wf2017]Secret Chamber at Mount Rushmore(最短路)
  7. opencv 图像基本操作 像素值的获取、图像大小、ROI、通道分割与合并等
  8. [paper reading] DenseNet
  9. tensorflow c++接口,python训练模型,c++调用
  10. python机器学习案例系列教程——模型评估总结