为了账号安全,请及时绑定邮箱和手机立即绑定

基于gradle和spring-boot的后端框架整合

标签:
Java
许久未见,甚是想念

很久没有在慕课上写手记了,各位慕友们请见谅,因为之前一段时间找工作,又开辟了新的个人博客 技术笔记 ,这边的就放一边了,见谅,见谅。

慕小白又回来了。

今天向大家介绍的是spring-boot,这个java框架在RESTful思想的背景下,也火了一把,而且还可能火下去。因此就研究了一下怎么搞。

实际上过程很简单。关键在于理解概念,以及在哪种情况下,使用哪种工具。如果这个可以在头脑中有一个清晰的逻辑概念,那就一切OK。

1. 先简介一下各种工具框架的作用

首先是Gradle,实际上这个工具在我的其他手记中已经有说道,就是一个自动化建构工具,为了解决依赖问题,同时构建项目和打包部署项目。这样就能拨开面纱,看她的脸了。Maven主要因为xml的繁琐,会被抛弃。但是现在的大多数项目还在使用Maven,因为路径依赖的问题,还是会存在一段时间的。(个人看法)

然后是spring-boot 这个框架,这个框架就需要我们打破web传统,可以没有web.xml,也可以不用装tomcat,所有的内容都在一个jar中就可以完成。只需运行java -jar xxx 就可以完成了。但是不知道效率、性能怎么样? 不过就简单性,是OK的。而且一切又回归到main了,这不也是所有语言的开始吗?

至于,在spring-boot中结合jersey实现RESTful,也只用理解jersey只是一种实现而已,然后在spring-boot中注册一下,就可以了,不过具体细节还有很多,这个要在下一篇具体介绍。

2. 安装,创建项目

首先安利一个网站 start spring-boot,可以在网站上直接定制需要的技术,像AOP,JDBC,MYSQL,AMQP等都可以直接生成。其他步骤如下,首先安装好gradle,注意:配置好环境变量。切换到项目目录后,直接gradle init 即可,然后就是一些约定俗成的文件夹格式。可以自己手动创建好就行了。
文件夹规范

3. 常见的一些问题

3.1 编码打包的时候,和jvm的编码

编译的时候在build.gradle 最后面添加一下代码,表示,在complile的时候采用UTF-8编码。

tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

使用jvisualvm图形化工具查看spring-boot概况
修改之前

修改gradle.bat 中的set DEFAULT_JVM_OPTS= 默认为空 修改为set DEFAULT_JVM_OPTS="-Dfile.encoding=UTF-8" 可以在上图中看到JVM参数一栏中这个参数GBK,然后直接修改。

3.2 热部署

spring-boot-devtools 可以参考一下这篇文章:springboot + devtools(热部署)

reload和restart的区别

restart:先stop 再start,服务会停止。如果重启了肯定就会reload的。

reload是只是重新加载文件,但是服务不停。重新加载,就像网页F5一样。

这些细微的区别才是关键。

3.3 debug

怎么实现debug运行

gradle bootRun --debug-jvm

在ide中的话直接右键单击debug运行java Application是不是异常的简单啊。

4. 重要文件分析

build.gradle

buildscript {
    ext {
        springBootVersion = '1.5.1.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
jar {
    baseName = 'spring-boot'
    version = '0.0.1-SNAPSHOT'
}
repositories {
    jcenter()
}
dependencies {
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '1.5.1.RELEASE'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.5.1.RELEASE'
    compile group: 'org.springframework.boot', name: 'spring-boot-devtools', version: '1.5.1.RELEASE'
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-jersey', version: '1.5.1.RELEASE'
    testImplementation 'junit:junit:4.12'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

这个文件里面包含3块 构建脚本, 包依赖,编译打包。

Application.java 启动

package web;
import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.servlet.ServletProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import config.DatabaseProperties;
import config.JerseyConfig;
import config.RedisProperties;
@SpringBootApplication
public class Application {
    @Bean
    public ServletRegistrationBean jerseyServlet() {
        ServletRegistrationBean registration = 
new ServletRegistrationBean(new ServletContainer(), "/rest/*");
        registration.addInitParameter(
ServletProperties.JAXRS_APPLICATION_CLASS, JerseyConfig.class.getName());
        return registration;
    }
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

中间的一串@Bean在这里可以无视,是注册jersey用的,后面再说。spring-boot在运行的时候会扫描有main方法的类,这里就是Application类,然后运行main方法,这里SpringApplication
Hello.java 访问

package web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.*;
import config.RedisProperties;

@RestController
public class Hello {

    @RequestMapping("/")
    public String hello() {
          return "hello world";
    }
}

直接访问http://localhost:8080/ 页面返回 hello world,解释:@RestController注解是表明这个类是控制器,@RequestMapping 就是前台的访问路径

4. 对问题的理解

配置的臃肿,之前的web应用经过一层一层的xml跳转,搞得头晕,当初把所有的注入实体,都抽出来到xml中,现在看来是不是有一点过了?可以贴一张图片给大家看一下。
xml1
xml2

这个还没有贴完。一个项目中的一小部分。这么多的配置文件,而且大多数还是很有规律的一个模块一个配置文件,这样,为什么不用约定优预配置这种理念呢?spring-boot就是这样子的,只有像数据库账户密码等信息是一定要提出来的,其他的程序有关类的实例化,直接通过注解,包扫描就行了。

回归简约:简单极美

源码地址:github源码 持续更新ing

参考文献

编码问题 & spring-boot常用的配置1 spring-boot常用配置2 感谢网友
以上文字,观点只是个人观点,和慕课网无关。个人实力有限,如果发现错误,一定要指出,谢谢各位慕友们。如有转载,请注明出处。

点击查看更多内容
6人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消