【轉】Spring Boot 構建應用——快速構建 Spring Boot 應用

Spring Boot 簡化了 Spring 應用開發,不須要配置就能運行 Spring 應用,Spring Boot 的自動配置是經過 Spring 4.x 的條件註解 @Conditional 來實現的,@Conditional 根據特定條件來控制 bean 的建立行爲。Spring Boot 默認會使用內置的 Tomcat,並支持 Spring MVC、RESTful 服務。新建 Spring Boot 項目很簡單,IntelliJ IDEA 在 New Project 中選擇 Spring Initializr,而後組件選擇 Web (集成 Spring MVC 框架) 便可建立成功。Spring Boot 經過 Starter 來提供系統級服務,Spring Boot 已經提供了一系列的 Starter,下表是 Spring Boot 提供的經常使用 Starter:javascript

名稱 做用
spring-boot-starter-web Web開發支持,默認使用Tomcat8
spring-boot-starter-aop AOP開發支持,使用AspectJ
spring-boot-starter-test 包含JUnit、Spring Test、Hamcrest、Mockito等測試工具
spring-boot-starter-jdbc Spring JDBC
spring-boot-starter-cache 緩存,支持多種緩存方式,如本地的、Redis、Ehcache等
spring-boot-starter-activemq 消息集成ActiveMQ支持
spring-boot-starter-amqp 消息集成AMQP協議支持,如支持RabbitMQ
spring-boot-starter-web-services webservice支持
spring-boot-starter-websocket websocket支持
spring-boot-starter-jersey REST應用和Jersey支持
spring-boot-starter-freemarker Freemarker模板引擎支持
spring-boot-starter-thymeleaf Thymeleaf模板引擎支持
spring-boot-starter-jta-atomikos 分佈式事務支持,使用atomikos
spring-boot-starter-jta-bitronix 一個開源的分佈式事務支持
spring-boot-starter-data-jpa JPA方式訪問數據庫,使用Hibernate做爲JPA實現
spring-boot-starter-data-elasticsearch 集成Elasticsearch,默認訪問localhost:9200
spring-boot-starter-data-redis 集成Redis,使用JRedis,默認鏈接localhost:6379
spring-boot-starter-data-mongodb 集成MongoDB,默認訪問mongodb://localhost/test
spring-boot-starter-data-neo4j 集成neo4j,默認訪問localhost:7474
spring-boot-starter-data-gemfire 集成分佈式緩存
spring-boot-starter-data-solr 集成solr搜索平臺,默認訪問http://localhost:8983/solr
spring-boot-starter-data-cassandra 集成Cassandra,默認訪問localhost:7474
spring-boot-starter-data-ldap 集成ldap
spring-boot-devtools 頁面和代碼的熱部署,在修改類或者配置文件的時候自動從新加載Spring Boot應用

1.多環境配置

在 resources 下新建全局配置文件 application.properties、開發環境配置文件 application-dev.properties 和生產環境配置文件 application-prod.properties,application.properties 配置以下:css

#使用開發環境 spring.profiles.active=dev #自定義 example.str=hello

 

 

其中的 str 能夠經過 @Value 獲取值:html

@Value("${example.str}") private String str;

 

生產環境配置文件 application-dev.properties 配置以下:java

server.port=8081
  • 1

2.Spring Boot配置類

Spring Boot 經過 @Configuration 註冊 bean,例如:web

@Configuration public class HelloConfig { @Bean public MessageConverter messageConverter() { return new Jackson2JsonMessageConverter(); } }

 

3.開發Spring MVC應用

使用 Spring Boot 能夠高效的開發 Spring MVC 應用,須要注意的是,MVC 和三層架構 (展示層 + 應用層 (Service層) + 數據訪問層 (Dao層) ) 是兩個不一樣的概念,MVC 只存在三層架構的展示層,M 是數據模型,V 是視圖頁面,C 是控制器。MVC 和核心思想是業務數據抽取與業務數據呈現相分離。redis

Spring Boot經常使用註解 釋義
@RestController Spring4以後新加的註解,等同於@ResponseBody+@Controller
@RequestMapping url映射,value能夠爲數組,例如{「/hello」, 「/hi」}
@GetMapping GET類型的url映射,還有@PostMapping、@PutMapping、@DeleteMapping
@PathVariable 獲取url中的數據
@RequestParam 獲取請求參數的值,required屬性表示是否必傳,defaultValue屬性表示默認值
@RequestBody 用來處理content-type不是默認的application/x-www-form-urlcoded編碼的內容,好比application/json或application/xml等。

新建 HelloController:spring

@RestController public class HelloController { @GetMapping("/hello") public String hello() { return "Hello, Spring Boot!"; } }

 

運行項目(mvn spring-boot:run 命令),瀏覽器訪問 http://localhost:8081/hello,便可看到輸出結果 「Hello, Spring Boot!」。Spring Boot其餘經常使用註解以下:mongodb

Spring Boot經常使用註解 釋義
@Component 通用註解,會被註冊爲bean組件、基於它的還有@Repository、@Service、@Controller
@Autowired 標註在構造方法、類的任何方法上,實現自動裝配
@Resource 默認按名稱裝配,當找不到與名稱匹配的bean纔會按類型裝配
@Lazy(true) 表示延遲初始化
@Import 導入配置類,並支持導入普通的java類,並將其聲明成一個bean
@Transactional 標註在類或方法上,聲明式事務註解。建議使用@Transactional(rollbackFor = Exception.class)
@Value 使用EL-Spring表達式注入字符、屬性、內容等
@JsonSerialize jackson註解,標註在屬性或者字段上,指定序列化方式
@JsonProperty(「name」) jackson註解,標註在VO對象的屬性上,例如categoryName,返回json中將顯示成name
@JsonIgnore jackson註解,標註在POJO對象的屬性、方法上,轉成json格式時忽略該屬性或者方法

4.AOP統一處理請求日誌

須要添加 spring-boot-starter-aop 依賴,建立 Aspect 文件便可經過 AOP 統一處理請求日誌了:數據庫

@Aspect @Component public class HttpAspect { private Logger logger = LoggerFactory.getLogger(getClass()); @Pointcut("execution(public * com.example.server.controller.ContentController.*(..))") public void log() { } //方法執行以前 @Before("log()") public void doBefore(JoinPoint joinPoint) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); //url HttpServletRequest request = attributes.getRequest(); logger.info("url={}", request.getRequestURL()); } //方法執行以後 @After("log()") public void doAfter() { logger.info("doAfter"); } @AfterReturning(returning = "object", pointcut = "log()") public void doAfterReturning(Object object) { logger.info("response={}", object); } }

 

 

5.Spring Boot多線程編程

Spring 經過任務執行器(TaskExecutor)來實現多線程和併發編程。使用 ThreadPoolTaskExecutor 可實現一個基於線程池的 TaskExecutor。而實際開發中任務通常是非阻礙的,即異步的,因此咱們要在配置類中經過 @EnableAsync 開啓對異步任務的支持,並經過在實際執行的 Bean 的方法中使用 @ Async 註解來聲明是一個異步任務,若是註解在類級別,則表示該類全部的方法都是異步方法。編程

@Configuration @EnableAsync public class TaskExecutorConfig implements AsyncConfigurer { @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(5); taskExecutor.setMaxPoolSize(10); taskExecutor.setQueueCapacity(25); taskExecutor.initialize(); return taskExecutor; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; } }

 

 

而後聲明 @Async 註解,便可併發執行:

@Service public class AsyncTaskService { @Async public void executeAsyncTask(Integer i) { System.out.println("執行異步任務1:" + i); } @Async public void executeAsyncTask2(Integer i) { System.out.println("執行異步任務2:" + i); } }

 

 

6.Spring Boot定時任務

經過在配置類註解 @EnableScheduling 來開啓對計劃任務的支持,而後在要執行的方法上註解 @Scheduled 聲明這是一個計劃任務,支持 cron、fixDelay、fixRate 等類型的計劃任務。cron 表達式能夠去 http://www.pppet.net/ 生成。配置類:

@Configuration @EnableScheduling public class TaskSchedulerConfiguration { }

 

計劃任務執行類:

@Service public class ScheduledTaskService { private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); @Scheduled(fixedRate = 5000) public void reportCurrentTime() { System.out.println("每隔5秒執行1次:" + dateFormat.format(new Date())); } @Scheduled(cron = "0/10 * * * * ? ") public void fixTimeExecution() { System.out.println("在指定時間" + dateFormat.format(new Date()) + "執行"); } }

 

 

運行 Spring Boot 項目,發現計劃任務按照計劃依次執行成功。

7.Spring Boot配置SSL

使用 jdk 中的 keytool 生成 keystore:

keytool -genkey -alias tomcat

 

這時我就生成了 .keystore 證書文件,將證書文件複製到項目的根目錄,而後經過 application.properties 中的 server.ssl.* 前綴配置 SSL 屬性便可:

server.ssl.key-store=.keystore server.ssl.key-password=123456 server.ssl.key-store-type=JKS server.ssl.key-alias=tomcat

 

8.Spring Boot加載靜態資源

靜態資源(css、icon、iconfont、images、img、js)放在 resources/static 下,Freemaker 模版頁面放在 resources/templates 下。咱們將Freemaker 模版頁面 index.ftl 放入到 resources/templates 下,編寫一個 Controller 測試一下:

@Controller public class IndexController { @RequestMapping(value = "index", method = RequestMethod.GET) public String showIndex() { return "index"; } }

 

 

運行訪問,發現已經能夠訪問了。替換 favicon 只須要將本身的 favicon.ico 放置在 resources/static 下便可。除了這些,Spring Boot 還能夠加載 WebJars,WebJars 將瀏覽器資源(css,js等)打成 jar 文件,以對資源進行統一依賴管理,例如添加 bootstrap:

<dependency> <groupId>org.webjars</groupId> <artifactId>bootstrap</artifactId> <version>3.3.7-1</version> </dependency>

 

頁面引入就能夠正常使用了:

<script type="text/javascript" src="/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js"></script>

 

9.Spring Boot單元測試

1.Service單元測試

@RunWith(SpringRunner.class) @SpringBootTest public class ContentServiceTest { @Resource private ContentService contentService; @Test public void whenGetContentListSuccess() throws Exception { Assert.assertNotEquals(0, contentService.getContentList().size()); } }

 

2.Controller單元測試

@RunWith(SpringRunner.class) @SpringBootTest public class ContentControllerTest { @Resource private ContentController contentController; private MockMvc mvc; private Logger logger = LoggerFactory.getLogger(ContentControllerTest.class); @Before public void setup() { mvc = MockMvcBuilders.standaloneSetup(contentController).build(); } @Test public void whenGetContentListSuccess() throws Exception { MvcResult result = mvc.perform(MockMvcRequestBuilders.get("/content/query/list") .contentType(MediaType.APPLICATION_JSON_UTF8)) .andExpect(MockMvcResultMatchers.status().isOk()) .andReturn(); logger.info(result.getResponse().getContentAsString()); } }

 

Maven 打包跳過單元測試:

mvn clean package -Dmaven.test.skip=true

 

10.Spring Boot Logback日誌配置

Spring Boot 默認使用 SLF4j 和 Logback 輸出日誌。增長 Logback 配置 resources/logback-spring.xml 便可完成日誌文件的生成:

<?xml version="1.0" encoding="UTF-8" ?> <configuration debug="false"> <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </pattern> </layout> </appender> <!-- 天天生成日誌文件,並區分info和error日誌輸出 --> <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter> <encoder> <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </pattern> </encoder> <!--滾動策略--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--路徑--> <fileNamePattern>/var/log/tomcat/PROJECT_NAME/info.%d.log</fileNamePattern> <!--日誌文件保留天數--> <MaxHistory>30</MaxHistory> </rollingPolicy> </appender> <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <encoder> <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </pattern> </encoder> <!--滾動策略--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--路徑--> <fileNamePattern>/var/log/tomcat/PROJECT_NAME/error.%d.log</fileNamePattern> <!--日誌文件保留天數--> <MaxHistory>30</MaxHistory> </rollingPolicy> </appender> <root level="info"> <appender-ref ref="consoleLog" /> <appender-ref ref="fileInfoLog" /> <appender-ref ref="fileErrorLog" /> </root> </configuration>

 

  • spring boot項目發佈

Spring Boot 內置了 tomcat-embed,因此能夠直接經過 java -jar 的方式運行:

mvn clean package                               //打包
java -jar xx.jar --server.port=9090
java -jar xx.jar --spring.profiles.active=dev   //能夠經過java -jar配置參數指定配置文件轉載自:https://blog.csdn.net/smartbetter/article/details/53933096#
相關文章
相關標籤/搜索