自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解讀 Spring Boot 核心知識(shí)點(diǎn)全覽

開(kāi)發(fā)
當(dāng)我們深入探究 Spring Boot 的世界,會(huì)發(fā)現(xiàn)其中蘊(yùn)含著豐富而關(guān)鍵的核心知識(shí)點(diǎn),這些知識(shí)點(diǎn)猶如構(gòu)建大廈的基石,支撐著整個(gè)應(yīng)用的高效運(yùn)行。

在當(dāng)今的軟件開(kāi)發(fā)領(lǐng)域,Spring Boot 猶如一顆璀璨的明星,散發(fā)著耀眼的光芒。它以其強(qiáng)大的功能和便捷的特性,成為了眾多開(kāi)發(fā)者的首選框架。當(dāng)我們深入探究 Spring Boot 的世界,會(huì)發(fā)現(xiàn)其中蘊(yùn)含著豐富而關(guān)鍵的核心知識(shí)點(diǎn),這些知識(shí)點(diǎn)猶如構(gòu)建大廈的基石,支撐著整個(gè)應(yīng)用的高效運(yùn)行。

為什么需要Spring boot

Spring框架是輕量級(jí)Java框架,他完全可以基于配置+一些POJO(簡(jiǎn)單的Java對(duì)象,不是JavaBean, EntityBean 或者 SessionBean,無(wú)需擔(dān)任任何的角色)即可完成一套web服務(wù)器開(kāi)發(fā)。 盡管是輕量級(jí),但是還是需要配置大量的xml,而Spring boot則將繁瑣的配置全部封裝起來(lái),使得我們可以開(kāi)箱即用。

相較于原生的Spring他有著如下優(yōu)點(diǎn):

  1. 可以非常方便的開(kāi)發(fā)出Spring應(yīng)用容器。
  2. 基于Spring boot開(kāi)發(fā)應(yīng)用的時(shí)間比Spring要少很多,生產(chǎn)力明顯提高了。
  3. 可以非常方便集成其他Spring組件,例如Spring JDBC、Spring ORM等。
  4. Spring boot內(nèi)嵌了web容器,例如tomcat服務(wù)器,也可以改為jetty。
  5. Spring boot內(nèi)部提供的CLI命令行工具,例如java或者Groovy。
  6. 無(wú)需編寫(xiě)大量的xml配置文件。
  7. Spring Boot 遵循“固執(zhí)己見(jiàn)的默認(rèn)配置”,以減少開(kāi)發(fā)工作(默認(rèn)配置可以修改)。
  8. Spring boot內(nèi)部也提供了許多的插件,例如Maven 或Gradle,使得我們的可以快速的開(kāi)發(fā)或者測(cè)試Spring應(yīng)用。

什么是Spring Boot Starters

原本我們開(kāi)發(fā)web應(yīng)用需要手動(dòng)引入mvc、jackson等各種依賴(lài),有了Starters之后,我們只需引入一個(gè)Starters依賴(lài)即可完成所有Spring web應(yīng)用的配置,非常方便。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

SpringBoot應(yīng)用Starters基本的一共有44種,具體如下:

1)spring-boot-starter 這是Spring Boot的核心啟動(dòng)器,包含了自動(dòng)配置、日志和YAML。

2)spring-boot-starter-actuator 幫助監(jiān)控和管理應(yīng)用。

3)spring-boot-starter-amqp 通過(guò)spring-rabbit來(lái)支持AMQP協(xié)議(Advanced Message Queuing Protocol)。

4)spring-boot-starter-aop 支持面向方面的編程即AOP,包括spring-aop和AspectJ。

5)spring-boot-starter-artemis 通過(guò)Apache Artemis支持JMS的API(Java?Message Service API)。

6)spring-boot-starter-batch 支持Spring Batch,包括HSQLDB數(shù)據(jù)庫(kù)。

7)spring-boot-starter-cache 支持Spring的Cache抽象。

8)spring-boot-starter-cloud-connectors 支持Spring Cloud Connectors,簡(jiǎn)化了在像Cloud Foundry或Heroku這樣的云平臺(tái)上連接服務(wù)。

9)spring-boot-starter-data-elasticsearch 支持ElasticSearch搜索和分析引擎,包括spring-data-elasticsearch。

10)spring-boot-starter-data-gemfire 支持GemFire分布式數(shù)據(jù)存儲(chǔ),包括spring-data-gemfire。

11)spring-boot-starter-data-jpa 支持JPA(Java Persistence API),包括spring-data-jpa、spring-orm、hibernate。

12)spring-boot-starter-data-MongoDB 支持MongoDB數(shù)據(jù),包括spring-data-mongodb。

13)spring-boot-starter-data-rest 通過(guò)spring-data-rest-webmvc,支持通過(guò)REST暴露Spring Data數(shù)據(jù)倉(cāng)庫(kù)。

14)spring-boot-starter-data-solr 支持Apache Solr搜索平臺(tái),包括spring-data-solr。

15)spring-boot-starter-freemarker 支持FreeMarker模板引擎。

16)spring-boot-starter-groovy-templates 支持Groovy模板引擎。

17)spring-boot-starter-hateoas 通過(guò)spring-hateoas支持基于HATEOAS的RESTful Web服務(wù)。

18)spring-boot-starter-hornetq 通過(guò)HornetQ支持JMS。

19)spring-boot-starter-integration 支持通用的spring-integration模塊。

20)spring-boot-starter-jdbc 支持JDBC數(shù)據(jù)庫(kù)。

21)spring-boot-starter-jersey 支持Jersey RESTful Web服務(wù)框架。

22)spring-boot-starter-jta-atomikos 通過(guò)Atomikos支持JTA分布式事務(wù)處理。

23)spring-boot-starter-jta-bitronix 通過(guò)Bitronix支持JTA分布式事務(wù)處理。

24)spring-boot-starter-mail 支持javax.mail模塊。

25)spring-boot-starter-mobile 支持spring-mobile。

26)spring-boot-starter-mustache 支持Mustache模板引擎。

27)spring-boot-starter-Redis 支持Redis鍵值存儲(chǔ)數(shù)據(jù)庫(kù),包括spring-redis。

28)spring-boot-starter-security 支持spring-security。

29)spring-boot-starter-social-facebook 支持spring-social-facebook

30)spring-boot-starter-social-linkedin 支持pring-social-linkedin

31)spring-boot-starter-social-twitter 支持pring-social-twitter

32)spring-boot-starter-test 支持常規(guī)的測(cè)試依賴(lài),包括JUnit、Hamcrest、Mockito以及spring-test模塊。

33)spring-boot-starter-thymeleaf 支持Thymeleaf模板引擎,包括與Spring的集成。

34)spring-boot-starter-velocity 支持Velocity模板引擎。

35)spring-boot-starter-web S支持全棧式Web開(kāi)發(fā),包括Tomcat和spring-webmvc。

36)spring-boot-starter-websocket 支持WebSocket開(kāi)發(fā)。

37)spring-boot-starter-ws 支持Spring Web Services。

Spring Boot應(yīng)用啟動(dòng)器面向生產(chǎn)環(huán)境的還有2種,具體如下:

38)spring-boot-starter-actuator 增加了面向產(chǎn)品上線相關(guān)的功能,比如測(cè)量和監(jiān)控。

39)spring-boot-starter-remote-shell 增加了遠(yuǎn)程ssh shell的支持。

最后,Spring Boot應(yīng)用啟動(dòng)器還有一些替換技術(shù)的啟動(dòng)器,具體如下:

40)spring-boot-starter-jetty 引入了Jetty HTTP引擎(用于替換Tomcat)。

41)spring-boot-starter-log4j 支持Log4J日志框架。

42)spring-boot-starter-logging 引入了Spring Boot默認(rèn)的日志框架Logback。

43)spring-boot-starter-tomcat 引入了Spring Boot默認(rèn)的HTTP引擎Tomcat。

44)spring-boot-starter-undertow 引入了Undertow HTTP引擎(用于替換Tomcat)。

Spring Boot 支持哪些內(nèi)嵌 Servlet

Spring支持的內(nèi)嵌Servlet有3種:

  • Tomcat (這個(gè)是默認(rèn)的容器)
  • Jetty
  • Undertow

正是因?yàn)镾pring boot內(nèi)嵌了web容器,使得我們啟動(dòng)web程序就像啟動(dòng)普通Java程序的一樣方便,由于Spring boot默認(rèn)使用的web容器是Tomcat ,如果我們想修改可以使用下面這種方式排除tomcat容器,再引入其他容器

<!--從Web啟動(dòng)器依賴(lài)中排除Tomcat-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--添加Jetty依賴(lài)-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

詳解@SpringBootApplication 這個(gè)注解

這個(gè)注解我們完全可以通過(guò)源碼就知道它大概做的實(shí)際,如下所示,可以看到SpringBootApplication 主要是由SpringBootConfiguration、EnableAutoConfiguration、ComponentScan構(gòu)成。這三個(gè)注解分別是意思是:

  • SpringBootConfiguration內(nèi)部有一個(gè)Configuration注解,所以它的意思是允許在上下文開(kāi)啟額外bean或者其他配置類(lèi)。
  • EnableAutoConfiguration啟用Spring boot自動(dòng)配置機(jī)制。
  • ComponentScan自動(dòng)掃描當(dāng)前類(lèi)的包下的所有被@Component (@Service,@Controller)注解的類(lèi)。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
.....
}

Spring是如何啟動(dòng)的(重點(diǎn))

總結(jié)一下大概有9個(gè)步驟:

  1. 創(chuàng)建監(jiān)聽(tīng),并準(zhǔn)備監(jiān)聽(tīng)。
  2. 容器環(huán)境預(yù)配置。
  3. 打印banner。
  4. 創(chuàng)建應(yīng)用上下文即applicationContextFactory。
  5. 容器刷新前置處理:進(jìn)行應(yīng)用上下文各種配置初始化,拿到我們的啟動(dòng)類(lèi)元信息生成BeanDefinition存入beanDefinitionMap中。
  6. 容器刷新,即走到Spring的IOC邏輯,手機(jī)配置、注解中的bean信息存入beanDefinitionMap,然后進(jìn)行bean的創(chuàng)建和注入。
  7. 容器刷新后置處理,默認(rèn)為空。
  8. 發(fā)出容器刷新結(jié)束事件ApplicationReadyEvent通知。
  9. 調(diào)用callRunners獲取所有容器中的ApplicationRunner和CommandLineRunner的run方法并執(zhí)行。

對(duì)應(yīng)的我們給出源碼即SpringApplication下的run方法,讀者可參考上述流程閱讀一下下面這段源碼:

public ConfigurableApplicationContext run(String... args) {
  //......
  // 1. 獲取并啟動(dòng)監(jiān)聽(tīng)
  SpringApplicationRunListeners listeners = getRunListeners(args);
  listeners.starting(bootstrapContext, this.mainApplicationClass);
  try {
   ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
   //2. 項(xiàng)目環(huán)境environment 預(yù)配置
   ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
   configureIgnoreBeanInfo(environment);
   //打印banner,此時(shí)控制臺(tái)會(huì)輸出一個(gè)banner
   Banner printedBanner = printBanner(environment);
   //3. 創(chuàng)建Sring容器
   context = createApplicationContext();
   context.setApplicationStartup(this.applicationStartup);
   //4. 容器刷新前置處理,進(jìn)行應(yīng)用上下文各種配置信息初始化,并將當(dāng)前啟動(dòng)類(lèi)存入beanDefinitionMap中
   prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
   //5.刷新容器,這里會(huì)進(jìn)行IOC相關(guān)操作
   refreshContext(context);
   //6. 容器刷新后置操作,默認(rèn)空實(shí)現(xiàn)
   afterRefresh(context, applicationArguments);
   Duration timeTakenToStartup = Duration.ofNanos(System.nanoTime() - startTime);
   if (this.logStartupInfo) {
    new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), timeTakenToStartup);
   }
   // 7. 發(fā)出執(zhí)行結(jié)束的ApplicationReadyEvent事件通知
   listeners.started(context, timeTakenToStartup);
   //8. 調(diào)用runner,完成啟動(dòng)后的特定命令
   callRunners(context, applicationArguments);
  }
  catch (Throwable ex) {
   //......
  }
  
  //9. 返回上下文
  return context;
 }

Spring Boot 的自動(dòng)裝配是如何實(shí)現(xiàn)的

關(guān)于spring自動(dòng)裝配的原理和使用,建議閱讀筆者這篇文章,里面有詳盡的分析和實(shí)踐:

Spring Boot 自動(dòng)裝配原理以及實(shí)踐

為什么會(huì)有yml格式的文件,和properties區(qū)別是什么

相比于properties,yml格式的文件結(jié)構(gòu)更加清晰,更易于閱讀和理解,但是缺點(diǎn)也很明顯,因?yàn)楦袷降膰?yán)格要求,很可能因?yàn)楦袷皆驅(qū)е屡渲脽o(wú)法讀取,以筆者為例,線上配置seata配置時(shí)明明注冊(cè)地址,但是服務(wù)始終讀取不到配置,導(dǎo)致啟動(dòng)失敗,這種問(wèn)題是肉眼無(wú)法觀察的:

而且yml還有一個(gè)缺點(diǎn)即@PropertySource 這個(gè)注解無(wú)法讀取yml格式的配置數(shù)據(jù)。

Spring Boot 常用的讀取配置文件的方法

通過(guò) @value 讀取簡(jiǎn)單直觀的配置:為了演示這種讀取方式,我們可以在resource目錄下建立一個(gè) application.yml文件

配置文件內(nèi)容為:

myConfig: 這個(gè)是helloworld配置的具體內(nèi)容哦

后續(xù)如果我們希望獲取到myConfig這個(gè)值的話,只需按照下面這種方式引入即可,注意value注解獲取配置值的方式,Spring并不推薦使用。

 @Value("${myConfig}")
 private String value;

(1) 通過(guò)@ConfigurationProperties讀取并與 bean 綁定:

這種方式相較于上面那種更加強(qiáng)大,可以與bean綁定,例如我們yml的配置文件內(nèi)容如下(注意配置名稱(chēng)必須全小寫(xiě),否則會(huì)報(bào)一些奇怪的錯(cuò)誤)

myobj:
  name: out-side-config
  email: out-side-config@qq.com

那么我們就可以編寫(xiě)一個(gè)類(lèi),代碼如下所示,使用ConfigurationProperties引入前綴為myobj的配置內(nèi)容即可,該配置就會(huì)將myobj前綴下的所有配置和我們的類(lèi)綁定

/**
 * 注意 yml配置文件不能有大寫(xiě)字母
 */
@ConfigurationProperties(prefix = "myobj")
public class MyObj {

    private String name;

    private String email;


    //......get、set
}

(2) @PropertySource讀取指定的 properties 文件

有時(shí)候我們希望指定配置文件和類(lèi)進(jìn)行綁定,那么我們就可以使用PropertySource注解,例如我們?cè)趓esource目錄下有個(gè)student.properties文件,內(nèi)容為:

name:xiaoming
no:18 

我們只需使用PropertySource執(zhí)行路徑以及配置文件名,再配合value即可完成屬性綁定。

@Component
@PropertySource("classpath:student.properties")
public class Student {

    @Value("${name}")
    private String name;
    @Value("${no}")
    private String no;


     //......get、set
}

Spring Boot 加載配置文件的優(yōu)先級(jí)

大體來(lái)說(shuō)優(yōu)先考慮外部、properties或者yml指明profile的文件:

  • 命令行參數(shù)。所有的配置都可以在命令行上進(jìn)行指定。
  • 操作系統(tǒng)環(huán)境變量 。
  • jar包外部的application-{profile}.properties或帶spring.profile的application.yml配置文件
  • jar包內(nèi)部的application-{profile}.properties或帶spring.profile的application.yml配置文件,再來(lái)加載不帶profile。
  • jar包外部的application.properties或不帶spring.profile的application.yml配置文件
  • jar包內(nèi)部的application.properties或不帶spring.profile的application.yml配置文件

常用的 Bean 映射工具有哪些

常見(jiàn)的是:MapStruct、ModelMapper、Dozer、Orika、JMapper 這幾種吧。

最常用的還是MapStruct,它的工作原理也很簡(jiǎn)單,我們聲明一個(gè)轉(zhuǎn)換接口后,它會(huì)在編譯期為了我們生成轉(zhuǎn)換實(shí)現(xiàn)類(lèi)的字節(jié)碼文件。

對(duì)此我們不妨距離一下它的使用方式,首先引入版本號(hào)、依賴(lài)、插件。

  • 版本號(hào):
 <properties>
        <java.version>1.8</java.version>
        <org.mapstruct.version>1.5.3.Final</org.mapstruct.version>
    </properties>
  • 依賴(lài):
<!--mapstruct依賴(lài)-->
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
  • 插件:
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>

例如我們現(xiàn)在有個(gè)Doctor 希望轉(zhuǎn)為DoctorDTO類(lèi),代碼如下所示:

public class Doctor {
    private Integer id;

    private String name;

    private String srcAddr;


    //......get、set
    }
}

DoctorDTO 類(lèi),可以看出地址的字段名為dstAddr,和上面的srcAddr有區(qū)別:

public class DoctorDTO {

    private Integer id;

    private String name;

    private String dstAddr;


    //......get、set
}

所以我們編寫(xiě)一個(gè)接口,如下所示,對(duì)于字段名不一樣的,我們使用Mapping手動(dòng)配置映射關(guān)系:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;


@Mapper
public interface DoctorMapper {

    DoctorMapper INSTANCE = Mappers.getMapper(DoctorMapper.class);

    /**
     * 會(huì)在編譯期生成
     * @param doctor
     * @return
     */
    @Mapping(source = "srcAddr", target = "dstAddr")
    DoctorDTO toDTO(Doctor doctor);
}

測(cè)試代碼,可以看到bean轉(zhuǎn)換完成:

@Test
 public void testToDTO() {
  Integer doctorId = 15;
  String doctorName = "xiaoming";

  Doctor doctor = new Doctor();
  doctor.setId(doctorId);
  doctor.setName(doctorName);
  doctor.setSrcAddr("中國(guó)北京");

  DoctorDTO doctorDTO = DoctorMapper.INSTANCE.toDTO(doctor);

  // 輸出結(jié)果 DoctorDTO{id=15, name='xiaoming', dstAddr='中國(guó)北京'}
        System.out.println(doctorDTO);
  assertEquals(doctorId, doctorDTO.getId());
  assertEquals(doctorName, doctorDTO.getName());
 }

通過(guò)源碼我們可以看到這個(gè)接口的實(shí)現(xiàn)類(lèi)會(huì)在編譯器生成:

Spring Boot 如何監(jiān)控系統(tǒng)實(shí)際運(yùn)行狀況

引入spring-boot-starter-actuator的依賴(lài):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

然后鍵入下面的地址即可查看對(duì)應(yīng)端點(diǎn)的信息:http://localhost:8080/actuator

Spring Boot 如何做請(qǐng)求參數(shù)校驗(yàn)

有兩種校驗(yàn)框架,一個(gè)是Hibernate Validator,還有一個(gè)是JSR(Java Specification Requests)校驗(yàn),后者比較常用,無(wú)需引入特殊的依賴(lài)。就例如我們現(xiàn)在有個(gè)Person類(lèi),希望名字不為空,性別是是數(shù)字最大值為2,而email必須為郵箱格式,那么我們就可以基于JSR的注解進(jìn)行說(shuō)明。

public class Person {

    @NotNull(message = "姓名不可為空")
    @Size(max = 10, message = "姓名長(zhǎng)度不可超過(guò)10位")
    private String name;

    @Max(value = 2, message = "性別最大值只能為2")
    private int sex;
    @Email(message = "郵箱格式不正確")
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

當(dāng)他作為controller的requestBody的參數(shù)時(shí),用法如下所示:

 @PostMapping("/test/hello")
    public void hello(@Valid Person person) {
        logger.info("hello {}", person.getName());
    }

假如我們想校驗(yàn)路徑參數(shù)時(shí),我們只需在Controller上方加一個(gè)注解@Validated,然后對(duì)于路徑參數(shù)加入校驗(yàn)注解Valid +校驗(yàn)規(guī)則注解即可即可。

@GetMapping("/test/hello2/{id}")
    public void hello2(@Valid @PathVariable("id") @Max(value = 5,message = "最大值為5") Integer  id) {
        logger.info("hello {}", id);
    }

補(bǔ)充一下常見(jiàn)的一些校驗(yàn)注解:

1. @NotEmpty 被注釋的字符串的不能為 null 也不能為空
2. @NotBlank 被注釋的字符串非 null,并且必須包含一個(gè)非空白字符
3. @Null 被注釋的元素必須為 null
4. @NotNull 被注釋的元素必須不為 null
5. @AssertTrue 被注釋的元素必須為 true
6. @AssertFalse 被注釋的元素必須為 false
7. @Pattern(regex=,flag=)被注釋的元素必須符合指定的正則表達(dá)式
8. @Email 被注釋的元素必須是 Email 格式。
9. @Min(value)被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值
10. @Max(value)被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值
11. @DecimalMin(value)被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值
12. @DecimalMax(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值
13. @Size(max=, min=)被注釋的元素的大小必須在指定的范圍內(nèi)
14. @Digits(integer, fraction)被注釋的元素必須是一個(gè)數(shù)字,其值必須在可接受的范圍內(nèi)
15. @Past被注釋的元素必須是一個(gè)過(guò)去的日期
16. @Future 被注釋的元素必須是一個(gè)將來(lái)的日期

如何使用 Spring Boot 進(jìn)行全局異常處理

通過(guò)@ControllerAdvice將控制器聲明為增強(qiáng)器,然后通過(guò)ExceptionHandler 對(duì)自己自己的異常進(jìn)行處理。 例如我們想處理所有控制器的BindException,代碼如下所示:

/**
 * 統(tǒng)一異常處理、數(shù)據(jù)預(yù)處理等
 */
@ControllerAdvice
public class ControllerExceptionHandler {

    private static final Logger LOG = LoggerFactory.getLogger(ControllerExceptionHandler.class);

    /**
     * 校驗(yàn)異常統(tǒng)一處理
     * @param e
     * @return
     */
    @ExceptionHandler(value = BindException.class)
    @ResponseBody
    public CommonResp validExceptionHandler(BindException e) {
        CommonResp commonResp = new CommonResp();
        LOG.warn("參數(shù)校驗(yàn)失?。簕}", e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        commonResp.setSuccess(false);
        commonResp.setMessage(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
        return commonResp;
    }


}

Spring Boot 中如何實(shí)現(xiàn)定時(shí)任務(wù)

首先在啟動(dòng)類(lèi)中添加@EnableScheduling注解,然后編寫(xiě)一個(gè)定時(shí)任務(wù)bean,然后在定時(shí)任務(wù)的方法上添加@Scheduled注解:

@Component
@EnableAsync
//@EnableAsync 和 @Async 使定時(shí)任務(wù)并行執(zhí)行
public class AsyncScheduledTasks {
    private static final Logger log = LoggerFactory.getLogger(AsyncScheduledTasks.class);
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    private List<Integer> index = Arrays.asList(6, 6, 2, 3);
    int i = 0;

    @Scheduled(fixedRate = 5000)
    @Async
    public void reportCurrentTimeWithFixedRate() {
        log.info("Current Thread : {}", Thread.currentThread().getName());

        if (i == 0) {
            log.info("Start time is {}", dateFormat.format(new Date()));
        }
        if (i < 4) {
            try {
                TimeUnit.SECONDS.sleep(index.get(i));
                log.info("Fixed Rate Task : The time is now {}", dateFormat.format(new Date()));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            i++;
        }
    }

}
責(zé)任編輯:趙寧寧 來(lái)源: 寫(xiě)代碼的SharkChili
相關(guān)推薦

2021-04-13 08:25:12

測(cè)試開(kāi)發(fā)Java注解Spring

2021-12-30 08:17:27

Springboot數(shù)據(jù)訪問(wèn)DataSourceB

2020-11-06 00:50:16

JavaClassLoaderJVM

2021-01-15 08:35:49

Zookeeper

2020-10-26 10:40:31

Axios前端攔截器

2021-01-06 13:52:19

zookeeper開(kāi)源分布式

2024-11-04 09:00:00

Java開(kāi)發(fā)

2025-03-26 11:30:40

2024-04-23 14:25:16

Python備忘清單

2020-05-19 14:40:08

Linux互聯(lián)網(wǎng)核心

2022-10-29 08:55:19

頁(yè)面react

2016-05-30 17:31:34

Spring框架

2022-04-08 07:51:31

JavaJVM垃圾回收

2024-06-04 14:07:00

2023-08-07 14:44:56

Socket文件描述符

2021-12-27 10:20:46

JavaNetty網(wǎng)絡(luò)

2017-03-07 13:03:34

AndroidView知識(shí)問(wèn)答

2024-07-29 11:21:24

2010-08-17 14:56:00

HCNE認(rèn)證

2011-04-15 12:25:21

BGP路由
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)