Spring Boot(1)--初識篇
主要內容
- springBoot是什麼?
- 為什麼要使用它?
- 開始自己的編碼
- 測試用例
- 配置檔案說明
- 自定義過慮器
一、Spring Boot是何物?
Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。通過這種方式,Spring Boot致力於在蓬勃發展的快速應用開發領域(rapid application development)成為領導者。------
Spring Boot是Spring的約定優於配置的解決方案,用於建立可“直接執行”的獨立的、生產級的基於Spring的應用程式。它預先配置了Spring的“固執己見的觀點”,即最佳配置和Spring平臺及第三方庫的使用,因此您可以從最小的麻煩開始。大多數Spring引導應用程式只需要很少的Spring配置-----來自wikipedia的翻譯
二、為什麼要使用它?
由於SpringBoot使用約定大於配置的思路,使得專案開發中只要約定一套規則,整個專案組就可以簡單、方便、快速的完成開發任務。相比於平常的專案搭建簡單高效,再一個現在微服務相當流行。僅需要非常少的幾個配置就可以迅速方便的搭建起來一套web專案或者是構建一個微服務。用上一次你就會愛上它無法自拔,哈哈。
吧啦,吧啦,吧啦......................
好吧,多了不說~!自己體會,那種酸爽的感覺。
三、編碼實踐
讓我們開始這趟旅行吧~~~~
首先,我們使用maven來構建專案,現在還有一個比較流行的構建專案的方式是Gradle,具說是結合了maven和ant的優點。由於本人目前為止也沒有使用過所以 還是不用它了。之後再學習。
步驟:
- 可以直接訪問:https://start.spring.io/填寫你的專案名字和group,就可以生成一個StringBoot的專案了,下載下來後放到自己的工作目錄中解壓即可。
- 使用eclipse或idea,匯入這個專案。-----OK 了 ,大功告成。
其目錄結構大致如下:
生成的包,如上圖所示:
- com.xps.sc.springbootdemo這個是自動生成的包名稱,boot建議使用com.example.projectname作為包名
- SpringBootDemoApplication框架的啟動入口,主要做一些工程級的配置
- service業務服務包(可以根據實際業務自己建立)
- controller面向請求的服務控制
- domain使用的實體類,也可以是entity或bean之類的名稱。
- test測試用例包
最後一步,引入web模組,在pom.xml中加入
<!--新增web支援模組begin-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--新增web支援模組end-->
現在整個框架按預設的方式已經完成了,接下來我們來建立一個服務測試一下
//@RestController的意思就是controller
// 裡面的方法都以json格式輸出,不用再寫什麼jackjson配置的了
@RestController
public class HelloBootController {
private Logger logger = LoggerFactory.getLogger(HelloBootController.class);
@Autowired
private ApplicationProperties properties;
@RequestMapping(value = "/hello/{name}")
public String hello(@PathVariable String name){
return "hello,"+name+" this is a hello service!!!";
}
/**
* 自動組裝成json
* {"customerId":1,"customerName":"張三"}
* @param id
* @return Customer
*/
@RequestMapping(value = "/getCustomer/{id}")
public Customer getCustomer(@PathVariable Long id){
Customer customer = new Customer();
customer.setCustomerId(id);
customer.setCustomerName(properties.getName());
customer.setDesc(properties.getDescription());
logger.debug(properties.getDescription());
return customer;
}
}
現在,啟動工程,如果沒有配置則預設8080埠。可以看到它就是一個main方法,所以我們也可以使用傳統的java -jar來啟動它。
訪問:http://localhost:8000/hello/張三
可以看到服務的效果了,是不是很簡單(只處有笑臉)~!
四、測試
一般我們喜歡自己寫一個測試用例來測試,而不是每次都啟動伺服器。我們可以在test目錄下編寫測試類(預設會生成一個測試類,只要copy它即可),這裡我們使用MockMvc:
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloBootControllerTests {
private MockMvc mvc;
@Before
public void setUp() throws Exception {
mvc = MockMvcBuilders.standaloneSetup(new HelloBootController()).build();
}
@Test
public void hello() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/hello/CelineDion")
.characterEncoding("UTF-8").contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
}
}
五、application.properties配置檔案
專案預設會在src/resources根目錄下生成一個application.properties檔案,這個是SpringBoot預設載入的配置檔案,我們可以在此檔案中配置一些內容,比如:日誌級別,資料庫連線引數或者自己專案中使用的常量。
#設定spring-boot編碼格式,防止亂碼,如果加上這些還是亂碼,可以檢視
#自己的工程和工程中的檔案是否都是UTF-8編碼的,idea的設定位置在
#File---settings---Editor----File Encodings 在最下面有個default encoding for properties 選擇utf-8且後面的複選框勾選即可
server.tomcat.uri-encoding=UTF-8
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.messages.encoding=UTF-8
#---------------------
#myself params
com.xps.user.name=王老五-dev
com.xps.user.age=30
com.xps.user.description=${com.xps.user.name} now is ${com.xps.user.age} years old and 他非常有錢!
logging.path=E:\\workplace\\springCloud\\log
logging.level.com.xps=DEBUG
logging.level.org.springframework.web=INFO
logging.level.org.hibernate=ERROR
這樣定義完成後,我們可以使用一個類來儲存這些定義,新建立一個類(包自己定義):
@Component//加上此標籤讓spring能夠識別它是一個元件
//@ConfigurationProperties(prefix = "com.xps.p")
public class ApplicationProperties {
//使用spring的@Value即可
@Value("${com.xps.user.name}")
private String name;
@Value("${com.xps.user.age}")
private int age;
@Value("${com.xps.user.description}")
private String description;
//getter and setter方法
}
這個我們就可以在需要使用的地方,按如下方式引入即可取到配置的引數
@Autowired
private ApplicationProperties properties;
雖說這樣使用也沒有問題,但一般我們都有開發環境、測試和生產環境,配置引數可能會有區別,那怎麼辦呢?springBoot也早就想到了這個問題。我們可以在appication.properties同級下新建立三個檔案,名稱為application-{profile}.properties,其中profile可以為dev\test\prod或其它自己認識的值。然後再application.properties檔案中新增
spring.profiles.active=dev
也可以在啟動時指定引數。這樣我們訪問上面的第二個服務時就是:
值得一說的是,springboot也同時支援yml檔案配置,可以把上面的application.properties換成application.yml,如果兩個同時存在的話,則使用yml檔案。
#設定服務埠
server:
port: 8000
tomcat:
uri-encoding: UTF-8
#設定spring-boot編碼格式
spring:
http:
encoding:
charset: UTF-8
enabled: true
force: true
messages:
encoding: UTF-8
#環境變數
profiles:
active: dev
六、新增自己的Filter
在之前開發的一般專案中,一般要先定義自己的過慮器類實現Filter,然後再到web.xml中配置這個過慮器並指定過慮路徑。在springboot中直接使用標籤即可,不需要再配置其它。
@Configuration//標籤標記是一個配置
public class WebChartConfigration {
private Logger logger = LoggerFactory.getLogger(WebChartConfigration.class);
@Bean
public RemoteIpFilter getRemoteIpFilter(){
return new RemoteIpFilter();
}
//註冊自己的過慮器到過慮器鏈
@Bean
public FilterRegistrationBean myFilterRegistration(){
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new ChartFilter());
registration.setName("ChartFilter");
registration.setOrder(1);
registration.addUrlPatterns("/*");//指定過慮路徑
registration.addInitParameter("a","a");
return registration;
}
//實現javax.servlet.Filter即可
public class ChartFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
logger.debug("請求的URL:"+request.getRequestURL().toString());
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.debug("ChartFilter init");
}
@Override
public void destroy() {
logger.debug("ChartFilter destroy");
}
}
}
總結
可見使用SpringBoot可以很方便的搭建專案工程,可以把主要的精力用在業務處理邏輯上。這些僅僅是一個開始,我們同樣也可以像其它工程一樣為它加入資料庫、快取處理、訊息中介軟體等等。加油學習吧,路漫漫,任重道遠呀。
非常感謝,https://www.cnblogs.com/ityouknow/p/5662753.html這位博主的分享~!