Springboot入门学习

Springboot简介

spring 的优缺点分析

Spring为企业提供了一种相堆简单的方法,通过依赖注入和面向切面编程,用简单的对消实现了EJB的功能。

缺点:1.虽然spring的组件是 轻量级的,但他的配置却是重量级的

         2..所有的配置二都代表了开始是的损耗,因为在思考spring的特性配置和解决业务问题之间需要进行思维切换。

       3. 除此之外,项目的依赖管理也是一样耗时耗力,在环境搭建时,需要分析引入那些库的坐标,而且还需要分析导入阈值依赖关系的其他库的坐标,一旦选错了依赖版本,可能会造成一些难以发现的bug。

Springboot对spring的缺点进行了优化和改善,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维切换,全身心的投入到逻辑业务的编写中,从而大大提高了开发的效率。

Springboot的特点

  1. 基于spring开发提供更快的入门 体验
  2. 开箱即可用,没有代码生成,也无需xml配置,同时也可以修改默认值来满足特定需求
  3. 提供了一些大型项目中常见的非功能特性,如嵌入式服务器,安全 指标、健康监测、外部配置
  4. Springboot不是对spring功能上的增强,而是提供了一种快速使用spring的方式

Springboot 的核心功能

起步依赖

 起步依赖本质上是一个maven项目模型,定义了对其他库的传递依赖,这些东西加起来一起支持某项功能

简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能

 

自动配置

Springboot 的自动配置时一个运行时(更准确的说,是应用程序启动)的过程,考虑了众多因素,才决定spring配置应该用哪个,不该用哪个,该过程是spring自动完成的。

 

Spring boot 可以快速开发,微服务模块,

简化j2ee开发,整个spring技术栈的整合(Springmvc spring)

整个j2ee技术的整合

SpringBoot 快速使用

点击next,选择web

点击finish,完成

 

 

注解解释:

@SpringBootApplication //当前类是springboot的引导类

 

 

 

 

Springboot热部署:更新代码后不需要重新启动

<!--热部署配置-->

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-devtools</artifactId>

        </dependency>

Springboot的配置文件

Springboot是基于约定的,所以很多配置都有默认值,但如果想用自己配置替换掉默认配置的话可以使用application.properties或者application.yml进行配置

Springboot 默认从resources目录下加载application.properties或者application.yml文件,

Application.yaml配置语法

##普通数据的配置

name: zhangsan

##对象的配置

person:

  name: zhangsan

  age: 18

  addr: beijing

##行内对象配置

person: {name: zhangsan,age: 18}

 

 

##配置集合或者数组

city:

  - beijing

  - tianjin

  - shanghai

city: [beijing,tianjin,shanghai]

 

##配置集合或者数组 对象

student:

  - name: tom

    age: 18

  - name: lucy

    age: 19

student: [{name: tom,age: 19},{}]

 

##map配置

map:

  key1: value1

  key2: value2

 配置文件与配置类的映射方式

使用注解@Value映射

在application.properties 配置如下

 Person:

     Name: zhangsan

     Age: 18

 

实体bean代码如下

@Controller
public class SpringbootController {
   
@Value("${person.name}")
   
private String name;
   
@Value("${person.age}")
   
private String age;

  @RequestMapping("/quick2")
   
@ResponseBody
   
public String quick(){
   
//获取配置 文件的信息
     
return name+" age="+age;
   
}
}

方法二:

@Controller

@ConfigurationProperties(prefix = "person")

  public class SpringbootController2 {

      private String name;

      private int age;

  

   @RequestMapping("/quick3")

   @ResponseBody

  public String quick3(){

    return name+" age="+age;

  }

}

 

使用随机数

# 随机字符串

  com.didispace.blog.value=${random.value}

  # 随机int

  com.didispace.blog.number=${random.int}

  # 随机long

  com.didispace.blog.bignumber=${random.long}

  # 10以内的随机数

  com.didispace.blog.test1=${random.int(10)}

  # 10-20的随机数

  com.didispace.blog.test2=${random.int[10,20]}

 

 

Spring boot 多环境配置

在开发springboot应用时,通常同一套程序会被应用和安装到几个不同的环境,对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同的环境配置文件,在通过打包命令指定需要打包的内容之后进行区分打包,springboot也不例外,甚至更为简单。

在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:

  • application-dev.properties:开发环境
  • application-test.properties:测试环境
  • application-prod.properties:生产环境

至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。

如:spring.profiles.active=test就会加载application-test.properties配置文件内容。

 

Springboot构建RESTful API与单元测试

Springboot集成mybatis

注解说明

@Controller:修饰class,用来创建处理http请求的对象

@RestController Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody配合,如果直接使用@RestController就不需要在配置@Responsebody(用于读取请求体body的数据,通过httpMessageConverter解析绑定到对象中)。

@RequestMapping 配置url映射

    Method –指定请求的方法类型

    Value 指定实际的请求地址

    Consumes 指定处理请求的提交内容类型

   

第一步 在pom中添加mybatis的起步依赖

  <!--mybatis起步依赖-->

        <dependency>

            <groupId>org.mybatis.spring.boot</groupId>

            <artifactId>mybatis-spring-boot-starter</artifactId>

            <version>1.3.2</version>

        </dependency>

 

        <!--mysql连接驱动-->

        <dependency>

            <groupId>mysql</groupId>

            <artifactId>mysql-connector-java</artifactId>

        </dependency>

 

<!--mybatis自动生成代码插件-->

        <plugin>

            <groupId>org.mybatis.generator</groupId>

            <artifactId>mybatis-generator-maven-plugin</artifactId>

            <version>1.3.6</version>

            <configuration>

                <!-- 是否覆盖,true表示会替换生成的JAVA文件,false则不覆盖 -->

                <overwrite>true</overwrite>

            </configuration>

         

        </plugin>

 

 

第二步在src/main/resources中添加generatorConfig.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE generatorConfiguration

        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"

        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

    <!-- 导入配置文件 -->

    <properties resource="application.properties"/>

 

    <!-- defaultModelType="flat" 设置复合主键时不单独为主键创建实体 -->

    <context id="MySql" defaultModelType="flat">

 

        <!-- 生成的POJO实现java.io.Serializable接口 -->

        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />

 

        <!--注释-->

        <commentGenerator>

            <!-- 将数据库中表的字段描述信息添加到注释 -->

            <property name="addRemarkComments" value="true"/>

            <!-- 注释里不添加日期 -->

            <property name="suppressDate" value="true"/>

        </commentGenerator>

        <!-- 数据库连接,直接通过${}读取application.properties里的配置 -->

        <jdbcConnection

                driverClass="${spring.datasource.driver-class-name}"

                connectionURL="${spring.datasource.url}"

                userId="${spring.datasource.username}"

                password="${spring.datasource.password}"/>

 

        <!-- 生成POJO对象,并将类放到com.songguoliang.springboot.entity包下 -->

        <javaModelGenerator targetPackage="com.cheng.boot_mybatis.pojo"

                            targetProject="src/main/java">

            <!-- 是否允许子包,即targetPackage.schemaName.tableName -->

            <property name="enableSubPackages" value="false"/>

            <!-- 是否对model添加 构造函数 -->

            <property name="constructorBased" value="false"/>

            <!-- 是否对类CHAR类型的列的数据进行trim操作 -->

            <property name="trimStrings" value="true"/>

            <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->

            <property name="immutable" value="true"/>

        </javaModelGenerator>

        <!-- 生成mapper xml文件,并放到resources下的mapper文件夹下 -->

        <sqlMapGenerator targetPackage="mapper"  targetProject="src/main/resources">

            <property name="enableSubPackages" value="false"/>

        </sqlMapGenerator>

 

 

        <!-- 生成mapper xml对应dao接口,放到com.songguoliang.springboot.mapper包下-->

        <javaClientGenerator targetPackage="com.cheng.boot_mybatis.mapper" targetProject="src/main/java" type="XMLMAPPER">

            <property name="enableSubPackages" value="false" />

        </javaClientGenerator>

 

        <!-- table标签可以有多个,至少一个,tableName指定表名,可以使用_和%通配符 -->

        <table tableName="city" domainObjectName="CityPoj" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">

            <!-- 是否只生成POJO对象 -->

            <property name="modelOnly" value="false"/>

            <!-- 数据库中表名有时我们都会带个前缀,而实体又不想带前缀,这个配置可以把实体的前缀去掉 -->

            <domainObjectRenamingRule searchString="^Tbl" replaceString=""/>

        </table>

    </context>

</generatorConfiguration>

逆向生成代码

成功之后目录结构

第三步:修改application.properties并编写controller代码

 
 
 
@RestController

@RequestMapping("/city")

  public class CityController {

  @Autowired

  private CityPojMapper cityPojMapper;

  

  @RequestMapping(value = "/list.do",method = RequestMethod.GET)

  public List<CityPoj> getAll(){

  

    return cityPojMapper.selectAll();

  }

  @RequestMapping(value="/",method = RequestMethod.POST)

  public String postCity(@ModelAttribute CityPoj city){

    //处理"/city/"post请求,用来创建city

    //除了@ModelAttribute绑定指定参数外,还可以通过RequestParam从页面中传递参数

    cityPojMapper.insert(city);

    return "success!!!";

  }

  @RequestMapping(value="/{id}",method=RequestMethod.GET)

  public CityPoj getCity(@PathVariable int id){

    //处理"/city/{id}"get请求,用来获取urlid值的city信息

    //urlid可通过@Pathvariable绑定到函数的参数中

    return cityPojMapper.selectByPrimaryKey(id);

  }

  

  @RequestMapping(value="/",method=RequestMethod.PUT)

  public String putCity(@ModelAttribute CityPoj city){

    //更新city值

    CityPoj cityPoj=cityPojMapper.selectByPrimaryKey(city.getId());

    cityPoj.setName(city.getName());

    cityPoj.setCountrycode(city.getCountrycode());

    cityPoj.setDistrict(city.getDistrict());

    cityPoj.setPopulation(city.getPopulation());

    cityPojMapper.updateByPrimaryKey(cityPoj);

    return "sucess";

  }

  @RequestMapping(value="/{id}",method = RequestMethod.DELETE)

  public String deleteCity(@PathVariable int id){

  

    cityPojMapper.deleteByPrimaryKey(id);

    return "sucess!!!";

  

  }

  

  

}
注意:在mapper类中增加@Mapper注解

 

第四步测试

打开postman或者使用Google中postman插件进行测试

更新city信息:

##更新city信息

#put

localhost:8080/city/?id=1&name=kabul&countrycode=AFG&district=District&population=2000000

##查看全部city信息

#get

localhost:8080/city/list.do

##查看指定idcity信息

##get

localhost:8080/city/1

##删除指定id的city

##delete

localhost:8080/city/1

##增加一条city信息

#post

localhost:8080/city/?id=1&name=kabul&countrycode=AFG&district=District&population=17800000

单元测试

在src/test中增加单元测试

Swagger2构建API文档

Swagger2,可以轻松的整合到Spring Boot中,并与Spring MVC程序配合组织出强大RESTful API文档。它既可以减少我们创建文档的工作量,同时说明内容又整合入实现代码中,让维护文档和修改代码整合为一体,可以让我们在修改代码逻辑的同时方便的修改文档说明。另外Swagger2也提供了强大的页面测试功能来调试每个RESTful API。具体效果如下图所示:

第一步 在pom中添加swagger2的依赖

<dependency>

    <groupId>io.springfox</groupId>

    <artifactId>springfox-swagger2</artifactId>

    <version>2.2.2</version>

</dependency>

<dependency>

    <groupId>io.springfox</groupId>

    <artifactId>springfox-swagger-ui</artifactId>

    <version>2.2.2</version>

</dependency>

配置Swagger2配置类

在Application.java的同级目录下创建Swagger2

@Configuration

@EnableSwagger2

  public class Swagger2 {

    @Bean

    public Docket createResApi(){

      return new Docket(DocumentationType.SWAGGER_2)

       .apiInfo(apiInfo())

       .select()

       .apis(RequestHandlerSelectors.basePackage(""))

       .paths(PathSelectors.any())

       .build();

    }

    private ApiInfo apiInfo() {

      return new ApiInfoBuilder()

       .title("Spring Boot中使用Swagger2构建RESTful APIs")

       .description("相忘于江湖")

       .termsOfServiceUrl("/")

       .contact("相忘于江湖")

       .version("1.0")

       .build();

    }

  

}

如代码随时,通过@configuration注解让spring来加载该类配置,在通过@EnableSwagger2注解来启用Swagger2.

在通过creatRestApi函数创建Docket的bean后,apiInfo()用来创建该Api的基本信息(这些基本信息hi展现在文档页面中)。Select函数返回一个apiSelectorBuilder实例来控制那些接口暴露给swagger展现。

添加文档内容

在controller方法上通过@ApiOperation注解来给Api增加说明,通过@ApiImplicitParams、@ApiImplicitParam注解增加参数说明

   @ApiOperation(value="更新用户详细信息", notes="根据urlid来指定更新对象,并根据传过来的user信息来更新用户详细信息")

      @ApiImplicitParams({

              @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long"),

              @ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")

      })

 

@ApiOperation(value="获取用户详细信息", notes="根据urlid来获取用户详细信息")

      @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long")

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值