zoukankan      html  css  js  c++  java
  • 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/



  • 相关阅读:
    react className 有多个值时的处理 / react 样式使用 百分比(%) 报错
    更改 vux Tabbar TabbarItem标题下方的文字激活时的颜色
    angular 图片加载失败 情况处理? 如何在ionic中加载本地图片 ?
    angular 资源路径问题
    webpack 项目实战
    百度地图 创建 自定义控件(vue)
    function 之 arguments 、call 、apply
    手写 redux 和 react-redux
    ARC以及MRC中setter方法的差异
    运行时中给一个对象绑定另外一个对象
  • 原文地址:https://www.cnblogs.com/catgwj/p/7609418.html
Copyright © 2011-2022 走看看