SpringBoot私人学习笔记

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

此笔记主要是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:javaSerialspringloaded-1.2.6springloaded-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