太強(qiáng)了!Spring Boot 五大內(nèi)置“神兵”工具
環(huán)境:SpringBoot3.4.2
1. JSON解析工具
當(dāng)我們需要在代碼中手動(dòng)解析 JSON 字符串時(shí),通常會(huì)根據(jù)當(dāng)前環(huán)境使用的具體 JSON 解析庫(kù)來(lái)進(jìn)行操作。如下:
使用jackson時(shí),我們通常會(huì)通過(guò)如下兩種方式進(jìn)行解析json字符串:
// 方式1:直接注入
@Resource
private ObjectMapper objectMapper ;
// 方式2:手動(dòng)創(chuàng)建對(duì)象
ObjectMapper mapper = new ObjectMapper() ;如果使用其它的庫(kù),如gson,那么你就需要?jiǎng)?chuàng)建改庫(kù)的解析器,如下:
Gson gson = new GsonBuilder().create()其實(shí),SpringBoot為我們提供了一個(gè)工廠類,通過(guò)該工廠類我們不需要知道底層使用的具體什么庫(kù),該工廠類會(huì)自動(dòng)判斷選擇。
String json = """
      {
        "name": "pack",
        "sex": "男",
        "age": 22,
        "idNo": "640522199303092164"
      }
    """ ;
JsonParser jsonParser = JsonParserFactory.getJsonParser() ;
Map<String, Object> ret = jsonParser.parseMap(json) ;
System.err.println(ret) ;輸出結(jié)果
{name=pack, sex=男, age=22, idNo=640522199303092164}該工廠內(nèi)部實(shí)現(xiàn):
圖片
2. 執(zhí)行數(shù)據(jù)庫(kù)腳本
當(dāng)我們?cè)陧?xiàng)目中,需要在服務(wù)啟動(dòng)時(shí)自動(dòng)的執(zhí)行sql腳本,我們可以通過(guò)定義如下的bean對(duì)象。
@Configuration
public class DatabaseScriptExecution {
  @Bean
  DataSourceScriptDatabaseInitializer databaseInitializer(DataSource dataSource) {
    DatabaseInitializationSettings settings = new DatabaseInitializationSettings() ;
    settings.setEncoding(StandardCharsets.UTF_8) ;
    settings.setSchemaLocations(List.of("classpath:db/db.sql", 
        "optional:classpath:db/data.sql")) ;
    DataSourceScriptDatabaseInitializer init = new DataSourceScriptDatabaseInitializer(dataSource, settings) ;
    return init ;
  }
}在具體的資源前,我們可以通過(guò) optional: 前綴來(lái)設(shè)置該資源是可選的,也就是如果該資源不存在也不會(huì)引發(fā)錯(cuò)誤。
以上通過(guò)代碼自定義配置,其實(shí)在Spring Boot中,已經(jīng)為我們提供了功能,可以通過(guò)配置自動(dòng)的執(zhí)行腳本,如下配置:
spring:
  sql:
    init:
      mode: always
      username: root
      password: xxxooo
      encoding: UTF-8
      schema-locations:
      - optional:classpath:db/schema.sql
      data-locations:
      - optional:classpath:db/data.sql3. 自定義數(shù)據(jù)源配置
當(dāng)我們需要自定義數(shù)據(jù)源DataSource bean的配置時(shí),我們可以通過(guò)DataSourceBuilder類快捷創(chuàng)建:
@Configuration
public class DataSourceConfig {
  @Bean
  DataSource createDataSource() {
    return DataSourceBuilder.create()
      .type(HikariDataSource.class)
      .driverClassName("com.mysql.cj.jdbc.Driver")
      .url("jdbc:mysql://localhost:3306/ds2")
      .username("root")
      .password("xxxooo")
      .build();
  }
}該構(gòu)建器支持以下連接池 DataSource 實(shí)現(xiàn)類型。當(dāng)未顯式設(shè)置類型時(shí),將選擇第一個(gè)可用的連接池實(shí)現(xiàn):
- Hikari(com.zaxxer.hikari.HikariDataSource)
 - Tomcat JDBC Pool(org.apache.tomcat.jdbc.pool.DataSource)
 - Apache DBCP2(org.apache.commons.dbcp2.BasicDataSource)
 - Oracle UCP(oracle.ucp.jdbc.PoolDataSourceImpl)
 - C3P0(com.mchange.v2.c3p0.ComboPooledDataSource)
 
4. properties&yaml解析器
當(dāng)需要讀取properties或者yaml配置文件時(shí),Spring Boot為我們分別提供了讀取properties和yaml兩種格式文件的工具類,如下示例:
properties文件
PropertiesPropertySourceLoader loader = new PropertiesPropertySourceLoader() ;
ClassPathResource resource = new ClassPathResource("user.properties") ;
List<PropertySource<?>> sources = loader.load("user", resource) ;
sources.forEach(source -> {
  System.err.println(source.getName() + "@" + source.getSource()) ;
}) ;輸出結(jié)果
user@{pack.name=pack, pack.versinotallow=1.0.0, pack.title=xxxooo}yaml文件
YamlPropertySourceLoader loader = new YamlPropertySourceLoader() ;
// ...其它代碼都與上面一致如果你希望定義成一個(gè)bean,那么你還可以通過(guò)如下的方式:
@Bean
YamlPropertiesFactoryBean yamlFactoryBean() {
  YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean() ;
  factory.setResources(new ClassPathResource("user.yaml")) ;
  return factory ;
}5. 數(shù)據(jù)綁定
有時(shí),我們可能需要在程序中通過(guò)編碼的方式將配置信息綁定到一個(gè)對(duì)象上,那么我們可以通過(guò)Binder完成此功能:
// 實(shí)際Environment對(duì)象,我們只需要注入即可
StandardEnvironment env = new StandardEnvironment() ;
env.getPropertySources().addFirst(
    new SimpleCommandLinePropertySource("--pack.title=xxxooo", "---pack.versinotallow=1.0.0")) ;
Binder binder = Binder.get(env) ;
BindResult<App> result = binder.bind("pack", App.class) ;
System.err.println(result.get()) ;
public static record App(String title, String version) {}輸出結(jié)果
App[title=xxxooo, versinotallow=1.0.0]綁定請(qǐng)求參數(shù)
如果你需要將HttpServletRequest中的參數(shù)綁定到對(duì)象,那么你可以如下操作:
DataBinder bbb = new DataBinder(new App()) ;
HttpServletRequest request = ... ;
PropertyValues values = new ServletRequestParameterPropertyValues(request) ;
bbb.bind(values) ;
Object target = bbb.getTarget() ;有效性校驗(yàn)
如果你還需要對(duì)數(shù)據(jù)的有效性進(jìn)行校驗(yàn),那么你可以如下操作:
DataBinder bbb = new DataBinder(new App()) ;
// 設(shè)置校驗(yàn)器,在Spring Boot環(huán)境下,你可以直接注入該對(duì)象
LocalValidatorFactoryBean validator = ... ;
bbb.setValidator(validator);
// 校驗(yàn)數(shù)據(jù)
bbb.validate();
bbb.getBindingResult().getFieldErrors().forEach(error -> {
  System.err.println(error.getField() + " @ " + error.getDefaultMessage()) ;
});
// App實(shí)體對(duì)象
public class App {
  @NotEmpty(message = "標(biāo)題不能空")
  private String title ;
  private String version ;
}














 
 
 















 
 
 
 