Springboot简介
spring 的优缺点分析
Spring为企业提供了一种相堆简单的方法,通过依赖注入和面向切面编程,用简单的对消实现了EJB的功能。
缺点:1.虽然spring的组件是 轻量级的,但他的配置却是重量级的
2..所有的配置二都代表了开始是的损耗,因为在思考spring的特性配置和解决业务问题之间需要进行思维切换。
3. 除此之外,项目的依赖管理也是一样耗时耗力,在环境搭建时,需要分析引入那些库的坐标,而且还需要分析导入阈值依赖关系的其他库的坐标,一旦选错了依赖版本,可能会造成一些难以发现的bug。
Springboot对spring的缺点进行了优化和改善,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维切换,全身心的投入到逻辑业务的编写中,从而大大提高了开发的效率。
Springboot的特点
- 基于spring开发提供更快的入门 体验
- 开箱即可用,没有代码生成,也无需xml配置,同时也可以修改默认值来满足特定需求
- 提供了一些大型项目中常见的非功能特性,如嵌入式服务器,安全 指标、健康监测、外部配置
- 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 方法二: @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请求,用来获取url中id值的city信息 //url中id可通过@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="根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息") @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long"), @ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User") })
@ApiOperation(value="获取用户详细信息", notes="根据url的id来获取用户详细信息") @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long") |