Java Web系列:Spring Boot 基礎

剛哥521發表於2016-01-11

Spring Boot 專案(參考1) 提供了一個類似ASP.NET MVC的預設模板一樣的標準樣板,直接整合了一系列的元件並使用了預設的配置。使用Spring Boot 不會降低學習成本,甚至增加了學習成本,但顯著降低了使用成本並提高了開發效率。如果沒有Spring基礎不建議直接上手。

1.基礎專案

這裡只關注基於Maven的專案構建,使用Spring Boot CLI命令列工具和Gradle構建方式請參考官網。

(1)建立專案:

建立型別為quickstart的Maven專案,刪除預設生成的.java檔案保持預設的Maven目錄即可。

(2)修改/pom.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <groupId>com.example</groupId>
 6     <artifactId>myproject</artifactId>
 7     <version>0.0.1-SNAPSHOT</version>
 8     <properties>
 9         <java.version>1.8</java.version>
10     </properties>
11     <parent>
12         <groupId>org.springframework.boot</groupId>
13         <artifactId>spring-boot-starter-parent</artifactId>
14         <version>1.3.1.RELEASE</version>
15     </parent>
16     <dependencies>
17         <dependency>
18             <groupId>org.springframework.boot</groupId>
19             <artifactId>spring-boot-starter-web</artifactId>
20         </dependency>
21     </dependencies>
22 </project>

(3)新增/src/main/sample/controller/HomeController.java檔案:

 1 package simple.controller;
 2 
 3 import org.springframework.web.bind.annotation.*;
 4 
 5 @RestController
 6 public class HomeController {
 7 
 8     @RequestMapping("/")
 9     public String index() {
10         return "Hello World!";
11     }
12 }

(4)新增/src/main/sample/Application.java檔案:

 1 package simple;
 2 
 3 import org.springframework.boot.*;
 4 import org.springframework.boot.autoconfigure.*;
 5 import simple.controller.*;
 6 
 7 @EnableAutoConfiguration
 8 public class Application {
 9 
10     public static void main(String[] args) throws Exception {
11         SpringApplication.run(new Object[] { Application.class, HomeController.class }, args);
12     }
13 
14 }

 

在瀏覽器中輸入http://localhost:8080/,即可直接看到"Hello World"執行結果

2. 新增資料訪問支援

(1)修改pom,新增spring-boot-starter-data-jpah2依賴:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <groupId>com.example</groupId>
 6     <artifactId>myproject</artifactId>
 7     <version>0.0.1-SNAPSHOT</version>
 8     <properties>
 9         <java.version>1.8</java.version>
10     </properties>
11     <parent>
12         <groupId>org.springframework.boot</groupId>
13         <artifactId>spring-boot-starter-parent</artifactId>
14         <version>1.3.1.RELEASE</version>
15     </parent>
16     <dependencies>
17         <dependency>
18             <groupId>org.springframework.boot</groupId>
19             <artifactId>spring-boot-starter-web</artifactId>
20         </dependency>
21         <dependency>
22             <groupId>org.springframework.boot</groupId>
23             <artifactId>spring-boot-starter-data-jpa</artifactId>
24         </dependency>
25         <dependency>
26             <groupId>com.h2database</groupId>
27             <artifactId>h2</artifactId>
28             <scope>runtime</scope>
29         </dependency>
30     </dependencies>
31 </project>

如果需要在控制檯檢視生成SQL語句,可以新增/src/main/resources/application.properties

1 spring.h2.console.enabled=true
2 logging.level.org.hibernate.SQL=debug

(2)新增實體

新增User、Role、Category和Post實體。

User:

 1 package simple.domain;
 2 
 3 import java.util.*;
 4 
 5 import javax.persistence.*;
 6 
 7 @Entity
 8 public class User {
 9     @Id
10     @GeneratedValue
11     private Long id;
12 
13     private String userName;
14 
15     private String password;
16 
17     private String Email;
18 
19     @javax.persistence.Version
20     private Long Version;
21 
22     @ManyToMany(cascade = CascadeType.ALL)
23     private List<Role> roles = new ArrayList<Role>();
24 
25     public Long getId() {
26         return id;
27     }
28 
29     public void setId(Long id) {
30         this.id = id;
31     }
32 
33     public String getUserName() {
34         return userName;
35     }
36 
37     public void setUserName(String userName) {
38         this.userName = userName;
39     }
40 
41     public String getPassword() {
42         return password;
43     }
44 
45     public void setPassword(String password) {
46         this.password = password;
47     }
48 
49     public String getEmail() {
50         return Email;
51     }
52 
53     public void setEmail(String email) {
54         Email = email;
55     }
56 
57     public List<Role> getRoles() {
58         return roles;
59     }
60 
61     public void setRoles(List<Role> roles) {
62         this.roles = roles;
63     }
64 
65     public Long getVersion() {
66         return Version;
67     }
68 
69     public void setVersion(Long version) {
70         Version = version;
71     }
72 }
View Code

Role:

 1 package simple.domain;
 2 
 3 import java.util.*;
 4 
 5 import javax.persistence.*;
 6 
 7 @Entity
 8 public class Role {
 9     @Id
10     @GeneratedValue
11     private Long id;
12 
13     private String roleName;
14 
15     @ManyToMany(cascade = CascadeType.ALL)
16     private List<User> users = new ArrayList<User>();
17 
18     public Long getId() {
19         return id;
20     }
21 
22     public void setId(Long id) {
23         this.id = id;
24     }
25 
26     public String getRoleName() {
27         return roleName;
28     }
29 
30     public void setRoleName(String roleName) {
31         this.roleName = roleName;
32     }
33 
34     public List<User> getUsers() {
35         return users;
36     }
37 
38     public void setUsers(List<User> users) {
39         this.users = users;
40     }
41 }
View Code

Category:

 1 package simple.domain;
 2 
 3 import java.util.*;
 4 
 5 import javax.persistence.*;
 6 
 7 @Entity
 8 public class Category {
 9     @Id
10     @GeneratedValue
11     private Long id;
12 
13     private String Name;
14 
15     @OneToMany
16     private List<Post> posts = new ArrayList<Post>();
17 
18     public Long getId() {
19         return id;
20     }
21 
22     public void setId(Long id) {
23         this.id = id;
24     }
25 
26     public String getName() {
27         return Name;
28     }
29 
30     public void setName(String name) {
31         Name = name;
32     }
33 
34     public List<Post> getPosts() {
35         return posts;
36     }
37 
38     public void setPosts(List<Post> posts) {
39         this.posts = posts;
40     }
41 }
View Code

Post:

 1 package simple.domain;
 2 
 3 import java.util.*;
 4 
 5 import javax.persistence.*;
 6 
 7 @Entity
 8 public class Post {
 9     @Id
10     @GeneratedValue
11     private Long id;
12 
13     private String Name;
14 
15     private String Html;
16 
17     private String Text;
18 
19     private Date CreateAt;
20 
21     @ManyToOne
22     private Category category;
23 
24     public Long getId() {
25         return id;
26     }
27 
28     public void setId(Long id) {
29         this.id = id;
30     }
31 
32     public String getName() {
33         return Name;
34     }
35 
36     public void setName(String name) {
37         Name = name;
38     }
39 
40     public String getHtml() {
41         return Html;
42     }
43 
44     public void setHtml(String html) {
45         Html = html;
46     }
47 
48     public String getText() {
49         return Text;
50     }
51 
52     public void setText(String text) {
53         Text = text;
54     }
55 
56     public Date getCreateAt() {
57         return CreateAt;
58     }
59 
60     public void setCreateAt(Date createAt) {
61         CreateAt = createAt;
62     }
63 
64     public Category getCategory() {
65         return category;
66     }
67 
68     public void setCategory(Category category) {
69         this.category = category;
70     }
71 }
View Code

(3)新增資源庫

新增UserRepository、RoleRepository、CategoryRepository和PostRepository介面,無需實現。

UserRepository:

1 package simple.repository;
2 
3 import org.springframework.data.repository.*;
4 
5 import simple.domain.*;
6 
7 public interface UserRepository extends CrudRepository<User, Long> {
8 
9 }

RoleRepository

1 package simple.repository;
2 
3 import org.springframework.data.repository.*;
4 
5 import simple.domain.*;
6 
7 public interface RoleRepository extends CrudRepository<Role, Long> {
8 
9 }

CategoryRepository

1 package simple.repository;
2 
3 import org.springframework.data.repository.*;
4 
5 import simple.domain.*;
6 
7 public interface CategoryRepository extends CrudRepository<Category, Long> {
8 
9 }

PostRepository

package simple.repository;

import org.springframework.data.repository.*;

import simple.domain.*;

public interface PostRepository extends CrudRepository<User, Long> {

}

(4)在控制器中注入資源庫介面

 1 package simple.controller;
 2 
 3 import org.springframework.beans.factory.annotation.*;
 4 import org.springframework.web.bind.annotation.*;
 5 
 6 import simple.repository.*;
 7 
 8 @RestController
 9 public class HomeController {
10 
11     private UserRepository userRepository;
12     private RoleRepository roleRepository;
13     private CategoryRepository categoryRepository;
14     private PostRepository postReppository;
15 
16     @Autowired
17     public HomeController(UserRepository userRepository, RoleRepository roleRepository,
18             CategoryRepository categoryRepository, PostRepository postReppository) {
19         this.userRepository = userRepository;
20         this.roleRepository = roleRepository;
21         this.categoryRepository = categoryRepository;
22         this.postReppository = postReppository;
23     }
24 
25 
26     @RequestMapping("/")
27     public long index() {
28         return userRepository.count();
29     }
30 }

使用事務時在方法上應用註解@Transactional

3.新增驗證和授權支援

(1)新增spring-boot-starter-security依賴

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <groupId>com.example</groupId>
 6     <artifactId>myproject</artifactId>
 7     <version>0.0.1-SNAPSHOT</version>
 8     <properties>
 9         <java.version>1.8</java.version>
10     </properties>
11     <parent>
12         <groupId>org.springframework.boot</groupId>
13         <artifactId>spring-boot-starter-parent</artifactId>
14         <version>1.3.1.RELEASE</version>
15     </parent>
16     <dependencies>
17         <dependency>
18             <groupId>org.springframework.boot</groupId>
19             <artifactId>spring-boot-starter-web</artifactId>
20         </dependency>
21         <dependency>
22             <groupId>org.springframework.boot</groupId>
23             <artifactId>spring-boot-starter-data-jpa</artifactId>
24         </dependency>
25         <dependency>
26             <groupId>com.h2database</groupId>
27             <artifactId>h2</artifactId>
28             <scope>runtime</scope>
29         </dependency>
30         <dependency>
31             <groupId>org.springframework.boot</groupId>
32             <artifactId>spring-boot-starter-security</artifactId>
33         </dependency>
34     </dependencies>
35 </project>

(2)修改Application.java

 1 package simple;
 2 
 3 import org.springframework.boot.*;
 4 import org.springframework.boot.autoconfigure.*;
 5 import org.springframework.context.annotation.Bean;
 6 import org.springframework.security.config.annotation.method.configuration.*;
 7 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 8 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 9 import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
10 
11 import simple.controller.*;
12 
13 @EnableAutoConfiguration
14 @EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
15 public class Application {
16 
17     public static void main(String[] args) throws Exception {
18         SpringApplication.run(new Object[] { Application.class, HomeController.class }, args);
19     }
20 
21     @Bean
22     public WebSecurityConfigurerAdapter webSecurityConfigurerAdapter() {
23         return new MyWebSecurityConfigurer();
24     }
25 
26     public static class MyWebSecurityConfigurer extends WebSecurityConfigurerAdapter {
27         @Override
28         protected void configure(HttpSecurity http) throws Exception {
29             http.csrf().disable();
30             http.authorizeRequests().antMatchers("/account**", "/admin**").authenticated();
31             http.formLogin().usernameParameter("userName").passwordParameter("password").loginPage("/login")
32                     .loginProcessingUrl("/login").successHandler(new SavedRequestAwareAuthenticationSuccessHandler())
33                     .and().logout().logoutUrl("/logout").logoutSuccessUrl("/");
34             http.rememberMe().rememberMeParameter("rememberMe");
35 
36         }
37     }
38 }

訪問http://localhost:8080/account會自動跳轉到login登入頁。Spring Security的具體使用前文已有所述。

參考:

(1)https://github.com/spring-projects/spring-boot

(2)http://projects.spring.io/spring-boot/

(3)https://github.com/qibaoguang/Spring-Boot-Reference-Guide/blob/master/SUMMARY.md

相關文章