1.elipse中創建Springboot項目並啟動
具體創建步驟請參考:Eclipse中創建新的Spring Boot項目
2.項目的屬性配置
a.首先我們在項目的resources目錄下application.yml中添加以下內容:
server: port: 8080 #set a prefix on our URLRequestMapping #context-path: /boot str1: hello str2: world content: "str1: ${str1}, str2:${str2}" gril: name: Hanmeimei age: 21 boy: name: Lilei age: 22
談談數據綁定
b.@Value,我們在我們創建的Controller中加入
@ComponentScan(basePackages="com.huhu") @RestController public class HelloController { @Value("${str1}") private String str1; @Value("${str2}") private String str2; @Value("${content}") private String content; @RequestMapping(value ="/hello",method=RequestMethod.GET) public String say() { return str1+" "+str2+" "+content; } }
啟動結果:
c.@Component和@ConfigurationProperties的結合使用創建bean
boy.java
//把普通pojo實例化到spring容器中,相當於配置文件中的<bean id="" class=""/> @Component @ConfigurationProperties(prefix="boy") public class Boy { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
gril.java
//把普通pojo實例化到spring容器中,相當於配置文件中的<bean id="" class=""/> @Component //實現該類的屬性與application.yml中的以gril為前綴的數據匹配 @ConfigurationProperties(prefix="gril") public class Gril { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
HelloController.java
@ComponentScan(basePackages="com.huhu") @RestController public class HelloController { @Autowired private Gril gril; @Autowired private Boy boy; @RequestMapping(value ="/hello",method=RequestMethod.GET) public String say() { return gril.getName()+" "+boy.getName(); } }
啟動結果:
這里有一個問題,為什么它們都能把我們application.yml我們設置屬性怎么就顯示到網頁上了?
原因:當你沒有聲明ViewResolver時,spring會給你注冊一個默認的ViewResolver,其是JstlView的實例。
d.改變ViewResolver
首先我們在pom.xml中添加依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
然后在resources/templates/中添加huhu.xml
<!DOCTYPE html> <html> <head> <title>Insert title here</title> </head> <body> <h1>hello SpringBoot!</h1> </body> </html>
改變HelloController.java
@ComponentScan(basePackages="com.huhu") @Controller public class HelloController { @RequestMapping(value ="/hello",method=RequestMethod.GET) public String say() { return "huhu"; } }
啟動結果:
細心的你是否發現了我上面用的是@Controller,上面都用的是@RestController,我們來看一下區別吧,官方文檔里這樣說:@RestController is a stereotype annotation that combines @ResponseBody and @Controller.很顯然它包括了@ResponseBody and @Controller,上面我們改變了ViewResolver,當然要用@Controller了,json,xml也是類似的做法。
你也可以把上面的HelloController.java改成:
@ComponentScan(basePackages="com.huhu") @RestController public class HelloController {
@RequestMapping(value ="/hello",method=RequestMethod.GET)
public String say() {
return "huhu";
}
}
啟動結果:
3.SpringBoot雜談
a.SpringBoot的三種啟動

server:
port: 8081
#set a prefix on our URLRequestMapping
#context-path: /boot
str1: hello
str2: world
content: "str1: ${str1}, str2:${str2}"
gril:
name: Hanmeimei
age: 21
boy:
name: Lilei
age: 22
application-pro.yml
server:
port: 8080
#set a prefix on our URLRequestMapping
#context-path: /boot
str1: hello
str2: world
content: "str1: ${str1}, str2:${str2}"
gril:
name: Hanmeimei
age: 21
boy:
name: Lilei
age: 22
修改application.yml
spring:
profiles:
active: dev
我們分別啟動,一個用elipse,一個用第三種方法cmd
啟動結果:
有人會說,這無非就是開啟了兩個不同端口的tomcat么?這能做什么啊?
對的,我想到了可以用它配合nginx做負載均衡啊,大家可以看看這個:Nginx+Tomcat 實現負載均衡(Windows單機測試),是不是SpringBoot讓一些東西變簡單了。
4.Spring操作mysql數據庫
a.pom.xml引入兩個依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
b.在application.yml中寫入配置
datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false username: root password: taizi1203 jpa: hibernate: ddl-auto: create show-sql: true
c.創建你要在數據庫中寫的表的Bean
Dril.java
//數據持久化 @Entity public class Dril { @Id @GeneratedValue private Integer id; private String name; private Integer age; public Dril() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
d.啟動結果:
當看到這個,代表你成功了,數據庫中已經生成這個表。看到其他,請核對前面的配置
箭頭所指的體現了我們在application.yml中的,如果是create,每次都會刪掉原來的表,update只會更新,其他自己看。
e.編寫Controller和DrilService
DrilController.java
@RestController public class DrilController { @Autowired private DrilService drilService; @RequestMapping(value="/dril",method=RequestMethod.GET) public List<Dril> getDrils(){ List<Dril> drils =drilService.findAll(); return drils; } }
DrilService.java
//第一個參數是我們要返回的對象,第二個是ID extends Serializable,即我們在生成數據庫的時候指定的Id的類型 public interface DrilService extends JpaRepository<Dril,Integer>{ }
f.啟動結果
有FE助手的出現json
IE結果圖:
納悶了,頁面返回的數據怎么json了,看了一下IE中的結果,還好沒有說錯(spring默認注冊ViewResolver是JstlView)。其他操作,我就不具體做了。
JPA好像為我們做了好多事,但是他的方法才有幾個,總有點他不能干的的,如我們不通過ID來的操作數據庫,這時候我們擴展一下他:
DrilJPA.java
public interface DrilJPA extends JpaRepository<Dril,Integer>{ //通過name來查詢數據庫,findByXxxx不能亂寫 public List<Dril> findByName(String name); }
添加Controller:
@RequestMapping(value="/drils/{name}",method=RequestMethod.GET) public List<Dril> getDrilName(@PathVariable("name")String name){ List<Dril> drils =drilService.findByName(name); return drils; }
啟動結果:
5.事務管理
事務:一系列操作,要么全部成功,要么全部不成功。Spring事務管理,大家參考:Spring事務管理
DrilService.java
@Service public class DrilService { @Autowired private DrilJPA drilJPA; public void addTwo(){ Dril dril1=new Dril(); dril1.setId(3); dril1.setAge(20); dril1.setName("xiaosan"); drilJPA.save(dril1); Dril dril2=new Dril(); dril1.setId(4); dril1.setAge(24); dril1.setName("xiaosi"); drilJPA.save(dril2); } }
添加Controller
@Autowired private DrilService drilService2; @RequestMapping(value="/drils/addTwo",method=RequestMethod.GET) public void getDrilName(){ drilService2.addTwo();; }
如果運行結果成這樣,這是事務管理不想看到的,xiaosi跑路了?
SpringBoot有個解決辦法:
給Service層方法上添加@Transactional就可以解決。
@Transactional public void addTwo(){ Dril dril1=new Dril(); dril1.setId(3); dril1.setAge(20); dril1.setName("xiaosan"); drilJPA.save(dril1); Dril dril2=new Dril(); dril1.setId(4); dril1.setAge(24); dril1.setName("xiaosi"); drilJPA.save(dril2); }
好了,就分享到這里吧,后面還會更新。
謝謝大家的閱讀,博客不易,請轉載注明地址:http://www.cnblogs.com/huhu1203/p/7638054.html