1、SpringBoot
导入依赖,配置yml
mapper-spring-boot-starter
一、 Spring Boot
1、简介
Spring是一个开源的框架,主要是用来简化开发流程
Spring是如何简化Java开发
-
基于POJO的轻量级和最小侵入性编程
-
通过IOC,依赖注入(DI)和面向接口实现松耦合
-
基于切面(AOP)和惯例进行声明式编程
-
通过切面和模板减少样式的代码 微服务是一种架构,他要求我们在开发应用的时候,这个应用必须构建成一系列小服务的组合:可以通过Http(rpc)的方式进行互通。
2、特点
优点
1、减少开发,测试时间。
2、使用 JavaConfig 有助于避免使用 XML。
3、避免大量的 Maven 导入和各种版本冲突。
4、提供意见发展方法。
5、通过提供默认值快速开始开发。
6、没有单独的 Web 服务器需要。这意味着你不再需要启动 Tomcat,Glassfish 或其他任何东西。
7、需要更少的配置因为没有 web.xml 文件。只需添加用 Configuration 注释的类,然后添加用 Bean 注释的方 法,Spring 将自动加载对象并像以前一样对其进行管理。
8、基于环境的配置使用这些属性,可以将正在使用的环境传递到应用程序:例如命令行参数配置值为 -Dspring.profiles.active={enviornment} 。 在 加 载 主 应 用 程 序 属 性 文 件 后 , Spring 将 在 (application-{environment}.properties)中加载后续的应用程序属性文件。
3、优点
1 、良好的基因
Spring Boot 是伴随着 Spring 4.0 诞生的,因此 Spring Boot 旨在帮助开发 者快速搭建 Spring 框架。Spring Boot 继承了原有 Spring 框架的优秀基因,使 Spring 在使用中更加方便快捷。
2 、简化编码
Spring Boot 会帮助开发者快速启动一个 web 容器,在 Spring Boot 中只需要在 pom 文件中添加一个 spring-boot-starter-web依赖即可, 其中已经包含了多个依赖,包括之前在 Spring 工程中 需要导入的依赖 org.springframework spring-web compile org.springframework spring-webmvc compile 由此可以看出,Spring Boot 大大简化了编码。
3 、简化配置
Spring 虽然使 Java EE 轻量级框架,但配置繁琐。Spring Boot 更多的是采用 Java Config 的方式,对 Spring 进行配置。
4、 简化部署
在使用 Spring 时项目部署时需要在服务器上部署 tomcat,然后把项目打成 war 包扔到 tomcat 里,在使用 Spring Boot 后,不需要在服务器上去部署 tomcat,因为 Spring Boot 内嵌了 tomcat,只需要将项目打成 jar 包,然后 使用 java -jar xxx.jar 一键式启动项目。
5 、简化监控
可以引入 spring-boot-start-actuator 依赖,直接使用 REST 方式来获取进程的运行期性能参数,从而达到监控 的目的,比较方便。但是 Spring Boot 只是个微框架,没有提供相应的服务发现与注册的配套功能,没有外围 监控集成方案,没有外围安全管理方案,所以在微服务架构中,还需要 Spring Cloud 来配合一起使用。
二、具体代码
一、导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> //该依赖包含了spring的多个依赖spring-web、spring-webmvc
二、对应的配置类
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration //表示该类是个配置类 public class JavaConfig { @Bean //表示该方法返回一个 Bean public TestService getTestService() { return new TestService(); } }
这样就把 TestService 作为 Bean 让 Spring 去管理了,在其他地方如果需要使用该 Bean,和原来一样,直接使用@Resource 注解注入进来即可使用,非常方便。
-
另外部署配置方面,原来 Spring 有多个 xml 和 properties 配置,在 Spring Boot 中只需要个 application.yml【如下】即可
三、注解
-
RestController的作用相当于Controller加ResponseBody共同作用的结果,但采用RestController请求方式一般会采用Restful风格的形式。
Controller的作用:声明该类是Controller层的Bean,将该类声明进入Spring容器中进行管理
ResponseBody的作用:表明该类的所有方法的返回值都直接进行提交而不经过视图解析器,且返回值的数据自动封装为json的数据格式
-
get:获取数据时用的请求方式
-
post:增加数据时的请求方式
-
put:更新数据时的请求方式
-
delete:删除数据时的请求方式
-
@RequestMapping("/start") 针对当前类中的所有方法声明名空间
定义@RequestMapping 时如果没有属性,名称则默认名称为 value,value 实际上是 path 属性的别名,只有一个属性 value 时,value 可以省略;如果多个属性时则 value 不能省略。如果不定义 method 请求方法时,则所有的请求方法均可匹配
三、返回 Json 数据
XML 文件的解析
常见的解析工具有 DOM4j、JDOM 等,为了标准化 XML 文件解析,Java 中提出了 JAXP 规范,使用的解析模 型有
-
DOM:将标记语言文档一次性加载进入内存中,在内存中形成一颗 DOM 树(服务器端常用)
-
优点:操作方便,可以对文档进行 CRUD 的所有操作
-
缺点:一次性加载进入内存形成 DOM 树,非常消耗资源
-
-
SAX:逐行读取,基于事件驱动(安卓终端常用)
-
优点:不消耗资源
-
缺点:只能读取,不能增删改
-
早期数据传输使用 xml 作为交互格式,例如 webservice 技术,但是由于 xml 解析比较麻烦,所以现在在项目 开发中,在接口与接口之间以及前后端之间数据的传输都使用 Json 格式,在 Spring Boot 中接口返回 Json 格 式的数据很简单,在 Controller 中使用@RestController 注解即可返回 Json 格式的数据,@RestController 也是 Spring Boot 新增的一个复合注解。
@Target({ElementType.TYPE}) //用于声明注解可以使用在什么地方,Type 表示可以使用在类上 @Retention(RetentionPolicy.RUNTIME) //用于声明注解需要保持到什么阶段,Runtime 表示注解在编译生 成的字节码中一直保持到运行时 @Documented @Controller @ResponseBody public @interface RestController { String value() default ""; }
四、整合通用 Mapper 的开发方法
通用 mapper 就是基于 mybatis 的一款 MyBatis 增强插件,可以提供一些常用增、删、改、查的操作,不需要 重复写一些常用的 sql。简化操作,精简代码,并且达到代码风格统一的目的。它的出现不是为了替代 mybatis, 而是让 mybatis 的开发更方便。
1、添加依赖
<dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>4.2.2</version> </dependency>
2、具体实现
使用通用 mapper 的开发方式,采用注解定义映射关系,自动生成常见的 SQL 语句,不需要 xml 映射元文件
1.表名默认使用类名,驼峰转下划线(只对大写字母进行处理),如 TestUser 默认对应的表名为 test_user
2.表名可以使用@Table(name = "tableName")进行指定,对不符合第一条默认规则的可以通过这种方式指定表名
3.字段默认和@Column 一样,都会作为表字段,表字段默认为 Java 对象的 Field 名字驼峰转下划线形式
4.可以使用@Column(name = "fieldName")指定不符合第 3 条规则的字段名
5.使用@Transient 注解可以忽略字段,添加该注解的字段不会作为表字段使用.
6.建议一定是有一个@Id 注解作为主键的字段,可以有多个@Id 注解的字段作为联合主键.
7.默认情况下,实体类中如果不存在包含@Id 注解的字段,所有的字段都会作为主键字段进行使用(这种效率极 低).
8.实体类可以继承使用,可以参考测试代码中的 tk.mybatis.mapper.model.UserLogin2 类.
9.由于基本类型,如 int 作为实体类字段时会有默认值 0,而且无法消除,所以实体类中建议不要使用基本类型.
10.@NameStyle 注解,用来配置对象名/字段和表名/字段之间的转换方式,该注解优先于全局配置 style,可选值:
normal:使用实体类名/属性名作为表名/字段名
camelhump:这是默认值,驼峰转换为下划线形式
uppercase:转换为大写
lowercase:转换为小写
@Entity //用于声明当前类是一个实体类 @Table(name="tbl_users") // 用于声明当前类所对应的表名称 public class User implements Serializable { @Id //用于声明标识属性,对应表中的主键 @GeneratedValue(strategy = GenerationType.IDENTITY) 声明主键生成策略 private Long id; @Column //如果属性名称和列名称不一致,则需要通过@Column 进行配置对应的列名称 private String username; private String password; private Date birth; private Boolean sex; } //定义 mapper 接口 public interface UserMapper extends BaseMapper<User> { }
五、使用阿里巴巴 FastJson
1、 jackson 和 fastJson 的对比
2、 fastJson 依赖导入
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </dependency>
3 、使用 fastJson 处理 null
使用 fastJson 时,对 null 的处理和 jackson 有些不同,需要继承 WebMvcConfigurationSupport 类或者实现 WebMvcConfiguration 接口,然后覆盖 configureMessageConverters 方法,在方法中可以选择对要实现 null 转换的场景,配置好即可。
@Configuration public class fastJsonConfig extends WebMvcConfigurationSupport { //使用阿里 FastJson 作为 JSON MessageConverter @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); FastJsonConfig config = new FastJsonConfig(); config.setSerializerFeatures( SerializerFeature.WriteMapNullValue, // 保留 map 空的字段 SerializerFeature.WriteNullStringAsEmpty, // 将 String 类型的 null 转成"" SerializerFeature.WriteNullNumberAsZero, // 将 Number 类型的 null 转成 0 SerializerFeature.WriteNullListAsEmpty, // 将 List 类型的 null 转成[] SerializerFeature.WriteNullBooleanAsFalse, // 将 Boolean 类型的 null 转成 false SerializerFeature.DisableCircularReferenceDetect); // 避免循环引用 converter.setFastJsonConfig(config); converter.setDefaultCharset(Charset.forName("UTF-8")); List<MediaType> mediaTypeList = new ArrayList<>(); // 解决中文乱码问题,相当于在 Controller 上的@RequestMapping 中加了个属性 produces = "application/json" mediaTypeList.add(MediaType.APPLICATION_JSON); converter.setSupportedMediaTypes(mediaTypeList); converters.add(converter); } }
4、封装统一返回的数据结构
在实际项目中,除了要封装数据之外,往往需要在返回的 json 中添加一些其他信息,比如返回一些状态码 code 【注意不是 response 的响应状态码】,返回一些 msg 给调用者,这样调用者可以根据 code 或者 msg 做一些 逻辑判断。所以在实际项目中,需要封装一个统一的 json 返回结构存储返回信息。
4.1 定义统一的 json 结构
由于封装的 json 数据的类型不确定,所以在定义统一的 json 结构时需要用到泛型。统一的 json 结构中属性包 括数据、状态码、提示信息即可,构造方法可以根据实际业务需求做相应的添加即可,一般来说,应该有默认的返回结构,也应该有用户指定的返回结构。