1. 程式人生 > >論spring boot的崛起

論spring boot的崛起

spring boot

  • 定義

Spring Boot是由Pivotal團隊提供的框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。 該框架使用了特定的方式(繼承starter,約定優先於配置)來進行配置,從而使開發人員不再需要定義樣板化的配置

  • 使用springboot的有點 1.使編碼更加的簡單 2.使配置更加的簡單 3.使部署更加簡單 4.使監控更加簡單
  • spring boot提供的功能 簡言之: Springboot其本質還是spring相關的框架,不過為開發者提供了一系列預設的starter,大大降低了spring專案開發的配置工作,所謂約定大於配置。 但其也有缺點,就是使用簡單,但很多原理性的東西可能對於不瞭解spring springMvc Mybatis Hibernate JPA等相關框架的開發者而言還是需要重新學習。

spring boot的入門學習

  • 環境要求 開發環境JDK 1.8 專案管理工具( Maven ) 開發工具(Eclipse)
  • 建立專案步驟 1.建立一個maven專案 2.匯入spring boot的依賴
<!-- 
spring boot 父節點依賴,引入這個之後相關的引入就不需要新增version配置,spring boot會自動選擇最合適的版本進行新增。
-->
<parent>
   	<groupId>org.springframework.boot</groupId>
   	<artifactId>spring-boot-starter-parent</artifactId>
   	<version>1.5.10.RELEASE</version>
</parent>


java.version 指定jdk版本號:
<java.version>1.8</java.version>

新增spring-boot-starter-web依賴
<dependency>
   	<groupId>org.springframework.boot</groupId>
   	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 使用熱部署 -->
 <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-devtools</artifactId>
           <optional>true</optional>
      </dependency>
  <!-- 可執行jar包 -->
   <build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
           </plugin>
       </plugins>
   </build>

3.寫測試

新建control
@RestController
public class HelloControl {
	@RequestMapping("/hello")
public String  Hello(){
	
	return "hello-word";
}
	 
}
=============================================================
新建一個啟動類
@SpringBootApplication
public class Start {
public static void main(String[] args) {
	 SpringApplication.run(Start.class, args);
  }
}
  • 熱部署的配置spring-boot-devtools spring-boot-devtools 是一個為開發者服務的一個模組,其中最重要的功能就是自動應用程式碼更改到最新的App上面去。原理是在發現程式碼有更改之後,重新啟動應用,但是速度比手動停止後再啟動還要更快,更快指的不是節省出來的手工操作的時間。 其深層原理是使用了兩個ClassLoader,一個Classloader載入那些不會改變的類(第三方Jar包),另一個ClassLoader載入會更改的類,稱為 restart ClassLoader ,這樣在有程式碼更改的時候,原來的restart ClassLoader 被丟棄,重新建立一個restart ClassLoader,由於需要載入的類相比較少,所以實現了較快的重啟時間

本節主要是SpringBoot的基本引入及熱部署的整合

Spring boot web

  • 步驟:

    建立Maven web project 引入依賴 配置application.properties對jsp支援 編寫測試Controller 編寫JSP 編寫啟動start

  • 建立Maven Web Project 使用Eclipse新建一個Maven Web Project ,專案取名為:spring-boot-jsp

  • 匯入maven依賴

<properties>
		<java.version>1.8</java.version>
	</properties>

	<!-- Inherit defaults from Spring Boot -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.10.RELEASE</version>
	</parent>

	<!-- Add typical dependencies for a web application -->
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<optional>true</optional> <!-- 表示依賴不會傳遞 -->
		</dependency>

		
		<!--必須有才能編譯jsp -->
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<scope>provided</scope>
		</dependency>

	</dependencies>
	<!-- Package as an executable jar -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				
			</plugin>
		</plugins>
	</build>
  • 配置application.properties對jsp支援
新增src/main/resources/application.properties:

#tomcat server port
server.port=80

# 頁面預設字首目錄
spring.mvc.view.prefix=/WEB-INF/jsp/
# 響應頁面預設字尾
spring.mvc.view.suffix=.jsp
# 自定義屬性,可以在Controller中讀取
application.hello=Hello Angel From application

Yaml 方式
server:
  port: 8080
name: kd 
spring:
  mvc:
    view: 
      prefix: /WEB-INF/jsp/
      suffix: .jsp
  • 編寫測試類
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
	@RequestMapping("/hello")
	public String helloJsp(Model model){
		System.out.println("HelloController.helloJsp().hello=hello");
		model.addAttribute("hello", "你好");
		return "hello";
	}
}
  • 編寫jsp介面 在 src/main 下面建立 webapp/WEB-INF/jsp 目錄用來存放我們的jsp頁面:helloJsp.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	helloJsp
	<hr>
	${hello}
	
</body>
</html>	
  • 編寫啟動start
@SpringBootApplication
public class Start {
public static void main(String[] args) {
	 SpringApplication.run(Start.class, args);
  }
}
  • 獲取json物件
@RequestMapping("/json")
	@ResponseBody
	public Person json(){
		return new Person(1L,"kd");
}

SpringBoot搭建web專案非常簡單,和原SpringMVC的使用方式類似,但啟動方式和配置方式有區別。

Spring boot 持久化

Spring Boot就資料庫持久化支援,支援原生Jdbc,也支援Mybatis和JPA。

  • Spring boot JdbcTemplate

引入spring-boot-starter-jdbc 只需要在需要使用的類中加入: @Resource private JdbcTemplate jdbcTemplate;

  • 引入maven依賴MySQL、jdbc
<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
</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>
		</dependency>
  • 資料庫資訊配置
在application.properties檔案中配置mysql連線配置檔案
########################################################
###datasource
########################################################

spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = root
spring.datasource.password = root

Yaml 方式
spring:
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    url : jdbc:mysql://localhost:3306/spring-boot-demo?useUnicode=true&characterEncoding=utf-8 
    username : root
    password : root
  • Spring boot-spring data Jpa 1pring data Spring Data是一個用於簡化資料庫訪問,並支援雲服務的開源框架。其主要目標是使得資料庫的訪問變得方便快捷,並支援map-reduce框架和雲端計算資料服務 2.Jpa “規範”: 所謂的規範意指明文規定或約定俗成的標準 3.Hibernate JPA是一種規範,而Hibernate是它的一種實現 4)Spring data Jpa 4.Spring Data JPA 可以極大的簡化JPA的寫法,可以在幾乎不用寫實現的情況下,實現對資料的訪問和操作。除了CRUD外,還包括如分頁、排序等一些常用的功能。 5.Spirng data jpa常用介面或類 Spring Data 的一個核心介面為我們提供了常用的介面 Repository 介面是 Spring Data 的一個核心介面,它不提供任何方法,開發者需要在自己定義的介面中宣告需要的方法 : public interface Repository<T, ID extends Serializable> { } 1Repository是一個空介面,即是一個標記介面; 2若我們定義的介面繼承了Repository,則該介面會被IOC容器識別為一個Repository Bean納入到IOC容器中,進而可以在該介面中定義滿足一定規範的方法。 3 實際上也可以通過@RepositoryDefinition,註解來替代繼承Repository介面。 4 查詢方法以find | read | get開頭; 5 涉及查詢條件時,條件的屬性用條件關鍵字連線,要注意的是條件屬性以首字母大寫。 6使用@Query註解可以自定義JPQL語句實現更靈活的查詢。

  • 引入Maven依賴-mysql,springdatajpa

<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
  • 配置jdbc spring data jpa
在application.properties檔案中配置mysql連線配置檔案
#tomcat server port
server.port=80

########################################################
###datasource
########################################################
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10

########################################################
### Java Persistence Api  (可以不設定,用預設的)
########################################################
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
#[org.hibernate.cfg.ImprovedNamingStrategy  #org.hibernate.cfg.DefaultNamingStrategy]
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect

Spring boot-mybatis的整合

  • 整合

(1)新建maven project; 新建一個maven project,取名為:spring-boot-mybatis (2)在pom.xml檔案中引入相關依賴; (1)基本依賴,jdk版本號; (2)mysql驅動,mybatis依賴包,mysql分頁PageHelper:

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- mysql 資料庫驅動. -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<!-- spring-boot mybatis依賴 -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.0</version>
		</dependency>
		
			<!-- spring boot mybatis 分頁外掛 -->
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>1.2.2</version>
		</dependency>
  • 建立啟動
@SpringBootApplication
@MapperScan("cn.itsource.springboot.mybatis.mapper")
public class App 
{
    public static void main( String[] args )
    {
        SpringApplication.run(App.class, args);
    }
}
//這裡和以往不一樣的地方就是MapperScan的註解,這個是會掃描該包下的介面
  • 在application.properties新增配置檔案
#tomcat server port
server.port=80

########################################################
###datasource
########################################################
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10
  • 編寫User測試類
public class User implements Serializable {
	private static final long serialVersionUID = -2107513802540409419L;
	private Long id;
	private String name;

	getter/setter...

}
  • 編寫UserMapper
使用註解方式
@Mapper
public interface UserMapper {
	@Select("select * from t_user t_user name = #{name}")
	List<User> likeName(String name);
	
	@Select("select * from t_user where id = #{id}")
	User getById(long id);
	
	@Select("select name from t_user where id = #{id}")
	String getNameById(long id);
}
==================================================================
使用xml方式
public interface UserMapper {
	List<User> likeName(String name);
	User getById(long id);
	String getNameById(long id);
}

然後在resources下增加mapper.xml檔案
/cn/itsource/springboot/mybatis/mapper/UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.itsource.springboot.mybatis.mapper.UserMapper">
	<select parameterType="string" resultType="User" id="likeName"> 
		select * from t_user where name like concat('%',#{name},'%') 
	</select>
	<select parameterType="long" resultType="User" id="getById"> 
		select * from t_user where id = #{id} 
	</select>
	<select parameterType="long" resultType="string" id="getNameById"> 
		select name from t_user where id = #{id} 
	</select>
	<insert parameterType="User" id="save" keyColumn="id"
		keyProperty="id" useGeneratedKeys="true"> 
		insert into t_user(name) values(#{name}) 
	</insert>
</mapper>

最後需要在application.properties中增加別名包和mapper xml掃描包的配置
## Mybatis config
mybatis.typeAliasesPackage=cn.itsource.springboot.mybatis.domain
mybatis.mapperLocations=classpath:mapper/*.xml

#Yaml 配置

# Mybatis配置
mybatis:
  typeAliasesPackage: cn.itsource.domain
  mapperLocations: classpath:cn/itsource/dao/mapper/*.xml
  • 編寫UserService
@Service
public class UserService {
	@Autowired
	private UserMapper userMapper;
	
	public User get(Long id){
		return userMapper.getById(id);
	}
}
  • 編寫UserController
@RestController
public class UserController {

	@Autowired
	private UserService userService;

	@RequestMapping("/user/{id}")
	@ResponseBody
	public User get(@PathVariable Long id) {
		return userService.get(id);
	}
}

使用PageHelper分頁

在application.properties中配置分頁外掛 #pagehelper. pagehelper.autoDialect=true pagehelper.closeConn=true 在呼叫mapper的前面開啟分頁功能

@Service
public class UserService {
	@Autowired
	private UserMapper userMapper;
	
	public User get(Long id){
		return userMapper.getById(id);
	}

	public PageInfo<User> likeName(String name,Integer p) {
		PageHelper.startPage(p, 1);
        List<User> users = userMapper.likeName(name);
		return new PageInfo<>(users);
	}
}

事務控制

在需要事務控制的方法或類(全部方法有效)上增加 @Transactional註解 使用Junit測試

新增spring-boot-starter-test
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
</dependency>

新增測試類,類似於spring的測試,增加spring-boot的測試環境註解

//Spring測試環境
@RunWith(SpringJUnit4ClassRunner.class)
//SpringBoot測試,並指定啟動類
@SpringBootTest(classes = App.class)
public class UserServiceTest {
	
	@Autowired
	private UserService userService;
	
	@Test
	public void testGet() throws Exception {
		User user = userService.get(1L);
		System.out.println(user.getName());
	}
}

注意:在spring-boot-jpa的測試中,如果測試方法中使用的是 Repository.getOne方法,那麼會報no Session異常,解決方法是在測試方法上增加@Transactional註解,如果使用的是findOne方法,那麼不會有問題。 所以,一般建議都在test方法上增加 @Transactional註解。 注意:如果在測試方法執行完後要恢復測試前的資料,請在測試方法上增加@Rollback註解