SpringBoot初體驗


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的三種啟動

1.elipse或者idea一鍵啟動
2.mvn spring-boot:run
3.mvn install    cd /target   java -jar ***.jar
既然可以有多種啟動方法,我們可不可以啟動兩個,滿足我們線上和線下的開發需求呢?答案是可以:
b.分環境啟動SpringBoot
先設置我們resources中application.yml,我們復制兩個,分別起名為
application-dev.yml
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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM