声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅。

1、概念

SpringBoot 开发深入

2、具体内容

在之前已经基本上了解了整个 SpringBoot 运行机制,但是也需要清楚的认识到以下的问题,在实际的项目开发之中,尤其是 Java 的 MVC 版项目里面,所有的项目都一定需要满足于如下几点要求:

· 访问的端口不能够是 8080,应该使用默认的 80 端口;

· 在项目之中为了方便进行数据的维护,建议建立一系列的*.properties 配置文件,例如:提示消息、跳转路径;

· 所有的控制器现在都采用了 Rest 风格输出,但是正常来讲,信息的显示应该交给页面(不再是 JSP)负责完成;

· 在进行项目打包的时候应该考虑到不同的 profile 配置(不同的环境使用不同的端口访问,如生产环境80端口,beta环境8090端口,dev环境8080端口)。

2.1、改变环境属性

通过当前的执行可以发现,默认情况下,在 SpringBoot 里面启动 WEB 容器为 Tomcat:

INFO 4448 --- [ restartedMain] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup

INFO 4448 --- [ restartedMain] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)

从实际的开发来讲,我们的 WEB 部署项目如果是单独运行不可能运行在 8080 端口上。从正常来讲我们的服务器应该运行在80 端口上,所以如果要想修改这样的默认环境,则必须编写与之对应的配置文件,该配置文件一定要写在 classpath 之中,例如: 项目中的“src/main/resources”就是一个 classpath 路径,那么在这个目录之中直接创建有一个 application.properties(文件名称绝对 不要改变)。

范例:定义 application.properties 配置文件

  1. # 设置Tomcat的运行服务所在端口
  2.  
  3. server.port=80

随后重新运行程序会出现有如下的提示信息:“Tomcat started on port(s): 80 (http)”。

范例:如果有需要也可以配置 contextPath 的信息

  1. # 设置Tomcat的运行服务所在端口
  2. server.port=80
  3. # 可以配置ContextPath访问路径,但是在实际开发之中是不能够进行配置的
  4. server.context-path=/hello

此时的访问路径需要追加 contextPath 前缀:http://localhost/hello/;

严格来讲在 SpringBoot、SpringCloud 里面可以使用两类配置文件:application.properties、application.yml。

YAML 文件: 这是一种结构化的数据文件,其在很多的地方上都使用过,例如:Apache Storm 开发组件上进行配置的时候使用的就是yml 配置文件,该配置文件的全称(Yet Another Markup Languange、仍然是一种标记语言)。

范例:定义 application.yml 配置文件

  1. server:
  2. port: 80 # 此处设置的服务的访问端口配置

如果 application.properties 和 application.yml 两个文件同时存在使用那个?

那么这个时候将优先进行application.properties配置文件的加载,如果现在两个配置项的作用冲突了,则以 properties 为主,如果不冲突,则以存在的为主。

在之前默认使用的 WEB 容器是 Tomcat 容器,实际上在 SpringBoot 里面如果用户有需要也可以将容器更换为 jetty 容器,如果 现在要想使用这个容器,则只需要追加一些依赖即可:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-jetty</artifactId>
  4. </dependency>

如果在以后项目以微服务的方式进行打包发布的时候,强烈建议大家使用 jetty 服务进行发布。

2.2、读取资源文件

在实际的项目开发之中资源文件一定不可或缺,因为所有的提示文字信息都要求在资源文件之中进行定义,而且资源文件是 实现国际化技术的主要手段。如果要想在 SpringBoot 里面进行资源文件的配置只需要做一些简单的 application.yml 配置即可,而且 所有注入的资源文件都可以像最初的 Spring 处理那样直接使用 MessageSource 进行读取。

1、 为了统一管理资源文件,在“src/main/resources”目录之中建立有一个 i18n 的存储目录;

2、 在“src/main/resources/i18n”目录之中建立有两个资源文件:

· 建立 Messages.properties:

  1. welcome.url=www.study.cn
  2. welcome.msg=欢迎{0}光临!

· 建立 Pages.properties 配置文件:

  1. member.add.page=/pages/back/admin/member/member_add.jsp
  2. member.add.action=/pages/back/admin/member/member_add.action

3、 修改 application.yml 配置文件:

  1. spring: # 表示该配置直接为Spring容器负责处理
  2. messages: # 表示进行资源配置
  3. basename: i18n/Messages,i18n/Pages # 资源文件的名称
  4. server:
  5. port: 80 # 此处设置的服务的访问端口配置

4、 当执行完以上的配置之后会自动为用户创建 MessageSource 对象,那么用户在使用的时候直接注入此对象即可。

· 考虑到实际开发的标准型,所以现在建议创建一个父的控制器的抽象类;AbstractBaseController,而后在此抽象类之中进 行资源读取类的配置;

  1. package cn.study.microboot.util.controller;
  2.  
  3. import java.util.Locale;
  4.  
  5. import javax.annotation.Resource;
  6.  
  7. import org.springframework.context.MessageSource;
  8.  
  9. public abstract class AbstractBaseController {
  10. @Resource
  11. private MessageSource messageSource; // 自动注入此资源对象
  12. public String getMessage(String key, String... args) {
  13. return this.messageSource.getMessage(key, args, Locale.getDefault());
  14. }
  15. }

5、 在控制器的子类之中读取以上的配置信息:

  1. package cn.study.microboot.controller;
  2.  
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestMethod;
  5. import org.springframework.web.bind.annotation.RestController;
  6.  
  7. import cn.mldn.microboot.util.controller.AbstractBaseController;
  8.  
  9. @RestController
  10. public class MessageController extends AbstractBaseController {
  11. @RequestMapping(value = "/echo", method = RequestMethod.GET)
  12. public String echo(String mid) {
  13. System.out.println("【*** 访问地址 ***】" + super.getMessage("member.add.action"));
  14. return super.getMessage("welcome.msg", mid);
  15. }
  16. }

6、 编写一个 junit 测试类,来测试以上的控制器程序是否正确:

  1. package cn.study.microboot.test;
  2.  
  3. import javax.annotation.Resource;
  4.  
  5. import org.junit.Test;
  6. import org.junit.runner.RunWith;
  7. import org.springframework.boot.test.context.SpringBootTest;
  8. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  9. import org.springframework.test.context.web.WebAppConfiguration;
  10.  
  11. import cn.mldn.microboot.StartSpringBootMain;
  12. import cn.mldn.microboot.controller.MessageController;
  13.  
  14. @SpringBootTest(classes = StartSpringBootMain.class)
  15. @RunWith(SpringJUnit4ClassRunner.class)
  16. @WebAppConfiguration
  17. public class TestMessageController {
  18. @Resource
  19. private MessageController messageController;
  20. @Test
  21. public void testEcho() {
  22. System.out.println(this.messageController.echo("lgs"));
  23. }
  24. }

输出:

【*** 访问地址 ***】/pages/back/admin/member/member_add.action
欢迎lgs光临!

通过 SpringBoot 执行可以清楚的发现,在 SpringBoot 里面所有对象信息的注入配置操作,都直接通过一行简单的字符串实现 了,而且最终也能够保持与之前同样的运行效果。

2.3、Bean 配置

在使用 Spring 进行开发配置的时候有两类选择:*.xml 配置文件、配置的 Bean(@Configure),于是在 SpringBoot 的开发世界 里面,为了继续崇尚所谓的“零配置”,提供有一种简单的支持,也就是说如果现在你真的有配置需要通过*.xml 文件编写,但是又 不想出现配置文件的话,这个时候最简单的做法就是使用 Bean 的方式来进行类的配置。

前提:该配置程序的 Bean 所在的包必须是程序启动类所在包的子包之中,这样才可以自动扫描到。

1.在传统的开发中我们一般使用注解@service和@Resource即可完成bean的配置和注入

2.在SpringBoot中使用@Configuration和@Bean配置bean

  1. package cn.study.microboot.config;
  2.  
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5.  
  6. import cn.mldn.microboot.service.impl.MessageServiceImpl;
  7.  
  8. @Configuration // 此处为配置项
  9. public class ServiceConfig {
  10. @Bean(name="configService") // 此处返回的是一个Spring的配置Bean,与xml的“<bean>”等价
  11. public MessageServiceImpl getMessageService() { // 方法名称随便写
  12. return new MessageServiceImpl() ;
  13. }
  14. }

此时采用了自动扫描 Bean 的模式来进行了相关对象的配置。

3、 SSM 或 SSH 开发框架出现的时间比较长,现在迁移到 SpringBoot 之中,那么如果说现在你已经有一个非常完善的 xml 配置文件出现了,那么难道还需要将整个的 xml 配置文件转换为 Bean 配置吗?为了防止这类情况出现, SpringBoot 也支持有配置文件的 读取,例如:下面创建一个 spring-common.xml 配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <bean id="messageService" class="cn.mldn.microboot.service.impl.MessageServiceImpl" />
  6. </beans>

4、 随后可以在程序启动类上使用 xml 进行配置加载:

  1. package cn.study.microboot;
  2.  
  3. import org.springframework.boot.SpringApplication;
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;
  5. import org.springframework.context.annotation.ImportResource;
  6. @SpringBootApplication // 启动SpringBoot程序,而后自带子包扫描
  7. @ImportResource(locations={"classpath:spring-common.xml"})
  8. public class StartSpringBootMain {
  9. public static void main(String[] args) throws Exception {
  10. SpringApplication.run(StartSpringBootMain.class, args);
  11. }
  12. }

如果此时所配置的两个 bean 都没有名字那么在进行注入的时候一定会出现重复的错误,而这个错误在新版本里面将其做了完 善,不过如果要想在开发之中准确的注入指定的对象,则需要使用名字完成:

  1. @Resource(name="messageService")
  2. private IMessageService messageService ;

2.4、模版渲染

在之前所见到的信息显示发现都是以 Rest 风格进行显示,但是很明显在实际的开发之中,所有数据的显示最终都应该交由页 面完成,但是这个页面并不是*.jsp 页面,而是普通的*.html 页面,而且最为重要的是,此处所使用的渲染的页面采用的是模版方式 的显示,而在 Java 开发行业,对于前台的显示模版常见的一共有三类技术:FreeMarker、Velocity、thymeleaf(推荐使用),于是下 面就利用 thymeleaf 实现一个简单的模版渲染操作。

1、 如果要想在项目之中去使用 thymeleaf 模版,那么应该首先进行相关支持依赖库的导入,修改 pom.xml 配置文件:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  4. </dependency>

2、 本次的开发依然要通过一个控制层跳转到页面之中进行信息显示。在 SpringMVC 的时代使用的是 ModelAndView 传递,而现 在在 SpringBoot 里面如果要传递直接在方法中定义一个 Model 参数即可。

  1. package cn.study.microboot.controller;
  2.  
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.ui.Model;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestMethod;
  7.  
  8. import cn.mldn.microboot.util.controller.AbstractBaseController;
  9.  
  10. @Controller
  11. public class MessageController extends AbstractBaseController {
  12. @RequestMapping(value = "/show", method = RequestMethod.GET)
  13. public String show(String mid, Model model) {
  14. model.addAttribute("url", "www.study.cn"); // request属性传递包装
  15. model.addAttribute("mid", mid); // request属性传递包装
  16. return "message/message_show"; // 此处只返回一个路径, 该路径没有设置后缀,后缀默认是*.html
  17. }
  18. }

3、 现在的控制器之中使用的是“@Controller”注解,所以此时执行该控制器的方法后会进行跳转处理。如果现在要进行跳转 页面的定义,有严格要求:在CLASSPATH路径下(src/main/resources、src/main/view)必须建立有一个templates的目录,在这个目 录里面保存有thymeleaf的所有相关页面,这些页面可以按照文件目录保存;

建立一个源代码目录:src/main/view;

4、 编写 message_show.html 页面(重要提示:该页面编写的时候所有的元素一定要完结

  1. <!DOCTYPE HTML>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <title>SpringBoot模版渲染</title>
  5. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
  6. </head>
  7. <body>
  8. <p th:text="'官方网站:' + ${url}"/>
  9. <p th:text="'用户名:' + ${mid}"/>
  10. </body>
  11. </html>

5、 运行服务,而后输入访问路径:http://localhost/show?mid=lgs;

6、 如果现在我们所定义的要访问的页面不是通过控制器跳转的怎么办?那么为了解决这样的问题,可以考虑在 thymeleaf 所在的 父路径之中“src/main/view”建立一个 static 的子目录,该目录保存的是所有静态页面;

在以后的实际开发之中,像 js、css、images 等信息文件都要求放在 static 目录里面。

7、 thymeleaf 默认的访问的页面路径的后缀为*.html,那么也可以通过修改 application.yml 配置文件进行变更:

  1. spring: # 表示该配置直接为Spring容器负责处理
  2. thymeleaf:
  3. suffix: .htm
  4. messages: # 表示进行资源配置
  5. basename: i18n/Messages,i18n/Pages # 资源文件的名称
  6. server:
  7. port: 80 # 此处设置的服务的访问端口配置

这个时候你需要修改“src/main/view/templates/message”下的 message_show.html 页面为 message_show.htm 才可以正常访问。

2.5、profile 配置

在实际的开发之中,由于开发(dev)、测试(beta)、运行(product)的环境不同,有可能需要选择不同的配置文件,所以在 SpringBoot 里面充分的考虑到了此类问题,那么就专门提供有多个 profile 配置,但是对于多 profile 配置一定给要区分出是 yml 还 是 properties,这两种资源的配置是不同的。

1、 基于 yml 实现 profile 的配置处理:

· 在使用 yml 配置文件的时候所有可以使用的 profile 配置项都要求在一个文件之中编写;

  1. spring:
  2. profiles:
  3. active: product
  4. ---
  5. spring:
  6. messages:
  7. basename: i18n/Messages,i18n/Pages
  8. profiles: dev
  9. server:
  10. port: 8080
  11. ---
  12. spring:
  13. messages:
  14. basename: i18n/Messages,i18n/Pages
  15. profiles: beta
  16. server:
  17. port: 9090
  18. ---
  19. spring:
  20. messages:
  21. basename: i18n/Messages,i18n/Pages
  22. profiles: product
  23. server:
  24. port: 80

最初进行 profile 切换的处理可以通过 maven 的编译工具动态选择,但是在 Spring 里面可以方便的实现这种切换。

2、 此时所有的 thymeleaf 页面都保存在“src/main/view”目录之中,而且所有的 SpringBoot 配置文件(*.yml)这个文件也应该都 一起输出到 jar 文件里面,那么就需要配置一个资源的引用,修改“microboot”中的 pom.xml 配置文件:

  1. <resources>
  2. <resource>
  3. <directory>src/main/resources</directory>
  4. <includes>
  5. <include>**/*.properties</include>
  6. <include>**/*.yml</include>
  7. <include>**/*.xml</include>
  8. <include>**/*.tld</include>
  9. </includes>
  10. <filtering>false</filtering>
  11. </resource>
  12. <resource>
  13. <directory>src/main/java</directory>
  14. <includes>
  15. <include>**/*.properties</include>
  16. <include>**/*.xml</include>
  17. <include>**/*.tld</include>
  18. </includes>
  19. <filtering>false</filtering>
  20. </resource>
  21. <resource>
  22. <directory>src/main/view</directory>
  23. <includes>
  24. <include>**/*.*</include>
  25. </includes>
  26. <filtering>false</filtering>
  27. </resource>
  28. </resources>

3、 随后可以将项目进行打包处理,在打包之后也可以动态切换 profile 配置;

· Maven 打包:clean package;

· 随后如果现在要使用默认的 profile 就正常执行:java -jar microboot.jar;

· 难道以后每一次访问都需要重新打包吗?也就是说为了方便用户的动态进行 profile 切换,可以在程序执行的时候设置一个 执行的处理参数:java -jar microboot.jar --spring.profiles.active=beta;

4、 【趣味问题】现在当运行完成之后你会发现程序之中默认采用的图标是 Spring 的图标。

但是很多的公司应该去更换为自己的图标,所以这个时候可以单独准备出一个 ico 配置文件,可以将这个配置文件拷贝到 “src/main/view/static/images”目录之中,随后在页面之中进行引入:

  1. <link rel="icon" type="image/x-icon" href="/images/study.ico"/>

5、 在进行 profile 配置的时候特别需要注意一点,如果你使用的是 application.properties 配置,这样的配置处理过程是不一样的, 也就是说如果你基于属性文件完成配置,那么就需要编写多个属性文件内容:

随后还是需要有一个公共的 application.properties 配置文件出现,用于指派可以使用的 profile 配置:

  1. spring.profiles.active=beta

如果现在将开发程序打成*.jar 文件的话,也同样可以在执行的时候使用“--spring.profiles.active=beta”动态指派不同的 profile 配置文件。

SpringBoot系列四:SpringBoot开发(改变环境属性、读取资源文件、Bean 配置、模版渲染、profile 配置)的更多相关文章

  1. SpringBoot开发(改变环境属性、读取资源文件、Bean 配置、模版渲染、profile 配置)

    1.概念 SpringBoot 开发深入 2.具体内容 在之前已经基本上了解了整个 SpringBoot 运行机制,但是也需要清楚的认识到以下的问题,在实际的项目开发之中,尤其是 Java 的 MVC ...

  2. Properties读取资源文件的四种方法

    package com.action; import java.io.InputStream; import java.util.Locale; import java.util.Properties ...

  3. JavaWeb读取资源文件的四种方式

    1. ServletContext 1. 调用getResourcesAsStream方法获取输入流, 相对于webroot, 不用加/2. 读取任何类型的文件3. *只能在web环境下使用 Inpu ...

  4. springboot系列四、配置模板引擎、配置热部署

    一.配置模板引擎 在之前所见到的信息显示发现都是以 Rest 风格进行显示,但是很明显在实际的开发之中,所有数据的显示最终都应该交由页面完成,但是这个页面并不是*.jsp 页面,而是普通的*.html ...

  5. SPRING-BOOT系列之SpringBoot快速入门

    今天 , 正式来介绍SpringBoot快速入门 : 可以去如类似 https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/refer ...

  6. SpringBoot入门篇--读取资源文件配置

    在项目的开发中,我们知道的是SpringBoot框架大大减少了我们的配置文件,但是还是留下了一个application.properties文件让我们可以进行一些配置.当然这些配置必然是包括服务器的配 ...

  7. springboot 项目中读取资源文件内容 如图片、文档文件

    1 问题描述:在 springboot 项目中有时候会需要读取一些资源文件,例如 office的 docx 文档或者 png.jpg的图片.在多模块项目中资源文件需要放到启动项目的 Resources ...

  8. 【转】Struts1.x系列教程(3):属性(资源)文件乱码问题的解决之道

    转载地址:http://www.blogjava.net/nokiaguy/archive/2009/01/archive/2009/01/archive/2009/01/14/251244.html ...

  9. 【开发笔记】- Java读取properties文件的五种方式

    原文地址:https://www.cnblogs.com/hafiz/p/5876243.html 一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供j ...

随机推荐

  1. angular学习笔记(三十)-指令(2)-restrice,replace,template

    本篇主要讲解指令中的 restrict属性, replace属性, template属性 这三个属性 一. restrict: 字符串.定义指令在视图中的使用方式,一共有四种使用方式: 1. 元素: ...

  2. numpy 学习总结

    numpy 学习总结 作者:csj更新时间:01.09 email:59888745@qq.com 说明:因内容较多,会不断更新 xxx学习总结: 回主目录:2017 年学习记录和总结 #生成数组/使 ...

  3. 出去html中的标签

    C#写法 public static string StripHTML(string strHtml) { string strOutput = strHtml; Regex regex = new ...

  4. Android Toolbar的使用 顶部标题栏+后退键

    最近设计安卓里面有个标题栏,里面有个后退键,可以完成后退之类的功能. 好,刚好可以用Toolbar去实现 上代码:activity_main.xml <?xml version="1. ...

  5. Django的安装要点

    Django 的安装: 安装包: 百度盘里搜索"Django-1.7.tar.gz" 安装环境 WIN7 解压文件 移动到python安装目录下 python setup.py i ...

  6. HTTP Status 500 PWC6188 jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application

    报错如下: 解决方案: 1.可能是依赖引用错了,注意 JSP 应依赖: <!-- JSP --> <dependency> <groupId>javax.servl ...

  7. 【Android】接入有米广告SDK

    测试:接入有米广告SDK(测试广告). 步骤: 1.注册并登录有米广告. 2.下载相应的SDK,这里我选了第一个[Android广告SDK ],如下图: 3.下好后,根据doc文档步骤进行操作,包括: ...

  8. Deepin Linux已经做得相当不错了

    很庆幸,用了MacBook Pro三四年后,还会想要用Linux做桌面,一方面说明自己还是年轻的,保持着愿意折腾的心态:另一方面,也确实发现macOS的桌面环境并不如传说中的稳定和好用. Deepin ...

  9. Anaconda下载(改变了镜像路径,下载速度很快!!!)

    Anaconda下载(改变了镜像路径,下载速度很快!!!) 使用conda install 包名 安装需要的Python非常方便,但是官方的服务器在国外,因此下载速度很慢,国内清华大学提供了Anaco ...

  10. PCL滤波介绍(1)

    在获取点云数据时 ,由于设备精度,操作者经验环境因素带来的影响,以及电磁波的衍射特性,被测物体表面性质变化和数据拼接配准操作过程的影响,点云数据中讲不可避免的出现一些噪声.在点云处理流程中滤波处理作为 ...