之前接手的一個項目中,用SpringBoot快速搭建小型的restful服務,很方便,加快了不小的開發效率。
第一次將SpringBoot應用到實際項目中,也踩了不少的坑,作為新人收獲不小。
SpringBoot的介紹就不說了,百度很多,復制粘貼過來也沒什么意義。
一、環境
構建工具:Maven(怎么用請百度)
JDK:這里使用1.8
IDE:idea
二、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.myspringboot.QuickService</groupId> <artifactId>QuickService</artifactId> <version>ver_20170811</version> <packaging>jar</packaging> <name>QuickService</name> <description>SpringBoot quick service</description> <!-- Inherit defaults from Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>4.3.6.RELEASE</spring.version> <start-class>com.myspringboot.QuickService.QuickServiceApplication</start-class> <java.version>1.8</java.version> </properties> <!-- Package as an executable JAR --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.5.2.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> <!-- 這里是為了添加自己提供的jar包 --> <resources> <resource> <directory>${basedir}/src/lib</directory> <targetPath>BOOT-INF/lib/</targetPath> <includes> <include>**/*.jar</include> </includes> </resource> <resource> <directory>${basedir}/src/main/resources</directory> <filtering>true</filtering> <includes> <include>**/application*.yml</include> <include>**/application*.yaml</include> <include>**/application*.properties</include> </includes> </resource> <resource> <directory>${basedir}/src/main/resources</directory> <excludes> <exclude>**/application*.yml</exclude> <exclude>**/application*.yaml</exclude> <exclude>**/application*.properties</exclude> </excludes> </resource> </resources> </build> <dependencies> <!-- 自己提供的jar包,放在了src/lib目錄下,根據實際情況而定 --> <dependency> <groupId>src.lib</groupId> <artifactId>alarm</artifactId> <version>1.0.0</version> <scope>system</scope> <systemPath>${project.basedir}/src/lib/xxxx.jar</systemPath> </dependency> <!-- spring boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <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> <!--SpringBoot 使用 JDBCTemplate 引用下面這個包才會自動注入--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!-- spring boot --> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.10</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.1</version> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.1</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-exec</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>commons-pool</groupId> <artifactId>commons-pool</artifactId> <version>1.6</version><!-- ԭ±¾ʹԃµŊű.2°汾 --> </dependency> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> </dependency> <dependency> <groupId>jaxen</groupId> <artifactId>jaxen</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.jvnet.opendmk</groupId> <artifactId>jmxremote_optional</artifactId> <version>1.0_01-ea</version> </dependency> <dependency> <groupId>javax.management</groupId> <artifactId>jmxri</artifactId> <version>1.2.1</version> <type>pom</type> </dependency> <dependency> <groupId>com.sun.jdmk</groupId> <artifactId>jmxtools</artifactId> <version>1.2.1</version> <type>pom</type> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.3</version> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>mchange-commons-java</artifactId> <version>0.2.10</version> </dependency> <dependency> <groupId>ojdbc</groupId> <artifactId>ojdbc</artifactId> <version>6</version> </dependency> <dependency> <groupId>org.fusesource</groupId> <artifactId>sigar</artifactId> <version>1.6.4</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.2.12</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.2.11</version> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> </dependencies> <!-- Allow access to Spring milestones and snapshots --> <!-- (you don't need this if you are using anything after 0.5.0.RELEASE) --> <repositories> <repository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </pluginRepository> <pluginRepository> <id>central</id> <name>Maven plugin</name> <url>htpp://repo1.maven.org/maven2</url> <layout>default</layout> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>false</enabled> </releases> </pluginRepository> <pluginRepository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories> </project>
由於項目需求用到了不少依賴,全貼出來了,根據自己的情況進行調整吧。
三、主要配置
1. QuickServiceApplication.java
1 package com.myspringboot.QuickService; 2 3 import org.apache.commons.dbcp.BasicDataSource; 4 import org.apache.logging.log4j.LogManager; 5 import org.apache.logging.log4j.Logger; 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.boot.SpringApplication; 8 import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 9 import org.springframework.context.annotation.Bean; 10 import org.springframework.context.annotation.ComponentScan; 11 import org.springframework.context.annotation.Configuration; 12 import org.springframework.core.env.Environment; 13 14 import javax.sql.DataSource; 15 16 @EnableAutoConfiguration 17 @ComponentScan 18 @Configuration 19 public class QuickServiceApplication { 20 21 public static void main(String[] args) { 22 Logger logger = LogManager.getLogger(QuickServiceApplication.class.getName()); 23 24 25 System.out.println("*****************************************************"); 26 System.out.println("************QuickService***********"); 27 System.out.println("*****************************************************"); 28 29 logger.info("===========>QuickService<==========="); 30 SpringApplication.run(QuickServiceApplication.class, args); 31 32 } 33 34 // 配置數據庫源 35 @Autowired 36 private Environment env; 37 38 @Bean 39 public DataSource dataSource() { 40 41 BasicDataSource dataSource = new BasicDataSource(); 42 43 dataSource.setUrl(env.getProperty("spring.datasource.url")); 44 dataSource.setUsername(env.getProperty("spring.datasource.username")); 45 46 // 解密前的數據庫密碼 47 String desPwd = env.getProperty("spring.datasource.password").trim(); 48 49 System.out.println("username:" + env.getProperty("spring.datasource.username") + 50 ", pwd:" + desPwd + ", url:" + env.getProperty("spring.datasource.url")); 51 52 // 解密數據庫密碼 53 String password = NLDes.decrypt(desPwd); 54 55 System.out.println("after decrypt, password: " + password); 56 57 dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name")); 58 dataSource.setPassword(password); 59 60 return dataSource; 61 62 } 63 }
注意53行,這是對application.properties文件中數據庫的密碼進行解密操作,這個根據個人情況修改。
2. Restful風格的服務接口
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.testng.collections.Lists; import java.util.List; /** * 服務接口 * */ @RestController public class CloudService { private Logger logger = LogManager.getLogger(CloudService.class.getName()); @Autowired private Handler handler; /** * 處理外部http請求,將請求體的Json字符串轉化為實體 * * @return */ @RequestMapping(value = "/fm", method = RequestMethod.POST, produces = "application/json;charset=UTF-8") public List<ResultModel> dealFmRequest(@RequestBody CloudModel cloudModel) { // 處理結果實體 List<ResultModel> resultModelList = Lists.newArrayList(); ..... return resultModelList; } }
加個@RestController注解即可。另外有用到其它類的對象,可用@Autowired注解進行注入,注意的要注入的類必須有@Component注解,否則Spring將無法發現並裝載指定的類。
我這邊由於需求,需要請求體的json字符串自動轉換成實體, 注意字符編碼問題以及Json到實體Bean的結構映射問題。
注意,CloudService.java 與 QuickServiceApplication.java處於同一個包內
3. application.properties
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:testdb
spring.datasource.username=mydb
spring.datasource.password=6FD549E05C528370
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
server.port=8181
log4j配置文件與application.properties文件都放在resource文件夾下。
四、啟動腳本
提供個啟動腳本給各位參考
1 #!/usr/bin/env bash 2 cd /.../QuickService 3 4 UCAGENT=. 5 UCAGENT_CP="." 6 7 for jarfile in $UCAGENT/lib/*.jar; do 8 UCAGENT_CP=$UCAGENT_CP:$jarfile 9 done 10 11 echo $UCAGENT_CP 12 13 java -Xbootclasspath/a:$UCAGENT_CP -jar QuickService.jar --spring.config.location=/..../application.properties > /dev/null & 14 15 echo "start QuickService ok"
第一行指定了jar包所在的路徑,13行運行時,用外部application.properties文件覆蓋了jar包內部的配置文件,畢竟要打開jar包修改太麻煩了。
只羅列了部分步驟,還有好多細節木有提供,不過網上教程也挺多,個人也比較懶,不再贅述。