SpringBoot私人学习笔记

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

此笔记主要是spring-boot-1.5.6版本的笔记,而且笔记都是博主本身一字一字编写和记录,有错误的地方欢迎你们指正。html


另: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虚拟容器技术,能够方便快捷的搭建运行环境,实现简单快捷的部署。







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


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


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



六、使用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包。


七、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包。


八、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为准。




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






二、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不会判断
      模板页面是否存在,当模板页面不存在时,会直接抛出异常,而不会再尝试使用其余视图解析器。




  
三、若是想增长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);
}
}





四、在Spring Boot应用程序启动后,若是想执行一些操做(例如加载数据),可实现CommandLineRunner接口,而且此类必须交给
   Spring管理。在项目启动完后,会依次遍历执行实现CommandLineRunner接口的bean,bean执行顺序能够经过@Order注解或者
   实现Order接口来设定(其中数值越小,优先级越高,默认是最大数值,即最小优先级)。
   
   
   
五、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">。







六、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




七、Spring Boot默认只扫描启动类的同包和子包下的注解类,其他包路径下的注解将不会被扫描,能够在启动类中增长@ComponentScan注解
   来指定扫描的包路径。
   
   
   
八、默认状况下,本身的项目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>




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



十、在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)点的要求便可。但一般状况下,定时任务都是要求同步执行的。






十一、Spring Boot对SpringMVC有着默认的配置,正常状况下只须要直接配置@Controller或@RestController注解就可使用。在使用SpringMVC时,
    若是须要制定Controller层的异常,只须要在控制层增长个异常处理方法,在方法上增长@ExceptionHandler注解便可。若是须要定制全局异常,
则在全局异常类上面增长@ControllerAdvice注解,而后定制@ExceptionHandler注解异常处理方法。

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



十二、若是须要在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 />。

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

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






二、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来运行,简单又方便。






三、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类,实现服务器的启动逻辑。



四、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环境,而且会自动扫描启动类并进行启动。







五、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/



java

相关文章
相关标签/搜索