SpringBoot從零到上線

 

SpringBoot精要

 SpringBoot的四個核心

    1.自動配置:針對不少Spring應用程序常見的應用功能,SpringBoot能自動提供相關配置。java

      在任何Spring應用程序的源代碼中,均可以找到java配置或XML配置,他們爲應用程序開啓了特定的特性和功能。mysql

    2.起步依賴:告訴SpringBoot須要什麼功能,他就能引入須要的庫。web

      SpringBoot起步依賴基本都以spring-boot-starter打頭,隨後是直接表明其功能的名字,好比web、test。redis

    3.命令行界面:這是SpringBoot的可選特性,藉此你只需寫代碼就能完成完整的應用程序,無需傳統項目構建。spring

    4.Actuator:讓你可以深刻運行中的SpringBoot應用程序,一探究竟。
      Spring應用程序上下文裏配置的Bean
      SpringBoot的自動配置作的決策
      應用程序取到的環境變量、系統屬性、配置屬性和命令行參數
      應用程序裏線程的當前狀態
      應用程序最近處理過的HTTP請求的追蹤狀況
      各類和內存用量、垃圾回收、Web請求以及數據源用量的相關指標sql

  SpringBoot不是什麼

    SpringBoot不是應用服務器bootstrap

      SpringBoot能夠把Web應用程序變爲可自執行的JAR文件,不用部署到傳統Java應用服務器裏就能在命令行裏運行。SpringBoot在應用程序裏嵌入了一個Servlet容器(tomcat、Jetty或Undertow),以此實現這一功能。但這是內嵌的Servlet容器提供的功能,不是SpringBoot實現的。緩存

    SpringBoot沒有引入任何形式的代碼生成,而是利用了Spring 4的條件化配置特性,以及Maven和Gradle提供的傳遞依賴解析,以此實現Spring應用程序上下文裏的自動配置。tomcat

    Spring4.0對條件化配置提供了支持,根據應用程序的Classpath、環境和其餘因素,運行時決策將使用哪些配置,忽略哪些配置。服務器

    從本質上來講SpringBoot就是Spring,它作了那些沒有它你本身也會作的Spring Bean配置。

  使用IEDA構建第一個SpringBoot應用

    File→newProject→SpringInitalizr

    項目建立完成後,你會看到以下圖的項目結構

    

    整個項目遵循傳統Maven或Gradle項目的佈局,即主要應用程序代碼位於src/main/java目錄裏,資源都在src/main/resource目錄裏,測試代碼則在src/test/java目錄裏。

    ReadingListAppliaction.java : 應用程序的啓動類(bootstrap class),也是主要的Spring配置類。

    Application.properties : 用於配置應用程序和SpringBoot的屬性。

    RedingListApplicationTests.java : 一個基本的集成測試類。

  1.啓動Spring

    ReadingListApplication在SpringBoot應用程序裏有兩個做用:配置和啓動引導。首先,這是主要的Spring配置類。雖然SpringBoot的自動配置免除了不少Spring配置,但你還須要少許配置來啓用自動配置。

    

    

    @SpringBootApplication開啓了Spring的組件掃描和SpringBoot的自動配置功能。實際上,@SpringBootApplicationj將三個有用的註解組合在了一塊兒。
      )1.Spring的@Configuration:標明該類使用Spring的基於Java的配置。
      )2.Spring的@ComponentScan:啓用組件掃描,這樣你寫的Web控制器和其餘組件才能被自動發現並註冊爲Spring應用上下文裏的Bean。
      )3.SpringBoot的@EnableAutoConfiguration:開啓了SpringBoot的自動配置
    要運行SpringBoot應用程序有幾種方式,其中包含傳統的war文件部署。但這裏的main()方法可讓你在命令行裏把該應用程序看成一個可執行的JAR文件來運行。這裏想SpringApplication.run()傳遞了一個ReadingListApplication類的引用,還有命令行參數,經過這些東西啓動應用程序。
    應用程序跑起來以後,會啓動一個監聽8080端口的Tomcat服務器。能夠經過localhost:8080,但因爲尚未寫控制器類,你只會收到一個HTTP 404錯誤頁面。

  2.測試SpringBoot應用

    RedingListApplicationTest不止是個用於測試的佔位符,他仍是一個例子,告訴你如何爲SpringBoot應用程序編寫測試。

    

    一個典型的Spring集成測試會用@ContextConfiguration註解標識如何加載Spring的應用程序上下文。可是,爲了充分發揮SpringBoot的魔力,這裏應該用@SpringApplication-Configuration註解。正如上圖,ReadingListApplicationTests使用@SpringApplicationConfiguration註解從ReadingListApplication配置類里加載Spring應用程序上下文。

    ReadingListApplicationTest裏還有一個簡單的測試方法,即contextLoads()。實際上它是就是個空方法。但這個空方法足以證實應用程序上下文的加載沒有問題。若是ReadingListApplication裏定義的配置是好的,就能經過測試,若是有問題,測試就會失敗。

  3.配置應用程序屬性  

    Initializr爲你生成的applicaiton.properties文件是一個空文件。實際上,這個文件徹底是可選的,能夠刪除,對程序運行沒有任何影響。
    咱們如今能夠在裏面配置一些東西
    server.port= 8000
    加上這一行,嵌入式Tomcat的監聽端口就變成了8000。
    這說明application.propeties文件能夠很方便的幫你細粒度地調整SpringBoot的自動配置,還能夠用它來指定應用程序代碼所需的配置項。
    要注意的是,徹底不用告訴SpringBoot爲你加載application.propeties,只要它存在就會被加載,Spring和應用程序代碼都能獲取其中的屬性。

  SpringBoot集成Mybatis

    在pom文件中加入Mybatis相關依賴:  

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
   

    在application.properties中加入:

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/successful_said?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Hongkong
spring.datasource.data-username=root
spring.datasource.data-password=root

    在啓動類中加入:

@MapperScan("com.example.second.demosecond.dao")

    在src/main/resource目錄下建立mapper文件(也可以使用註解開發),並在mapper文件中建立userMapper.xml,內容以下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.second.demosecond.dao.UserDao" >
    <resultMap id="BaseResultMap" type="com.example.second.demosecond.entity.User" >
        <id column="id" property="id" jdbcType="INTEGER" />
        <result column="name" property="userName" jdbcType="VARCHAR" />
        <result column="address" property="address" jdbcType="VARCHAR" />
    </resultMap>
    <sql id="Base_Column_List" >
        id, name, address
    </sql>
    <select id="selectUser" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List" />
        from user
    </select>
</mapper>

    其中, mapper標籤的namespace屬性對應的是你的Dao,resultMap的type屬性對應的是你的JavaBean。

    在你的啓動類的平級目錄下建立Entity,Dao,Controller,Service四個文件夾,並編寫相關代碼,以下。

     )1.在Entity文件夾中建立JavaBean,編輯代碼以下:

     

public class User {

    private String UserName;

    private Integer id;

    private String address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getUserName() {
        return UserName;
    }

    public void setUserName(String userName) {
        UserName = userName;
    }

}

      )2.在Dao文件夾中建立Dao,代碼以下:

import java.util.List;

@Mapper
public interface UserDao {

    List<User>  selectUser();
}

      )3.在Controller文件中建立Controller,代碼以下:

import com.example.second.demosecond.dao.UserDao;
import com.example.second.demosecond.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@EnableAutoConfiguration
@RequestMapping(value = "/boot")
public class BootController {

    @Autowired
    private UserDao userDao;
    @RequestMapping(value = "getUser")
    public User getUser()
    {
        User user=new User();
        user.setUserName("test");
        return user;
    }

    @RequestMapping(value = "getAllUser")
    public List<User> getUsers()
    {
        List<User> userList= userDao.selectUser();
        return userList;
    }
}

  SpringBoot對靜態資源的映射規則

    全部/webjars/**,都去classpath:/META-INF/resoures/webjars/找資源;
    webjars:以jar包的方式引入靜態資源;

    webjar的網站:https://www.webjars.org/

    maven中央倉庫:https://mvnrepository.com/

    頁面都放在resource/templates下

  SpringBoot整合Redis做爲緩存

    1.引入Redis的相關依賴

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
            <version>1.3.8.RELEASE</version>
        </dependency>

    2.在application.properties中配置Redis

application.properties中加入:
#Redis主機地址
spring.redis.host=

    3.測試

     我這裏使用Spring內置的RedisTemplate(也可使用jedis)

    @Autowired
    StringRedisTemplate stringRedisTemplate; //操做字符串

    @Autowired
    RedisTemplate redisTemplate; //key value

     新增一個字符串類型的值

stringRedisTemplate.opsForValue().append("msg","hello");

    讀取

stringRedisTemplate.opsForValue().get("msg");

    新增一個List類型的值

        stringRedisTemplate.opsForList().leftPush("list","xiaoming");
        stringRedisTemplate.opsForList().leftPush("list","xiaohong");

    存入對象類型的數據

        User user=userDao.findUserById(1);
        redisTemplate.opsForValue().set("emp01",user);

  存入後可以使用RedisDesktopManager這款工具來查看。

  你會發現,存入的數據爲序列化後的(亂碼),雖然不會影響正常的查詢,下面我的提供兩種解決方式:

    默認若是保存對象,使用JDK序列化機制,序列化後的數據保存到Redis中。

     將數據以JSON的方式保存

      1)本身將對象轉換成JSON

      2)改變默認的序列化規則方式

        1.建立一個類

@Configuration
public class MyRedisConfig{
    @Bean
     public RedisTemplate(Object,User)UserRedisTemplate(RedisConnectionFacation redisConntionFacation) throws UnknownHostException{
        RedisTemplate<Object,User> template = new RedisTemplate();
        templcate.setConnectionFactory(redisConnectionFacatiory);
        Jackson2JsonRedisSerializer<User> userJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<User>(User.class);
        template.setDefaultSerializer(userJackson2JsonRedisSerializer);
        return template;
  }     
} 

      2.使用@Autowired註解將方法自動裝配到controoler裏

    @Autowired
    RedisTemplate<Object, User> UserRedisTemplate;

      3.測試使用

UserRedisTemplate.opsForValue().set("emp02",user);

  SpringBoot任務

      1.測試異步任務(在啓動方法裏還要 加上 @EnableAsync 註解 纔可生效)

    @Async
    public void async(){
        try {
            Thread.sleep(3000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.print("處理數據中...");
    }

    2.測試定時任務(在啓動類裏要加上 @EnableScheduling註解纔可生效)

    @Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT")
    public void scheduled(){
        System.out.print("定時發送...");
    }

    3.郵件任務

      1)郵件發送須要引入 spring-boot-starter-mail

      2)在appilcation.properties中配置郵箱

spring.mail.username=1242919235@qq.com
#pssword本身去郵箱裏查看
spring.mail.password=
spring.mail.host=smtp.qq.com
#若是發送不出去(530)需使用如下配置
#spring.mail.properties.mail.smtp.ssl.enable=true

      3)測試

    @Autowired
    JavaMailSenderImpl javaMailSender;

    @Test
    public void email(){
        SimpleMailMessage message =new SimpleMailMessage();
        //郵件標題
        message.setSubject("今晚開會");
        //郵件內容
        message.setText("今晚7:30開會");
        //發給誰
        message.setTo("xfy19990101@163.com");
        //誰發的
        message.setFrom("1242919235@qq.com");
        javaMailSender.send(message);
    }

  SpringBoot簡化開發 —— lombok

    引入lombok依賴

      <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
        </dependency>

    lombok的一些註解

@NonNull : 註解在參數上, 若是該類參數爲 null , 就會報出異常,  throw new NullPointException(參數名)

@Cleanup : 註釋在引用變量前, 自動回收資源 默認調用 close() 方法

@Getter/@Setter : 註解在類上, 爲類提供讀寫屬性

@Getter(lazy=true) :

@ToString : 註解在類上, 爲類提供 toString() 方法

@EqualsAndHashCode : 註解在類上, 爲類提供 equals() 和 hashCode() 方法

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor : 註解在類上, 爲類提供無參,有指定必須參數, 全參構造函數

@Data : 註解在類上, 爲類提供讀寫屬性, 此外還提供了 equals()、hashCode()、toString() 方法

@Value :

@Builder : 註解在類上, 爲類提供一個內部的 Builder

@SneakThrows :

@Synchronized : 註解在方法上, 爲方法提供同步鎖

@Log :

@Log4j : 註解在類上, 爲類提供一個屬性名爲 log 的 log4j 的日誌對象

@Slf4j : 註解在類上, 爲類提供一個屬性名爲 log 的 log4j 的日誌對象

@AllArgsConstructor  生成一個無參構造

@NoArgdConstuctor    生成一個無參構造

    咱們使用@Data註解就能夠有如下註解的功能:
    @ToString
    @Getter
    @Setter
    @EqualsAnHashCode
    @NoArgsConstructor
    須要注意的是,同時使用@Data和@AllArgsConstructor後,默認的無藏構造函數失效,若是須要它,要須要設置@noArgsConstructor

  SpringBoot虛擬路徑,物理路徑的配置及跨平臺時的解決方案

    1.application.properites 中配置

    

    2.添加WebMvcConfig工具類

    3.建立文件夾

    這樣在不肯定項目部署在什麼平臺下時,有兩種選擇方案,平臺改變,只需修改配置文件便可。

  SpringBoot工程生產環境的發佈

    1.打成Jar

      使用nohup java -jar text.jar > log.txt &命令啓動工程

        log.txt : 用來存儲日誌,自動建立。
        & : 後臺運行。
        java -jar : 系統環境變量配置的jre。
        nohup : 不掛斷地運行命令,通常結合&使用。

    2.打成war(不推薦)

      1)修改pom文件

         <packaging>war</packaging> 

      2)將SpringBoot默認的tomcat設置爲provided

            <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

      3)Application啓動類繼承SpringBootServletInitializer

      4)claen package

      5)copy生成的war到tomcat的wabapps下,運行tomcat

      注:tomcat的版本必須是8及以上

相關文章
相關標籤/搜索