1. 程式人生 > >springCloud的一點小總結

springCloud的一點小總結

新公司的框架為spring boot ,cloud 的一整套微服務框架
其實原先也有想學的想法,正好公司給了一段時間去學。所以這裡總結一下。
本篇文章主要總結下關於springboot的一些關鍵點。


環境:JDK8 STS4.9 MYSQL springBoot1.4.1 maven4.0


springBoot給我的感覺是在springMvc的基礎上進一步實現更簡單的程式碼量,配置和部署。
相比而言 如果需要建立一個springMvc ,我需要新建web.xml  配置 application.properties ,pom依賴對應的spring jar 寫一個controller 的對應的介面方法
引入tomcat ,部署到tomcat,啟動tomcat 才可以
而springBoot 只需要在pom檔案裡引入他自己封裝好的依賴,直接在controller寫自己的方法,main函式 執行就可以了
把習慣作為約定的配置,更專注於業務的開發,更少的配置,更低的學習門檻。
缺點是 如果對應spring不熟的話,坑太多了。。自己慢慢排吧。。。


springmvc我就不講了。下面開始一個最簡單的springboot demo


新建maven 專案。
pom裡引入相關jar 

<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>demo</groupId>
  <artifactId>springBootDemo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>


  <name>springBootDemo</name>
  <url>http://maven.apache.org</url>


  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.1.RELEASE</version>
  </parent>
  <dependencies>
  <!-- Spring Boot Basic jar -->
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Spring Boot jdbcTemplate jar-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-jdbc</artifactId>
     </dependency>
      <!-- Spring Boot repository jar -->
     <dependency>  
          <groupId>org.springframework.boot</groupId>  
          <artifactId>spring-boot-starter-data-jpa</artifactId>  
      </dependency>
      <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.1.1</version>
    </dependency>
     <!-- Spring Boot actuator jar -->
    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>  
  </dependencies>
</project>




最基本的依賴為 繼承 spring-boot-starter-parent 為父類,裡面封裝了所有的springboot 的相關依賴,
下面為對應的 web 依賴,必寫,最基本的依賴,如果只寫demo的話 到這裡 兩個依賴就夠了
 jdbc 依賴 , 和Mybatis 二選一作為連線資料庫的做法之一
mybatis依賴,這裡的mybatis版本為1.1.1  1.0.0不支援自帶分頁操作,需要自己實現PageHelper相關外掛實現分頁
actuator依賴,也就是健康監控,可以在專案啟動後通過 /health 檢視專案的執行健康狀態


下面最基本的依賴寫完了 我們就可以寫controller了


import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.domain.PageRequest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
 * Date: 2017年9月15日 上午11:13:03 
 * @author likaile 
 * @desc springBoot 自定義覆蓋springBoot的預設約定配置方式 
 * 主要測試 springboot 連線 Mysql的兩種方式 
 * 1.jdbcTemplate 
 * 2.繼承curdRepository 進行操作
 */
@SpringBootApplication //核心註解為@Configration @ComponentScan  @EnableAuthConfigration(SpringBoot獨有)
@RestController //@Controller + @ResponseBody 表明該類下所有方法返回值為json
public class SampleConfigController {
//引用外部自定義配置的變數 變數在application.properties 載入外部變數 @Value
@Value("${welcome.string}") 
private String welcomeString;
//引用自定義的JDBC 依賴
@Autowired
private JdbcTemplate jdbcTemplate;
//data-jpa mybatis的依賴處理操作
@Autowired
    private TypeInfoRepository typeInfoRepository;

    @RequestMapping("/")
    String home(@RequestParam(value="keyWord", required=false) String keyWord) {
    if(null != keyWord) {
    return keyWord;
    }
        return welcomeString;
    }
    /**
     * Date:2017年9月15日下午1:42:30 
     * @author likaile 
     * @desc jdbc呼叫方法
     */
    @RequestMapping("/jdbcTest")
    List<Map<String, Object>> getStringFromJdbc() {
    String sql = "SELECT ID,TYPE,DESC1  FROM type_info";
    return jdbcTemplate.queryForList(sql);
    }
    /**
     * 
     * Date:2017年9月15日下午2:45:51 
     * @author likaile 
     * @desc jpa呼叫方式
     */
    @RequestMapping("/jpaTest")
    List<TypeInfo> getStringFromJpa() {
    return typeInfoRepository.findById(15L);
    }
    /**
     * 
     * Date:2017年9月15日下午2:46:04 
     * @author likaile 
     * @desc 利用Jpa自帶的分頁 第一個引數為起始位置,第二個引數為獲取的資料
     */
    @RequestMapping("/jpaTestWithPage")
    List<TypeInfo> getStringFromJpaWithPage() {
    return typeInfoRepository.findById(15L,new PageRequest(0, 5));
    }
    /**
     * 
     * Date:2017年9月15日下午2:46:18 
     * @author likaile 
     * @desc 自定義sql實現
     */
    @RequestMapping("/getById")
    TypeInfo getById() {
    return typeInfoRepository.getById(15L);
    }
    /**
     * 
     * Date:2017年9月19日上午11:07:32 
     * @author likaile 
     * @desc main方法 右鍵直接啟動springBoot
     */
    public static void main(String[] args) throws Exception {
        SpringApplication.run(SampleConfigController.class, args);
    }
}


對應的註釋都在程式碼裡,這裡涉及到一個外部變數,SpringBoot的變數和資料庫配置都在application.properties 
這個檔案為預設載入檔案,預設載入地址為根目錄,一般在resource下,
程式碼:
# DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)  
spring.datasource.url=jdbc:mysql://localhost:3306/mysql?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
# server 
server.port=8080
server.session.timeout=10
server.tomcat.uri-encoding=UTF-8


#global variable
welcome.string=hello,${welcome.name}! 
welcome.name=boy


#env 
#spring.profiles.active=dev
#logger
logging.level.org.springframework.web=INFO
logging.file=./springboot.log 


 分別指定了資料庫的地址 
預設載入的tomcat的引數 
自定義的一些全域性變數,變數直接呼叫的方式
多環境之間的配置檔案的地址 例如dev 的話 在同級目錄下會存在一個 application-dev.properties ,具體呼叫會在部署 啟動專案的時候 指定該值 進行動態呼叫
logger為設定日誌檔案的一些引數,這裡如果沒有自定義使用什麼日誌的話,會自動使用自帶的logback


Jdbc不需要dao,mybatis需要相應的mapper,我這裡偷懶用的註解,會在啟動日誌裡報一個warn,No MyBatis mapper was found in '[cn.com.gome.SimpleDemo]' package. Please check your configuration. 不影響做操作


現在貼上 mybaties dao層的程式碼
import javax.transaction.Transactional;


import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;


import org.apache.ibatis.annotations.Select;


import java.lang.Long;
import java.util.List;
/**
 * 
 * Date: 2017年9月15日 下午2:04:34 
 * @author likaile 
 * @desc data-jpa的CrudRepository 會自動根據型別來 進行封裝 對應的欄位的 find insert等方法
 * 第一個引數為返回的物件型別 第二個引數為主鍵的型別
 */
@Transactional
@Repository
public interface TypeInfoRepository extends CrudRepository<TypeInfo, Long> {
List<TypeInfo> findById(Long id,Pageable pageable);
List<TypeInfo> findById(Long id);
@Select("select * from typeInfo where id = #{id}")
TypeInfo getById(Long id);
}




對應的實體類 也需要進行對應的註解 


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;




@Entity  
@Table(name = "typeInfo")
public class TypeInfo {
@Id  
    @GeneratedValue(strategy = GenerationType.AUTO)  
private Long id;
@NotNull
@Column(name="type")
private String type;
@Column(name="desc1")
private String desc1;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDesc1() {
return desc1;
}
public void setDesc1(String desc1) {
this.desc1 = desc1;
}

}



千萬注意 實體類裡的 tableName 中間的大小寫,會把中間的大寫字母自動小寫 前面加個_ 如果不想這樣 需要自定義繼承覆蓋它的對映類實現
啟動專案,訪問localhost:8080
出現 hello,boy!    這是自定義的那個全域性變數
Demo完成。