springboot與springMVC對比學習
開發模式比較
1.springmvc會在web.xml檔案中配置DispatcherServlet,負責截獲,處理所有請求,如下的配置:
<!-- 前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 預設找 /WEB-INF/[servlet的名稱]-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <init-param> <param-name>dispatchOptionsRequest</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
2. 在 Spring MVC 配置檔案中,宣告預定義的控制器和檢視解析器等
3. 編寫預定義的處理請求控制器
4. 編寫預定義的檢視物件,比如 JSP、Freemarker 等
springboot mvc會省略前兩步,
1. 編寫預定義的處理請求控制器
2. 編寫預設 ThymeLeaf 檢視物件
@Controller @RequestMapping(value = "/users") public class UserController { @Autowired private UserService userService; @RequestMapping(value = "/user/index") public String index(){ return "user/index"; } @RequestMapping(value = "/user/show",method = RequestMethod.GET) @ResponseBody public String show(@RequestParam(value = "name")String name){ User user = userService.findUserByName(name); if(null != user) return user.getId()+"/"+user.getName(); else return "null"; } }
@Controller 註解在 UserController 類上,標識其為一個可接收 HTTP 請求的控制器
@RequestMapping(value = "/users") 註解 ,標識 UserController 類下所有接收的請求路由都是 /users 開頭的。注意:類上的 @RequestMapping 註解是不必需的
@RequestMapping(method = RequestMethod.GET) 註解,標識該 getUserList(ModelMap map) 方法會接收並處理 /users 請求,且請求方法是 GET
getUserList(ModelMap map) 方法返回的字串 userList ,代表著是檢視,會有檢視解析器解析成為一個具體的檢視物件,然後經過檢視渲染展示到瀏覽器
springboot自定義屬性
首先專案結構如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
在 application.properties 中對應 HomeProperties 物件欄位編寫屬性的 KV 值:
1 2 3 4 |
|
這裡也可以通過佔位符,進行屬性之間的引用。
然後,編寫對應的 HomeProperties Java 物件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
|
通過 @ConfigurationProperties(prefix = "home”) 註解,將配置檔案中以 home 字首的屬性值自動繫結到對應的欄位中。同是用 @Component 作為 Bean 注入到 Spring 容器中。
如果不是用 application.properties 檔案,而是用 application.yml 的檔案,對應配置如下:
1 2 3 4 5 |
|
鍵值對冒號後面,必須空一格。
注意這裡,就有一個坑了:
application.properties 配置中文值的時候,讀取出來的屬性值會出現亂碼問題。但是 application.yml 不會出現亂碼問題。原因是,Spring Boot 是以 iso-8859 的編碼方式讀取 application.properties 配置檔案。
注意這裡,還有一個坑:
如果定義一個鍵值對 user.name=xxx ,這裡會讀取不到對應寫的屬性值。為什麼呢?Spring Boot 的預設 StandardEnvironment 首先將會載入 “systemEnvironment" 作為首個PropertySource. 而 source 即為System.getProperties().當 getProperty時,按照讀取順序,返回 “systemEnvironment" 的值.即 System.getProperty("user.name")
(Mac 機子會讀自己的登入賬號,這裡感謝我的死黨 http://rapharino.com/)
三、random.* 屬性
Spring Boot 通過 RandomValuePropertySource 提供了很多關於隨機數的工具類。概括可以生成隨機字串、隨機 int 、隨機 long、某範圍的隨機數。
執行 springboot-properties 工程 org.spring.springboot.property.PropertiesTest 測試類的 randomTestUser 方法。多次執行,可以發現每次輸出不同 User 屬性值:
三、random.* 屬性Spring Boot 通過 RandomValuePropertySource 提供了很多關於隨機數的工具類。概括可以生成隨機字串、隨機 int 、隨機 long、某範圍的隨機數。 執行 springboot-properties 工程 org.spring.springboot.property.PropertiesTest 測試類的 randomTestUser 方法。多次執行,可以發現每次輸出不同 User 屬性值:
application.yml 方式的配置如下( application.properties 形式這裡不寫了):
四、多環境配置很多場景的配置,比如資料庫配置、Redis 配置、註冊中心和日誌配置等。在不同的環境,我們需要不同的包去執行專案。所以看專案結構,有兩個環境的配置:
Spring Boot 是通過 application.properties 檔案中,設定 spring.profiles.active 屬性,比如 ,配置了 dev ,則載入的是 application-dev.properties :
那執行 springboot-properties 工程中 Application 應用啟動類,從控制檯中可以看出,是載入了 application-dev.properties 的屬性輸出:
將 spring.profiles.active 設定成 prod,重新執行,可得到 application-prod.properties的屬性輸出:
根據優先順序,順便介紹下 jar 執行的方式,通過設定 -Dspring.profiles.active=prod 去指定相應的配置:
五、小結常用的樣板配置在 Spring Boot 官方文件給出,我們常在 application.properties(或 yml)去配置各種常用配置: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html |
application.yml 方式的配置如下( application.properties 形式這裡不寫了):
1 2 3 4 5 6 |
|
@ResponseBody 註解標識該方法的返回值。這樣被標註的方法返回值,會直接寫入 HTTP 響應體(而不會被檢視解析器認為是一個檢視物件)。