SpringBoot - 二零一七0421小记

一、SpringBoot使用起来比起SpringMVC更便捷,在注解上的小变化,我记录了下面几个:

@Controller + @ResponseBody   =  SpringMVC中用@RestController来代替前面两个注解,通过这个注解,可以将所有的前端http请求放入SpringBoot的Controller容器中,并返回json格式的数据给前端
@RequestMapping(value={"/hello","/hi"},method=RequestMethod.GET)    =   @GetMapping(value={"/hello","/hi"}),在请求的注解上也有变化,例如例子的用Get请求方式可以直接变成@GetMapping(value={"/hello","/hi"}),当然Post请求就可以是@PostMapping等等。
@...Mapping(value="personDelete/{id}") ----->@PathVariable("id") Integer id 在请求的方法名的参数前写@PathVariable可以获取到请求链接中的参数,如请求http://localhost:8080/personDelete/1024,可以获取到id的值为1024
@...Mapping(value="findByName") ------> @RequestParam(value="name",required=false) String name 同样,可以通过@RequestParam来获取请求发过来的参数,value值就是要获取的参数的name

二、SpringBoot可以直接对操作数据库中的值进行验证,如:

表单验证
@Min(value=18,message="未成年")    加在实体Entity类的属性上,表示获取的值最小为18

@Valid Person person,BindingResult bindingResult     Controller的 某一个方法上(作为参数),验证结果保存在BindingResult里可通过下面的方法来获取
if(bindingResult.hasErrors()){
            System.out.println(bindingResult.getFieldError().getDefaultMessage());//获取到错误信息 ,当然,也可以返回给前端去,这里获取的值就是“未成年”
            return null;
        }

三、SpringBoot的AOP也是挺好用的,通过我对Spring的了解,似乎SpringBoot和Spring的AOP差不多,到底还是一家人儿。

package com.yyc.aspect;

import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

@Aspect
@Component
public class HttpAspect {

    private final static Logger logger= LoggerFactory.getLogger(HttpAspect.class);

    @Pointcut("execution(public * com.yyc.controller.PersonController.*(..))")
    public void log(){
    }

    @Before("log()")
    public void doBefore(JoinPoint joinPoint){ //可以获取到前端发送请求时的一些参数
//        logger.info("1111111111");

        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request=attributes.getRequest();
        //url
        logger.info("url={}",request.getRequestURI());
        //method
        logger.info("method={}",request.getMethod());
        //ip
        logger.info("ip={}",request.getRemoteAddr());
        //类方法
        logger.info("classMethod={}",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());

        //参数
        logger.info("args={}",joinPoint.getArgs());

    }

    @After("log()")
    public void doAfter(){
        logger.info("2222222222");
    }

    @AfterReturning(returning="object",pointcut="log()")
    public void doAfterReturning(Object object){//也可以获取到前端请求后,SpringBoot返回给客户端的一些数据
        logger.info("response={}",object.toString());
    }
}

四、在SpringBoot中同样可以对异常信息进行统一处理,比如,我们有一些方法执行后要给客户端返回一些必要的信息,但是呢,这些信息不统一,很分散,可能对不同的结果返回不同的值,这时候统一异常处理就派上用场了,这样类处理就比较方便了。比如这个方法:

    public void getAge(Integer id) throws Exception{
        Person person = personRepository.findOne(id);
        Integer age=person.getAge();
        if(age < 10 ){
            //返回  你还在上小学吧
            throw new PersonException(ResultEnum.PRIMARY_SCHOOL);//这里用了一个自定义异常,用到枚举来对返回的东西进行封装
        }else if(age >= 10&& age<=16){
            //返回 你可能还在上初中
            throw new PersonException(ResultEnum.MIDDLE_SCHOOL);
        }
    }
    

自定义异常类来捕获异常,注意要继承RuntimeException :

package com.yyc.exception;

import com.yyc.enums.ResultEnum;

public class PersonException extends RuntimeException {

    private static final long serialVersionUID = 1L;
    private Integer code;

    public PersonException(ResultEnum resultEnum) {
        super(resultEnum.getMsg());
        this.code=resultEnum.getCode();
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

}

异常的统一管理(照我的理解,就是可以通过这个类来对异常进行统一管理,当产生异常可以返回给客户端json数据):

package com.yyc.handle;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import com.yyc.entity.Result;
import com.yyc.exception.PersonException;
import com.yyc.utils.ResultUtil;

@ControllerAdvice
public class ExceptionHandle {

    private final static Logger logger= LoggerFactory.getLogger(ExceptionHandle.class);

    @ExceptionHandler(value=Exception.class)
    @ResponseBody
    public Result<?> handle(Exception e){
        if(e instanceof PersonException){
            return ResultUtil.error(((PersonException) e).getCode(), e.getMessage());
        }else{
            logger.error("【系统异常】{}",e);
            return ResultUtil.error(-1, "内置错误");
        }
    }
}

五、我们知道,客户端请求,希望的是要我们服务端返回一个固定的json格式,方便解析,一个Result类可以对返回的数据的数据格式定义:

package com.yyc.entity;

public class Result<T> {

    private Integer code;//错误码
    private String msg;//提示信息

    private T data;//具体的内容

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

前面有调用的ResultUtil类,这个类对上面的Result类进行使用和封装,以便其它地方调用:

package com.yyc.utils;

import com.yyc.entity.Result;

public class ResultUtil {

    public static Result success(Object obj){
        Result result=new Result();
        result.setCode(1);
        result.setMsg("成功");
        result.setData(obj);
        return result;
    }

    public static Result success(){
        return success(null);
    }

    public static Result error(Integer code,String msg){
        Result result=new Result();
        result.setCode(0);
        result.setMsg(msg);
        result.setData(null);
        return result;
    }
}

六、SpringBoot中没有xml来配置,默认用properties文件来配置,但是建议用yml文件配置:

application.yml:

spring:
  profiles:
    active: dev   就像html中的include一样,可以通过spring profiles active来激活或导入另一个yml文件,如:application-dev.yml
 //对数据库的一些配置
  datasource:
    username: root
    password: 123
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/springboot
  jpa:
    database-platform: org.hibernate.dialect.MySQL5Dialect
    hibernate:
      ddl-auto: update
    show-sql: true

七、maven的pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.yyc</groupId>
    <artifactId>springboot_1</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>

    <name>springboot_1</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

    <dependency><!--springBoot的热部署插件,devtools,加入这个可以不用每次修改代码重启服务-->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

好了,这就是这两天看springboot的一些收获了吧。就小记一下。

时间: 2024-10-10 17:02:03

SpringBoot - 二零一七0421小记的相关文章

再见,我的二零一七

长话短说就直接说说未来一年的个人计划吧 一.做一个基于微服务和消息队列的高可用数据同步装置,大致需求如下 满足不同关系型数据库之间的数据传递 满足m:n(多对多)端的发送和接收 通信接口使用RESTful架构 适应高并发和分布式的使用场景 倒没什么特别的目的,就是觉得应该写点什么作为对目前个人能力的总结. 二.学习C++和Python语言 之前就有做过C++的项目,虽然只接触了些皮毛,但确实很喜欢这门语言(感觉Java好傻).打算在新的一年里能重新系统的学习一下并写一两个小项目.至于Python

Unity3D游戏开发从零单排(七) - NetworkView的Demo

提要 今天做了一个移动设备的网络通信demo,分两个部分,一个是网络连接,一个是数据通信. 需要两台Android设备A,B.A作客户端,B作服务端. 最终的效果是玩家控制设备A中的方块,B中的方块也一起动,同时在A的加速度传感器的信息在B中也实时更新. 网络连接 首先两台设备要联网,且IP在同一个网段,比如连接在同一个路由上,或者通过笔记本发出wifi信号,然后把设备连在上面. 在Unity3d中创建一个新工程,在场景中创建两个空物体,一个Client,一个Server. 在client创建一

SpringBoot(二)CentOS部署SpringBoot项目从0到1

在之前的博文<详解intellij idea搭建SpringBoot>介绍了idea搭建SpringBoot的详细过程, 并在<CentOS安装Tomcat>中介绍了Tomcat的安装,前面几篇文章实际上已经充分准备好了部署Linux的必要条件.那么今天来看看如何在CentOS部署SpringBoot,让你的SpringBoot在服务器上跑起来. vLinux部署springboot 从0到1,5步走,在Linux Tomcat部署springboot: 1. <CentOS

SpringBoot(二十六)整合Redis之共享Session

集群现在越来越常见,当我们项目搭建了集群,就会产生session共享问题.因为session是保存在服务器上面的.那么解决这一问题,大致有三个方案,1.通过nginx的负载均衡其中一种ip绑定来实现(通过ip绑定服务器其中一台,就没有集群概念了):2.通过cookie备份session实现(因为cookie数据保存在客户端,不推荐;3.通过redis备份session实现(推荐); 学习本章节之前,建议依次阅读以下文章,更好的串联全文内容,如已掌握以下列出知识点,请跳过: SpringBoot(

开始系列教程:Java零基础七天入门

本教程雄心勃勃,保证七天之内从零基础开始,学会java,达到什么程度呢? 很简单:达到之后可以自学android和J2EE开发的程度. 不一样的思路,敬请期待...

二零一五年六月二十八日夜的精子战争

之前一直没有介绍自己读过的书,这次就介绍一本.读它已经是半个多月前的事情了,我躺在深圳开往杭州的火车上.借着床头刺眼的灯光,书一页页的翻过.吃掉送来点心.面包以及牛肉干.咸菜,用右手擦了擦嘴巴. 之前的我一直不太注意外面的世界,当真正的想要接触外界时.遇到一些“夸人都不会夸”,“多么没有存在感”之类的话.我开始回想自己错过的瞬间,回想失败的经验被视为的实验.没有丰富的情感便开始自己主动搭建真实的幻境. 由女性搭建起的战场,存在各式各样的繁殖策略.奋力的精子,在酒精的作用下游得更远.老去的精子,在

SpringBoot(二) :web综合开发

前言: 看博文,感觉作者对Spring Boot框架已经有了很深的认识,有一种高屋建瓴的感觉. 原文出处: 纯洁的微笑 上篇文章介绍了Spring boot初级教程:spring boot(一):入门篇,方便大家快速入门.了解实践Spring boot特性:本篇文章接着上篇内容继续为大家介绍spring boot的其它特性(有些未必是spring boot体系桟的功能,但是是spring特别推荐的一些开源技术本文也会介绍),对了这里只是一个大概的介绍,特别详细的使用我们会在其它的文章中来展开说明

二零一五年(一月份)

2015年01月04日 1.  tableView刷新,显示20条(手势向上拖,再加载20条). 2. SegmentedContnrol使用方法. 3. 第一次运行APP,显示欢迎页,最后一页有个Button,点击进入APP. (SB怎么弄?),在设置可以点击[欢迎页]可重复显示. 4. IOS6,7,8二维码. 5. APP内置浏览器.(找第三方) 6. tableView自定义Cell. 7.  IOS本地化存储. 8.

正则表达式(二) - 零宽断言与懒惰匹配以及平衡组

小括号的作用 分类 代码/语法 说明 捕获 (exp) 匹配exp,并捕获文本到自动命名的组里 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) (?:exp)   匹配exp,不捕获匹配的文本,也不给此分组分配组号 零宽断言 (?=exp) 匹配exp前面的位置 (?<=exp)  匹配exp后面的位置 (?!exp)  匹配后面跟的不是exp的位置 (?<!exp) 匹配前面不是exp的位置 注释 (?#comment)