使用SpringBoot搭建小型項目,集成mybatis,redis,swagger2,並部署在外部容器中。

一  簡介

  初次接觸springboot,最直觀的感受是搭建項目幾乎不需要任何配置文件,自帶Tomcat容器,節省了很多開發和部署時間,項目也變得更加精簡。

  SpringBoot主要特性:

  1 spring Boot Starter:它將常用的依賴分組進行了整合,將其合併到一個依賴中,這樣就可以一次性添加到項目的Maven或Gradle構建中;

  2 自動配置:Spring Boot 的自動配置特性利用了Spring4對條件化配置的支持,合理的推測應用所需的bean並自動化配置他們;

  3 命令行接口 :   Spring Boot的CLI發揮了Groovy編程語言的優勢,並結合自動配置進一步簡化Spring應用的開發;

  4 Actuator: 它爲Spring Boot應用添加了一定的管理特性

  下面簡單介紹如何創建springboot項目。

二  運行環境

jdk1.8

tomcat8

maven4.0

三  搭建springboot項目

3.1 創建maven項目

  首先創建一個maven項目,如何創建maven項目這裏不多介紹,網上有很多教程。

   項目結構如下圖


3.2 在pom文件中加入springboot相關依賴

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>

     首先在pom中添加一個parent項目,我們讓項目的Maven構建基於Spring Boot starter parent,這樣的話,我們就能受益於Maven的依賴管理功能,對於項目中的很多依賴,就沒有必要明確聲明版本號了,因爲版本號會從parent中繼承得到。

  <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
<!--      <exclusions>
			<exclusion>
			   <groupId>org.springframework.boot</groupId>
			   <artifactId>spring-boot-starter-tomcat</artifactId>
			</exclusion>
		  </exclusions> -->
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
       <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>javax.servlet-api</artifactId>
        </dependency> 
        <!--常用庫依賴-->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.6</version>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>23.0</version>
        </dependency>
        <!--mybatis依賴  -->
		<dependency>
		    <groupId>org.mybatis.spring.boot</groupId>
		    <artifactId>mybatis-spring-boot-starter</artifactId>
		    <version>1.1.1</version>
		</dependency>
		<dependency>
		    <groupId>mysql</groupId>
		    <artifactId>mysql-connector-java</artifactId>
		</dependency>
        <!--阿里 FastJson依賴-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.44</version>
        </dependency>
        <!--阿里 Druid Spring Boot Starter依賴-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.6</version>
        </dependency>
        <!--代碼生成器依賴-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.23</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.5</version>
            <scope>test</scope>
        </dependency>
        <!-- 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>
		<!-- Redis 相關依賴 -->
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

  		<!-- json -->
		<dependency>
			<groupId>taglibs</groupId>
			<artifactId>standard</artifactId>
			<version>1.1.2</version>
		</dependency>
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.3.1</version>
		</dependency>
		<!-- 上傳組件包 -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>
  </dependencies>
  
      <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
     <repositories>
        <repository>
            <id>aliyun-repos</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>aliyun-plugin</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
這是本次項目中所用到的依賴和插件,實際運用中不需要的依賴可自行去掉。
  <modelVersion>4.0.0</modelVersion>
  <groupId>myBootProject</groupId>
  <artifactId>myBootProject</artifactId>
  <packaging>jar</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>myBootProject Maven Webapp</name>
  <url>http://maven.apache.org</url>

pom頭部 將packageing標籤中的war改爲jar

3.3 創建Spring Boot啓動類 Application

@SpringBootApplication
public class Application extends SpringBootServletInitializer{
	
/*	@Override
	protected SpringApplicationBuilder configure(
			SpringApplicationBuilder builder) {
		 builder.sources(Application.class);
		return super.configure(builder);
	}*/
	
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@springBootApplication 註解相當於(默認屬性)@Configuration + @EnableAutoConfiguration + @ComponentScan。由於這些註解一般都是一起使用,spring boot提供了一個統一的註解@SpringBootApplication。

下面分別描述這三個註解的作用

@Configuration標註當前類爲spring的配置文件,通常與@bean註解一起使用,相當於我們以前的xml配置文件。

@EnableAutoConfiguration:自動化配置註解,能夠自動配置spring應用上下文,試圖猜測和配置你想要的bean類。自動配置被設計用來和“Starters”一起更好的工作,但這兩個概念並不直接相關。您可以自由挑選starter依賴項以外的jar包,springboot仍將盡力自動配置您的應用程序。

@ComponentScan:自動掃描指定包下的全部標有@Component的類,並註冊成bean,當然包括@Component下的子註解@Service,@Repository,@Controller。

到目前爲止一個簡單springboot項目已經完成,啓動Application類,便可以運行項目。

四 集成mybatis和Redis

4.1 加入mybatis和redis相關依賴

                <!--mybatis依賴  -->
		<dependency>
		    <groupId>org.mybatis.spring.boot</groupId>
		    <artifactId>mybatis-spring-boot-starter</artifactId>
		    <version>1.1.1</version>
		</dependency>
		<dependency>
		    <groupId>mysql</groupId>
		    <artifactId>mysql-connector-java</artifactId>
		</dependency>
		<!-- Redis 相關依賴 -->
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

4.2 創建application.yml配置文件

文件要放在resource的根目錄下

spring:
  datasource:
      type: com.alibaba.druid.pool.DruidDataSource
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://******:3306/**?useUnicode=true&characterEncoding=UTF-8&useSSL=false
      username: root
      password: **
      initialize: true
  redis:  
      host: ****** 
      port: 6379  
      password: ***
      pool:
        max-active: 8
        max-idle: 8
        min-idle: 0
        max-wait: 10000
mybatis:
   mapper-locations: classpath*:mapper/*Mapper.xml
   type-aliases-package: com.gcx.api.model

yml和properties都可作爲配置文件,properties配置是以鍵值對的形式存儲數據,yml則更像是一種JSON格式。yml的層次感更強。具體使用哪種根據個人喜好。

yml注意事項:yml不能使用tab作爲空位符,只能用空格鍵,冒號後面的空格位數要統一,大小寫敏感。

本項目將mybatis的mapper.xml放在了resource下的mapper文件下

配置文件中配置了mybati和redis的數據源,以及mybatis的映射路徑。項目啓動時會加載改配置文件,從而創建對應上下文。

4.3 添加@MapperScan註解

在Application類上添加此註解

@SpringBootApplication
@MapperScan("com.gcx.api.dao")
public class Application extends SpringBootServletInitializer{
	
/*	@Override
	protected SpringApplicationBuilder configure(
			SpringApplicationBuilder builder) {
		 builder.sources(Application.class);
		return super.configure(builder);
	}*/
	
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

該註解的作用是將mapper類交由spring管理,在需要的時候創建對應的mapper實例,相當於在每個mapper類上加入@Mapper註解。

4.4 創建redis工具類

package com.gcx.api.common.redis;

import java.util.concurrent.TimeUnit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSONObject;
import com.gcx.gcxCommon.model.User;
import com.google.gson.Gson;
/**
 *<p>Title:CacheUtil</p>
 *<p>Description:redis操作模板</p>
 *<p>Company:gcx</p>
 *<p>Author:zhanglin</p>
 *<p>Date:2017年6月21日</p>
 */
@Component("CacheUtil")
public class CacheUtil {
	    @Autowired  
	    private StringRedisTemplate redisTemplate;//redis操作模板
	    
	      
	    public void put(String key, String value) {  
	        if (key==null || "".equals(key)) {  
	            return;  
	        }  
	        redisTemplate.opsForHash().put(key, key, value);  
	    }  
	  
	      
	    public void put(String key, Object value) {  
	        if (key==null || "".equals(key)) {  
	            return;  
	        }  
	        redisTemplate.opsForHash().put(key, key, new Gson().toJson(value));
	        redisTemplate.expire(key, 6000, TimeUnit.SECONDS);
	    }  
	  
	      
	    public <T> T get(String key, Class<T> className) {  
	        Object obj = redisTemplate.opsForHash().get(key, key);  
	        if(obj == null){  
	            return null;  
	        }  
	        redisTemplate.expire(key, 6000, TimeUnit.SECONDS);
	        return new Gson().fromJson(""+obj, className);  
	    }  
	  
	      
	    public String get(String key) {  
	        Object obj = redisTemplate.opsForHash().get(key, key); 
	        if(obj == null){  
	            return null;  
	        }else{  
	            return String.valueOf(obj);  
	        }  
	    } 
	  //============================String操作=================================
	    public void putString(String key,String  value){
	    	redisTemplate.opsForValue().set(key, value, 1000, TimeUnit.SECONDS);
	    }
	    
	    public <T>  User getString(String key,Class<T> className){
	    	String jsonStr = redisTemplate.opsForValue().get(key);  
	    	JSONObject jsonobject = JSONObject.parseObject(jsonStr);
	    	User user= (User)JSONObject.toJavaObject(jsonobject, className);
	    	return  user; 
	    }
	  
	    public void deleteString(String key){
	    	if(key!=null)
		    redisTemplate.delete(key);
	    	
	    }
}

至此該項目已成功集成mybatis和redis,如需其他擴展,springboot也提供了對應的接口,這裏暫不介紹。

五 集成swagger2

5.1 簡介

Swagger 是一款RESTFUL接口的文檔在線自動生成+功能測試功能軟件。

Swagger 是一個規範和完整的框架,用於生成、描述、調用和可視化 RESTful 風格的 Web 服務。總體目標是使客戶端和文件系統作爲服務器以同樣的速度來更新。文件的方法,參數和模型緊密集成到服務器端的代碼,允許API來始終保持同步。Swagger 讓部署管理和使用功能強大的API從未如此簡單。

5.2 添加swagger2相關依賴

        <!-- 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>

5.3 創建SwaggerConfig類

package com.gcx.api.common.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
 *<p>Title:SwaggerConfig</p>
 *<p>Description:Swagger文檔  訪問地址:http://localhost:端口號/項目名/swagger-ui.html</p>
 *<p>Company:gcx</p>
 *<p>Author:zhanglin</p>
 *<p>Date:2018年2月1日</p>
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.gcx.api.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("swagger2 基於 RestFul的  APIs")
                .description("")
                .termsOfServiceUrl("")
                .contact("Change")
                .version("1.0")
                .build();
    }


}

如上代碼所示,通過@Configuration註解,讓Spring來加載該類配置。再通過@EnableSwagger2註解來啓用Swagger2。

再通過createRestApi函數創建Docket的Bean之後,apiInfo()用來創建該Api的基本信息(這些基本信息會展現在文檔頁面中)。select()函數返回一個ApiSelectorBuilder實例用來控制哪些接口暴露給Swagger來展現,本例採用指定掃描的包路徑來定義,Swagger會掃描該包下所有Controller定義的API,併產生文檔內容(除了被@ApiIgnore指定的請求)。

5.4 在controller層和實體類中使用swagger2註解

package com.gcx.api.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.gcx.api.common.base.BaseController;
import com.gcx.api.common.exception.ParameterException;
import com.gcx.api.common.util.MyResult;
import com.gcx.api.common.util.StringUtils;
import com.gcx.api.model.UserGroup;
import com.gcx.api.service.UserGroupService;

/**
 * @author zhanglin
 * @version 創建時間:2018-01-10 12:00:06
 */

@RestController
@Api(value="userGroup",description="羣組")
@RequestMapping("/userGroup")
@Validated
class UserGroupController extends BaseController {


	@Autowired
	UserGroupService  userGroupService;

	// 查詢所有記錄 分頁默認每頁爲10條記錄,查詢全部pageSize傳-1
	@GetMapping
	@ApiOperation(value = "列表",notes="外網調用此接口時,審覈狀態傳3")
	MyResult  list(@Valid UserGroup record,BindingResult br) throws Exception{
		 if(br.hasErrors()){
	            for (ObjectError error : br.getAllErrors()) {
	                System.out.println(error.getDefaultMessage());
	            }
	            return MyResult.ok(br.getAllErrors().get(0).getDefaultMessage());
	        }
		MyResult result=userGroupService.findAllRecords(record);	
		return result;
	}
	
	// 添加記錄
	@ApiOperation(value = "新增")
	@PostMapping
	MyResult add(@RequestBody UserGroup record,HttpServletRequest request) throws Exception{	
	    record.setCreateTime(getNowTime());
		record.setCreateUser(getUserId(request));	
		MyResult result = userGroupService.addRecord(record);				
		return result;
	}

	// 刪除記錄 id
	@ApiOperation(value = "刪除")
	@DeleteMapping("/{tid}")
	MyResult delete(@PathVariable("tid")String tid) throws Exception{
		if(StringUtils.isEmpty(tid))
			throw new ParameterException("參數tid不能爲空,你傳的參數是:"+tid);
		MyResult result = userGroupService.delRecord(tid);
		return result;
	}

	// 修改記錄 id 要修改的屬性
	@ApiOperation(value = "修改")
	@PutMapping
	MyResult update(@RequestBody UserGroup record,HttpServletRequest request) throws Exception{
		if(StringUtils.isEmpty(record.getTid()))
			throw new ParameterException("參數tid不能爲空,你傳的參數是:"+record.getTid());
		if(record.getAuditStatus()==2){
			record.setUpdateTime(getNowTime());
			record.setUpdateUser(getUserName(request));
		}
		MyResult result = userGroupService.updateRecord(record);
		return result;
	}

	// 根據ID查詢詳情 id
	@ApiOperation(value = "查詢詳情")
	@GetMapping("/{tid}")
	MyResult get(@PathVariable("tid")String tid) throws Exception{
	if(StringUtils.isEmpty(tid))
			throw new ParameterException("參數tid不能爲空,你傳的參數是:"+tid);
		MyResult result = userGroupService.findById(tid);
		return result;
	}

}
@ApiModel(value="UserGroup",description="羣組實體類")
public class UserGroup extends BaseEntity {
    @ApiModelProperty(value="羣組ID")
    private String groupId;//羣組ID
    @NotBlank(message="用戶ID不能爲空")
    @ApiModelProperty(value="用戶ID")
    private String userId;//用戶ID
    @NotBlank(message="羣名稱不能爲空")
    @ApiModelProperty(value="羣名稱")
    private String groupName;//羣名稱
}

swagger2常用註解說明

- @Api()用於類;
表示標識這個類是swagger的資源
- @ApiOperation()用於方法;
表示一個http請求的操作
- @ApiParam()用於方法,參數,字段說明;
表示對參數的添加元數據(說明或是否必填等)
- @ApiModel()用於類
表示對類進行說明,用於參數用實體類接收
- @ApiModelProperty()用於方法,字段
表示對model屬性的說明或者數據操作更改
- @ApiIgnore()用於類,方法,方法參數
表示這個方法或者類被忽略
- @ApiImplicitParam() 用於方法
表示單獨的請求參數
- @ApiImplicitParams() 用於方法,包含多個 @ApiImplicitParam

5.5 效果展示


訪問路徑 http://localhost:8080/swagger-ui.html#/

至此所有整合完成

啓動Application類

接口測試


點擊Try it out 測試接口

測試結果


接口訪問成功。

六 在外部容器中部署springboot項目

6.1 將pom文件中的jar改爲war

  <modelVersion>4.0.0</modelVersion>
  <groupId>myBootProject</groupId>
  <artifactId>myBootProject</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>myBootProject Maven Webapp</name>
  <url>http://maven.apache.org</url>

6.2 移除springboot自帶容器

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
          <exclusions>
		<exclusion>
	            <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-tomcat</artifactId>
		</exclusion>
         </exclusions> 
        </dependency>

6.3 加入servlet依賴

       <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>javax.servlet-api</artifactId>
        </dependency> 

6.4 修改Application類

@SpringBootApplication
@MapperScan("com.gcx.api.dao")
public class Application extends SpringBootServletInitializer{
	
	@Override
	protected SpringApplicationBuilder configure(
			SpringApplicationBuilder builder) {
		 builder.sources(Application.class);
		return super.configure(builder);
	}
	
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

在Application類中加入configure方法

至此便可將項目部署到外部容器中

外部容器訪問接口時要加上項目名稱

若需要完整項目請加羣  499950895


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章