浅谈SpringBoot与开发常用的技术整合

抽空整理了一下之前云笔记上的内容 SpringBoot相关 做了一个汇总,由于作者也只是一个小小的开发仔, 对于有些点可能只是点到为止,希望各位看客多多包容,有问题可以提出一起沟通学习!

引言

SpringBoot是SpringMVC升级版,微服务统称为SpringCloud,SpringCloud是建立在SpringBoot,SpringBoot解决了编码、配置、部署、监控的问题,SpringBoot特点: 简化配置,下一代框架,微服务入门级微框架。

正文

我们开发任何一个Spring Boot项目,都会用到如下的启动类,Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)最为耀眼,接下来介绍这两个的作用。

SpringBootApplication

Alt SpringBoot

虽然定义使用了多个Annotation进行了原信息标注,但实际上重要的只有三个Annotation:

  • @Configuration(@SpringBootConfiguration点开查看发现里面还是应用了@Configuration)
  • @EnableAutoConfiguration
  • @ComponentScan

所以,如果我们使用如下的SpringBoot启动类,整个SpringBoot应用依然可以与之前的启动类功能对等:

1
2
3
4
5
6
7
8
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

每次写这3个比较累,所以写一个@SpringBootApplication方便点。接下来分别介绍这3个Annotation。

JPA的使用

Spring-Data-Jpa,JPA(Java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate、TokLink等
使用Jpa可以生成数据库表,ddl-auto可以设置五个属性,create是重新创建新表,若有数据将清除;update更新表,有数据不清除;create-drop,应用停下来会把表删掉;none是什么都不做.validate 验证类中属性与表结构是否一致,若不一致,则会报错。

Alt SpringBoot

pom.xml配置jpa与Mysql的依赖

Alt SpringBoot

在实体类中需要配置相应注解,同时得包括空的构造函数

1
2
3
4
5
6
7
8
9
@Data
@Entity
public class Person {

@Id
@GenerateValue
private Integer id;
private String name;
}

定义一个接口来继承JpaRepository

public interface PersonRepository extends JpaRepository<Person, Integer>{}

Jackson的基本用法

@JsonIgnore返回的Json数据不包括该属性,@JsonFormat转换显示格式,@JsonInclude(Include.NON_NULL)表示为空的话不显示在结果中

Alt SpringBoot

@JsonView 可以过滤序列化对象的字段属性,可以有选择的序列化对象。
然后在Bean实体类中的字段属性添加@JsonView,在Controller方法中添加@JsonView(View.Summary.class)就只会序列化这三个属性,隐藏其他属性
同时JsonView支持继承,当以子类的方式进行序列化时,出来的属性同时也包含父类指定的属性。

篇幅原因,关于SpringBoot开发环境热部署和整合模板引擎下次再讲。

SpringBoot整合Redis

添加pom依赖

Alt SpringBoot

SpringBoot 提供的 Redis工具类 StringRedisTemplate, 设值使用 strRedis.opsForValue().set(“”,””);

SpringBoot 整合定时任务task

使用注解@EnableScheduling开启定时任务,会自动扫描
定义@Component作为组件被容器扫描

自定义定时任务

Alt SpringBoot

表达式生成地址 http://cron.qqe2.com

SpringBoot 异步执行程序

使用注解 @EnableAsync开启异步,会自动扫描
定义@Component @Async 作为组件被容器扫描执行。

异步执行使用场景

发送短信 ,发送邮件, App消息推送, 节省运维凌晨发布任务时间提供效率。

SpringBoot 拦截器的使用

使用注解@Configuration配置拦截器
继承WebMvcConfigurerAdapter
重写addInterceptors添加需要的拦截器地址,如Controller下的@RequestMapping(“one”)下的方法

Alt SpringBoot

使用SpringBoot返回XML数据格式定义

添加XML工具依赖

Alt SpringBoot

自定义XML输出格式

  • @JacksonXmlRootElement:用在类上,用来自定义根节点名称。
  • @JacksonXmlProperty:用在属性上,用来自定义节点名称。
  • @JacksonXmlElementWrapper:用在属性上,可以用来嵌套包装一层父节点,或者禁止此属性参与XML转换。
1
2
3
4
5
6
@JacksonXmlRootElement(localName = "response")
public class UserXmlVo {

@JacksonXmlProperty(localName = "user_name")
private String name;
}

在Controller里定义获取XML格式的方法

1
2
3
4
5
6
7
@RequestMapping(value = "test", produces = MediaType.APPLICATION_XML_VALUE)
public UserXmlVo getXml {

UserXmlVo userXmlVo = new UserXmlVo();
userXmlVo.setName("kennyS");
return userXmlVo;
}

返回的XML格式的数据

Alt SpringBoot

SpringBoot投产上线

打成 jar 包

如果你使用的是 maven 来管理项目,执行以下命令既可以

1.cd 项目跟目录(和pom.xml同级)
2.mvn clean package
3.## 或者执行下面的命令
4.## 排除测试代码后进行打包
5.mvn clean package -Dmaven.test.skip=true

打包完成后 jar 包会生成到 target 目录下,命名一般是 项目名+版本号.jar

启动 jar 包命令

java -jar  target/spring-boot-scheduler-1.0.0.jar

这种方式,只要控制台关闭,服务就不能访问了。下面我们使用在后台运行的方式

nohup java -jar target/spring-boot-scheduler-1.0.0.jar &

也可以在启动的时候选择读取不同的配置文件

java -jar app.jar --spring.profiles.active=dev

也可以在启动的时候设置 jvm 参数

java -Xms10m -Xmx80m -jar app.jar &

生产运维

查看 JVM 参数的值

可以根据 Java 自带的 jinfo 命令:

jinfo -flags pid

来查看 jar 启动后使用的是什么 gc、新生代、老年代分批的内存都是多少,示例如下:

  • XX:CICompilerCount :最大的并行编译数
  • XX:InitialHeapSize 和 -XX:MaxHeapSize :指定 JVM 的初始和最大堆内存大小
  • XX:MaxNewSize : JVM 堆区域新生代内存的最大可分配大小
  • XX:+UseParallelGC :垃圾回收使用 Parallel 收集器

如何重启

简单粗暴

直接 kill 掉进程再次启动 jar 包

  1. ps -ef|grep java
  2. ##拿到对于Java程序的pid
  3. kill -9 pid
  4. 再次重启

  5. Java -jar xxxx.jar

当然这种方式比较传统和暴力,所以建议大家使用下面的方式来管理

补充

版本的迭代当然也有其他的办法,也可以放一个预生产项目(也就是和原生产项目一样一样的哦,也可以理解为备份),预生产项目和生产项目同一时刻只能 存活一个。

脚本执行

如果使用的是maven,需要包含以下的配置

Alt SpringBoot

启动方式:

  1. 可以直接 ./yourapp.jar 来启动
  2. 注册为服务

也可以做一个软链接指向你的jar包并加入到 init.d中,然后用命令来启动

init.d 例子:

1. ln -s /var/yourapp/yourapp.jar /etc/init.d/yourapp
2. chmod +x /etc/init.d/yourapp

这样就可以使用 stop或者是 restart命令去管理你的应用

1. /etc/init.d/yourapp start|stop|restart
2. service yourapp start|stop|restart

本文就到这里结束了,有关SpringBoot其他的知识下次再总结分享出来,欢迎有疑问和想法的朋友交流 ^_^