最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java注解校驗(yàn)實(shí)戰(zhàn)指南

 更新時(shí)間:2026年02月12日 11:01:32   作者:雨中飄蕩的記憶  
本文詳細(xì)介紹了Java注解校驗(yàn)的核心概念和實(shí)踐,包括校驗(yàn)的基本原理、常用注解、@Valid與@Validated的區(qū)別、校驗(yàn)組的使用、自定義校驗(yàn)注解的實(shí)現(xiàn)以及在生產(chǎn)環(huán)境中的應(yīng)用策略,感興趣的朋友跟隨小編一起看看吧

一、注解校驗(yàn)概述

1.1 為什么需要注解校驗(yàn)?

在實(shí)際開發(fā)中,我們經(jīng)常需要對(duì)輸入數(shù)據(jù)進(jìn)行校驗(yàn):

// 傳統(tǒng)方式:代碼冗長(zhǎng)、難以維護(hù)
public void createUser(String username, String email, Integer age) {
    if (username == null || username.length() < 3 || username.length() > 20) {
        throw new IllegalArgumentException("用戶名長(zhǎng)度必須在3-20之間");
    }
    if (email == null || !email.matches("^[A-Za-z0-9+_.-]+@(.+)$")) {
        throw new IllegalArgumentException("郵箱格式不正確");
    }
    if (age == null || age < 18 || age > 120) {
        throw new IllegalArgumentException("年齡必須在18-120之間");
    }
    //...
}
// ? 注解校驗(yàn):簡(jiǎn)潔、聲明式、可復(fù)用
public void createUser(@Valid UserDTO userDTO) {
    //...
}

注解校驗(yàn)的優(yōu)勢(shì)

  • ? 聲明式:通過注解聲明校驗(yàn)規(guī)則,代碼更簡(jiǎn)潔
  • ? 可復(fù)用:校驗(yàn)邏輯可以復(fù)用,避免重復(fù)代碼
  • ? 易維護(hù):校驗(yàn)規(guī)則集中管理,易于維護(hù)
  • ? 標(biāo)準(zhǔn)化:遵循JSR-303/JSR-380標(biāo)準(zhǔn)
  • ? 國(guó)際化:支持國(guó)際化錯(cuò)誤消息

1.2 常用校驗(yàn)注解

Jakarta Bean Validation提供的注解

注解說明示例
@NotNull值不能為null@NotNull String name
@NotEmpty集合、字符串、數(shù)組不能為空@NotEmpty List<String> items
@NotBlank字符串不能為空白(去除首尾空格后長(zhǎng)度>0)@NotBlank String content
@Size(min, max)大小必須在指定范圍內(nèi)@Size(min=3, max=20) String name
@Min(value)數(shù)值必須大于等于指定值@Min(18) Integer age
@Max(value)數(shù)值必須小于等于指定值@Max(120) Integer age
@Email必須是有效的郵箱格式@Email String email
@Pattern(regexp)必須匹配指定的正則表達(dá)式@Pattern(regexp="^1[3-9]\\d{9}$") String phone
@Past日期必須是過去的時(shí)間@Past Date birthDate
@Future日期必須是未來的時(shí)間@Future Date appointmentDate
@AssertTrue布爾值必須是true@AssertTrue Boolean agreed
@Negative數(shù)值必須是負(fù)數(shù)@Negative Integer balance
@Positive數(shù)值必須是正數(shù)@Positive Integer amount

二、@Valid vs @Validated

2.1 核心區(qū)別

這兩個(gè)注解雖然功能相似,但有關(guān)鍵區(qū)別:

特性@Valid@Validated
來源Jakarta Bean Validation (JSR-380)Spring Framework
位置方法、字段、構(gòu)造器參數(shù)方法、類型、參數(shù)
嵌套校驗(yàn)? 支持? 支持
分組校驗(yàn)? 不支持? 支持
校驗(yàn)組序列? 不支持? 支持
Spring集成需要配置原生支持

2.2 @Valid的使用

基本用法

@Data
public class UserDTO {
    @NotNull(message = "用戶ID不能為空")
    private Long id;
    @NotBlank(message = "用戶名不能為空")
    @Size(min = 3, max = 20, message = "用戶名長(zhǎng)度必須在3-20之間")
    private String username;
    @Email(message = "郵箱格式不正確")
    @NotBlank(message = "郵箱不能為空")
    private String email;
    @Min(value = 18, message = "年齡必須大于等于18歲")
    @Max(value = 120, message = "年齡必須小于等于120歲")
    private Integer age;
}

在Controller中使用

@RestController
@RequestMapping("/api/users")
public class UserController {
    // 使用@Valid觸發(fā)校驗(yàn)
    @PostMapping
    public ResponseEntity<String> createUser(@Valid @RequestBody UserDTO userDTO) {
        // 如果校驗(yàn)失敗,會(huì)自動(dòng)拋出MethodArgumentNotValidException
        return ResponseEntity.ok("用戶創(chuàng)建成功");
    }
}

嵌套校驗(yàn)

@Data
public class OrderDTO {
    @NotNull(message = "訂單ID不能為空")
    private Long orderId;
    @Valid  // 關(guān)鍵:必須使用@Valid才能觸發(fā)嵌套對(duì)象的校驗(yàn)
    @NotNull(message = "用戶信息不能為空")
    private UserDTO user;
    @Valid
    @NotEmpty(message = "訂單項(xiàng)不能為空")
    private List<OrderItemDTO> items;
}
@Data
public class OrderItemDTO {
    @NotNull(message = "商品ID不能為空")
    private Long productId;
    @Min(value = 1, message = "數(shù)量必須大于0")
    private Integer quantity;
}

2.3 @Validated的使用

基本用法

@Service
@Validated  // 類級(jí)別添加@Validated,啟用方法參數(shù)校驗(yàn)
public class UserService {
    // 簡(jiǎn)單參數(shù)校驗(yàn)
    public void updateUser(
            @NotNull(message = "用戶ID不能為空") Long id,
            @NotBlank(message = "用戶名不能為空") String username) {
        // 業(yè)務(wù)邏輯...
    }
    // 對(duì)象校驗(yàn)
    public void createUser(@Valid UserDTO userDTO) {
        // 業(yè)務(wù)邏輯...
    }
}

分組校驗(yàn)(@Validated獨(dú)有):

public interface CreateGroup {}
public interface UpdateGroup {}
@Data
public class UserDTO {
    @Null(groups = CreateGroup.class, message = "創(chuàng)建時(shí)ID必須為空")
    @NotNull(groups = UpdateGroup.class, message = "更新時(shí)ID不能為空")
    private Long id;
    @NotBlank(groups = {CreateGroup.class, UpdateGroup.class})
    private String username;
}
@RestController
@RequestMapping("/api/users")
public class UserController {
    @PostMapping
    public ResponseEntity<String> create(
            @Validated(CreateGroup.class) @RequestBody UserDTO userDTO) {
        return ResponseEntity.ok("創(chuàng)建成功");
    }
    @PutMapping
    public ResponseEntity<String> update(
            @Validated(UpdateGroup.class) @RequestBody UserDTO userDTO) {
        return ResponseEntity.ok("更新成功");
    }
}

2.4 選擇建議

選擇決策樹

是否需要分組校驗(yàn)?
├─ 是 → 使用 @Validated
└─ 否 → 是否在Controller中?
    ├─ 是 → 兩者都可以,推薦 @Valid
    └─ 否 → 使用 @Validated

最佳實(shí)踐

  1. Controller層:使用 @Valid(簡(jiǎn)潔、夠用)
  2. Service層:使用 @Validated(支持方法參數(shù)校驗(yàn))
  3. 需要分組:必須使用 @Validated
  4. 嵌套對(duì)象:在嵌套對(duì)象字段上添加 @Valid

三、校驗(yàn)組(Validation Groups)

3.1 為什么需要校驗(yàn)組?

不同場(chǎng)景下,同一對(duì)象的校驗(yàn)規(guī)則可能不同:

// 場(chǎng)景1:新增用戶
// - id為空(由數(shù)據(jù)庫(kù)生成)
// - username必填
// - password必填
// 場(chǎng)景2:更新用戶
// - id必填(根據(jù)id更新)
// - username可選
// - password可選(不修改則不傳)

3.2 定義校驗(yàn)組

/**
 * 校驗(yàn)組定義
 */
public interface ValidationGroups {
    // 新增操作
    interface Create {}
    // 更新操作
    interface Update {}
    // 刪除操作
    interface Delete {}
    // 默認(rèn)組(不指定group時(shí)使用)
    interface Default {}
}

3.3 在實(shí)體類中使用分組

@Data
public class UserDTO {
    // 創(chuàng)建時(shí)ID必須為空,更新時(shí)ID不能為空
    @Null(groups = ValidationGroups.Create.class,
          message = "創(chuàng)建用戶時(shí)ID必須為空")
    @NotNull(groups = {ValidationGroups.Update.class,
                       ValidationGroups.Delete.class},
              message = "更新/刪除用戶時(shí)ID不能為空")
    private Long id;
    @NotBlank(groups = {ValidationGroups.Create.class,
                        ValidationGroups.Update.class},
               message = "用戶名不能為空")
    @Size(min = 3, max = 20,
          groups = {ValidationGroups.Create.class,
                    ValidationGroups.Update.class},
          message = "用戶名長(zhǎng)度必須在3-20之間")
    private String username;
    @Email(groups = ValidationGroups.Create.class,
           message = "郵箱格式不正確")
    @NotBlank(groups = ValidationGroups.Create.class,
              message = "郵箱不能為空")
    private String email;
    // 創(chuàng)建時(shí)密碼必填,更新時(shí)可選
    @NotBlank(groups = ValidationGroups.Create.class,
              message = "密碼不能為空")
    @Size(min = 6, max = 20,
          groups = ValidationGroups.Create.class,
          message = "密碼長(zhǎng)度必須在6-20之間")
    private String password;
    @NotNull(groups = ValidationGroups.Create.class,
             message = "年齡不能為空")
    @Min(value = 18, groups = ValidationGroups.Create.class,
         message = "年齡必須大于等于18歲")
    private Integer age;
}

3.4 使用校驗(yàn)組

@RestController
@RequestMapping("/api/users")
public class UserController {
    @PostMapping
    public ResponseEntity<?> create(
            @Validated(ValidationGroups.Create.class)
            @RequestBody UserDTO userDTO) {
        // 只校驗(yàn)Create組中定義的規(guī)則
        return ResponseEntity.ok("創(chuàng)建成功");
    }
    @PutMapping("/{id}")
    public ResponseEntity<?> update(
            @PathVariable Long id,
            @Validated(ValidationGroups.Update.class)
            @RequestBody UserDTO userDTO) {
        // 只校驗(yàn)Update組中定義的規(guī)則
        return ResponseEntity.ok("更新成功");
    }
    @DeleteMapping("/{id}")
    public ResponseEntity<?> delete(
            @PathVariable Long id,
            @Validated(ValidationGroups.Delete.class)
            @RequestBody UserDTO userDTO) {
        // 只校驗(yàn)Delete組中定義的規(guī)則
        return ResponseEntity.ok("刪除成功");
    }
}

3.5 組序列(Group Sequence)

控制校驗(yàn)組的執(zhí)行順序,默認(rèn)按照定義的順序依次校驗(yàn):

@GroupSequence({CreateGroup.class, UpdateGroup.class, Default.class})
public interface OrderedGroup {
}
@RestController
public class UserController {
    @PostMapping
    public ResponseEntity<?> create(
            @Validated(OrderedGroup.class)
            @RequestBody UserDTO userDTO) {
        return ResponseEntity.ok("創(chuàng)建成功");
    }
}

注意:一旦某個(gè)組校驗(yàn)失敗,后續(xù)組不會(huì)再執(zhí)行。

四、自定義校驗(yàn)注解

4.1 自定義注解的應(yīng)用場(chǎng)景

當(dāng)內(nèi)置注解無法滿足需求時(shí),可以創(chuàng)建自定義校驗(yàn)注解:

  • 手機(jī)號(hào)校驗(yàn)@PhoneNumber
  • 身份證號(hào)校驗(yàn)@IdCard
  • 枚舉值校驗(yàn)@EnumValue
  • 字段互斥@FieldMatch
  • 密碼強(qiáng)度@StrongPassword

4.2 實(shí)現(xiàn)手機(jī)號(hào)校驗(yàn)注解

第一步:定義注解

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneNumberValidator.class)
@Documented
public @interface PhoneNumber {
    // 必須的三個(gè)屬性
    String message() default "手機(jī)號(hào)格式不正確";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    // 自定義屬性:是否支持國(guó)際化號(hào)碼
    boolean international() default false;
    // 自定義屬性:支持的國(guó)家代碼
    String[] countryCodes() default {"+86"};
}

第二步:實(shí)現(xiàn)校驗(yàn)器

public class PhoneNumberValidator
    implements ConstraintValidator<PhoneNumber, String> {
    private boolean international;
    private String[] countryCodes;
    // 中國(guó)大陸手機(jī)號(hào)正則
    private static final String CHINA_PHONE_PATTERN =
        "^1[3-9]\\d{9}$";
    @Override
    public void initialize(PhoneNumber constraintAnnotation) {
        this.international = constraintAnnotation.international();
        this.countryCodes = constraintAnnotation.countryCodes();
    }
    @Override
    public boolean isValid(String value,
                          ConstraintValidatorContext context) {
        // null值由@NotNull處理
        if (value == null) {
            return true;
        }
        // 國(guó)際號(hào)碼校驗(yàn)
        if (international) {
            return validateInternational(value);
        }
        // 中國(guó)手機(jī)號(hào)校驗(yàn)
        return value.matches(CHINA_PHONE_PATTERN);
    }
    private boolean validateInternational(String phone) {
        // 簡(jiǎn)單的國(guó)際號(hào)碼校驗(yàn)邏輯
        for (String code : countryCodes) {
            if (phone.startsWith(code)) {
                String number = phone.substring(code.length());
                return number.matches("^\\d{6,15}$");
            }
        }
        return false;
    }
}

第三步:使用注解

@Data
public class UserDTO {
    @PhoneNumber(message = "手機(jī)號(hào)格式不正確")
    private String mobile;
    @PhoneNumber(international = true,
                countryCodes = {"+86", "+1", "+44"},
                message = "國(guó)際手機(jī)號(hào)格式不正確")
    private String internationalPhone;
}

4.3 實(shí)現(xiàn)密碼強(qiáng)度校驗(yàn)

注解定義

@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = StrongPasswordValidator.class)
@Documented
public @interface StrongPassword {
    String message() default "密碼強(qiáng)度不足";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    // 最小長(zhǎng)度
    int minLength() default 8;
    // 是否需要大寫字母
    boolean requireUppercase() default true;
    // 是否需要小寫字母
    boolean requireLowercase() default true;
    // 是否需要數(shù)字
    boolean requireDigit() default true;
    // 是否需要特殊字符
    boolean requireSpecialChar() default true;
}

校驗(yàn)器實(shí)現(xiàn)

public class StrongPasswordValidator
    implements ConstraintValidator<StrongPassword, String> {
    private int minLength;
    private boolean requireUppercase;
    private boolean requireLowercase;
    private boolean requireDigit;
    private boolean requireSpecialChar;
    private static final Pattern UPPERCASE_PATTERN =
        Pattern.compile("[A-Z]");
    private static final Pattern LOWERCASE_PATTERN =
        Pattern.compile("[a-z]");
    private static final Pattern DIGIT_PATTERN =
        Pattern.compile("\\d");
    private static final Pattern SPECIAL_CHAR_PATTERN =
        Pattern.compile("[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]");
    @Override
    public void initialize(StrongPassword constraintAnnotation) {
        this.minLength = constraintAnnotation.minLength();
        this.requireUppercase = constraintAnnotation.requireUppercase();
        this.requireLowercase = constraintAnnotation.requireLowercase();
        this.requireDigit = constraintAnnotation.requireDigit();
        this.requireSpecialChar = constraintAnnotation.requireSpecialChar();
    }
    @Override
    public boolean isValid(String password,
                          ConstraintValidatorContext context) {
        if (password == null) {
            return true;
        }
        if (password.length() < minLength) {
            return false;
        }
        if (requireUppercase && !UPPERCASE_PATTERN.matcher(password).find()) {
            return false;
        }
        if (requireLowercase && !LOWERCASE_PATTERN.matcher(password).find()) {
            return false;
        }
        if (requireDigit && !DIGIT_PATTERN.matcher(password).find()) {
            return false;
        }
        if (requireSpecialChar && !SPECIAL_CHAR_PATTERN.matcher(password).find()) {
            return false;
        }
        return true;
    }
}

4.4 跨字段校驗(yàn)

實(shí)現(xiàn)"密碼"和"確認(rèn)密碼"必須一致的校驗(yàn):

注解定義

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = FieldMatchValidator.class)
@Documented
public @interface FieldMatch {
    String message() default "字段值不匹配";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    // 第一個(gè)字段名
    String first();
    // 第二個(gè)字段名
    String second();
}

校驗(yàn)器實(shí)現(xiàn)

public class FieldMatchValidator
    implements ConstraintValidator<FieldMatch, Object> {
    private String firstFieldName;
    private String secondFieldName;
    @Override
    public void initialize(FieldMatch constraintAnnotation) {
        this.firstFieldName = constraintAnnotation.first();
        this.secondFieldName = constraintAnnotation.second();
    }
    @Override
    public boolean isValid(Object value,
                          ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        }
        try {
            Field firstField = value.getClass().getDeclaredField(firstFieldName);
            firstField.setAccessible(true);
            Object firstValue = firstField.get(value);
            Field secondField = value.getClass().getDeclaredField(secondFieldName);
            secondField.setAccessible(true);
            Object secondValue = secondField.get(value);
            return Objects.equals(firstValue, secondValue);
        } catch (Exception e) {
            return false;
        }
    }
}

使用示例

@Data
@FieldMatch(first = "password", second = "confirmPassword",
            message = "兩次輸入的密碼不一致")
public class RegisterRequest {
    private String username;
    private String password;
    private String confirmPassword;
}

五、生產(chǎn)環(huán)境實(shí)戰(zhàn)

5.1 統(tǒng)一異常處理

在生產(chǎn)環(huán)境中,需要統(tǒng)一處理校驗(yàn)異常:

@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 處理 @Valid 觸發(fā)的校驗(yàn)異常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(
            MethodArgumentNotValidException ex) {
        List<String> errors = ex.getBindingResult()
            .getFieldErrors()
            .stream()
            .map(error -> error.getField() + ": " + error.getDefaultMessage())
            .collect(Collectors.toList());
        ErrorResponse response = ErrorResponse.builder()
            .code(400)
            .message("參數(shù)校驗(yàn)失敗")
            .errors(errors)
            .timestamp(LocalDateTime.now())
            .build();
        return ResponseEntity.badRequest().body(response);
    }
    /**
     * 處理 @Validated 觸發(fā)的校驗(yàn)異常
     */
    @ExceptionHandler(ConstraintViolationException.class)
    public ResponseEntity<ErrorResponse> handleConstraintViolation(
            ConstraintViolationException ex) {
        List<String> errors = ex.getConstraintViolations()
            .stream()
            .map(violation -> violation.getPropertyPath() + ": " + violation.getMessage())
            .collect(Collectors.toList());
        ErrorResponse response = ErrorResponse.builder()
            .code(400)
            .message("參數(shù)校驗(yàn)失敗")
            .errors(errors)
            .timestamp(LocalDateTime.now())
            .build();
        return ResponseEntity.badRequest().body(response);
    }
    /**
     * 處理請(qǐng)求參數(shù)綁定異常
     */
    @ExceptionHandler(BindException.class)
    public ResponseEntity<ErrorResponse> handleBindException(BindException ex) {
        List<String> errors = ex.getBindingResult()
            .getFieldErrors()
            .stream()
            .map(error -> error.getField() + ": " + error.getDefaultMessage())
            .collect(Collectors.toList());
        ErrorResponse response = ErrorResponse.builder()
            .code(400)
            .message("參數(shù)綁定失敗")
            .errors(errors)
            .timestamp(LocalDateTime.now())
            .build();
        return ResponseEntity.badRequest().body(response);
    }
}
@Data
@Builder
class ErrorResponse {
    private Integer code;
    private String message;
    private List<String> errors;
    private LocalDateTime timestamp;
}

5.2 快速失敗機(jī)制

默認(rèn)情況下,Bean Validation會(huì)校驗(yàn)所有約束并返回所有錯(cuò)誤。如果需要在第一個(gè)錯(cuò)誤時(shí)就停止:

@Configuration
public class ValidationConfig {
    @Bean
    public Validator validator() {
        ValidatorFactory factory = Validation.byDefaultProvider()
            .configure()
            .failFast(true)  // 啟用快速失敗
            .buildValidatorFactory();
        return factory.getValidator();
    }
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
        processor.setValidator(validator());
        return processor;
    }
}

5.4 手動(dòng)觸發(fā)校驗(yàn)

在Service層手動(dòng)觸發(fā)校驗(yàn):

@Service
@RequiredArgsConstructor
public class UserService {
    private final Validator validator;
    public void createUser(UserDTO userDTO) {
        // 手動(dòng)校驗(yàn)
        Set<ConstraintViolation<UserDTO>> violations =
            validator.validate(userDTO, Default.class);
        if (!violations.isEmpty()) {
            throw new ConstraintViolationException(violations);
        }
        // 業(yè)務(wù)邏輯...
    }
}

六、最佳實(shí)踐

6.1 設(shè)計(jì)原則

  1. 單一職責(zé):每個(gè)注解只負(fù)責(zé)一個(gè)校驗(yàn)規(guī)則
  2. 組合使用:多個(gè)簡(jiǎn)單注解組合成復(fù)雜規(guī)則
  3. 錯(cuò)誤消息清晰:提供具體、可操作的錯(cuò)誤提示
  4. 分組管理:使用校驗(yàn)組區(qū)分不同場(chǎng)景
  5. 自定義注解:復(fù)雜業(yè)務(wù)邏輯創(chuàng)建自定義注解

6.2 性能優(yōu)化

  1. 避免過度校驗(yàn):只校驗(yàn)必要的數(shù)據(jù)
  2. 校驗(yàn)順序:將簡(jiǎn)單的校驗(yàn)放在前面
  3. 緩存Validator:Validator實(shí)例可以復(fù)用
  4. 異步校驗(yàn):對(duì)于復(fù)雜校驗(yàn),考慮異步處理

七、總結(jié)

本文系統(tǒng)地介紹了Java注解校驗(yàn)的核心概念和實(shí)踐:

  1. @Valid vs @Validated:理解兩者的區(qū)別和適用場(chǎng)景
  2. 校驗(yàn)組:使用分組管理不同場(chǎng)景的校驗(yàn)規(guī)則
  3. 自定義注解:創(chuàng)建符合業(yè)務(wù)需求的校驗(yàn)注解
  4. 生產(chǎn)實(shí)踐:異常處理、國(guó)際化、性能優(yōu)化

到此這篇關(guān)于Java注解校驗(yàn)實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Java注解校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)不同的類的屬性之間相互賦值

    Java實(shí)現(xiàn)不同的類的屬性之間相互賦值

    今天小編就為大家分享一篇關(guān)于Java實(shí)現(xiàn)不同的類的屬性之間相互賦值,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • JAVA構(gòu)造方法/構(gòu)造器以及this使用方式

    JAVA構(gòu)造方法/構(gòu)造器以及this使用方式

    這篇文章主要介紹了JAVA構(gòu)造方法/構(gòu)造器以及this使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • springboot實(shí)現(xiàn)修改請(qǐng)求狀態(tài)404改為200

    springboot實(shí)現(xiàn)修改請(qǐng)求狀態(tài)404改為200

    這篇文章主要介紹了springboot實(shí)現(xiàn)修改請(qǐng)求狀態(tài)404改為200方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • springboot使用DynamicDataSource動(dòng)態(tài)切換數(shù)據(jù)源的實(shí)現(xiàn)過程

    springboot使用DynamicDataSource動(dòng)態(tài)切換數(shù)據(jù)源的實(shí)現(xiàn)過程

    這篇文章主要給大家介紹了關(guān)于springboot使用DynamicDataSource動(dòng)態(tài)切換數(shù)據(jù)源的實(shí)現(xiàn)過程,Spring Boot應(yīng)用中可以配置多個(gè)數(shù)據(jù)源,并根據(jù)注解靈活指定當(dāng)前使用的數(shù)據(jù)源,需要的朋友可以參考下
    2023-08-08
  • Java解析XML格式數(shù)據(jù)的方法詳解

    Java解析XML格式數(shù)據(jù)的方法詳解

    這篇文章主要介紹了Java解析XML格式數(shù)據(jù)的方法,并展示了較為常用的Java dom來解析XML的例子,需要的朋友可以參考下
    2015-10-10
  • Java 由淺入深帶你掌握?qǐng)D的遍歷

    Java 由淺入深帶你掌握?qǐng)D的遍歷

    圖的遍歷是指,從給定圖中任意指定的頂點(diǎn)(稱為初始點(diǎn))出發(fā),按照某種搜索方法沿著圖的邊訪問圖中的所有頂點(diǎn),使每個(gè)頂點(diǎn)僅被訪問一次,這個(gè)過程稱為圖的遍歷。遍歷過程中得到的頂點(diǎn)序列稱為圖遍歷序列
    2022-03-03
  • java解析Excel的方法(xls、xlsx兩種格式)

    java解析Excel的方法(xls、xlsx兩種格式)

    這篇文章主要介紹了java解析Excel的方法(xls、xlsx兩種格式),需要的朋友可以參考下
    2018-04-04
  • Java 字符數(shù)組轉(zhuǎn)字符串的常用方法

    Java 字符數(shù)組轉(zhuǎn)字符串的常用方法

    文章總結(jié)了在Java中將字符數(shù)組轉(zhuǎn)換為字符串的幾種常用方法,包括使用String構(gòu)造函數(shù)、String.valueOf()方法、StringBuilder以及Arrays.toString()方法,每種方法都有其適用的場(chǎng)景和性能特點(diǎn),感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • 排序算法圖解之Java選擇排序

    排序算法圖解之Java選擇排序

    選擇排序的工作原理是:第一次從待排序的數(shù)據(jù)元素中選出最?。ɑ蜃畲螅┑囊粋€(gè)元素,存放在序列的起始位置,然后再?gòu)氖S嗟奈磁判蛟刂袑ふ业阶钚。ù螅┰?,然后放到已排序的序列的末尾。本文通過圖片和示例介紹了選擇排序,需要的可以參考一下
    2022-11-11
  • 淺析java 歸并排序算法

    淺析java 歸并排序算法

    這篇文章主要簡(jiǎn)單介紹了java 歸并排序算法的工作原理及代碼,需要的朋友可以參考下
    2015-02-02

最新評(píng)論

汾西县| 囊谦县| 临潭县| 丹凤县| 平山县| 博野县| 勃利县| 罗甸县| 大洼县| 连江县| 商南县| 体育| 马尔康县| 莱州市| 平舆县| 越西县| 石首市| 晋宁县| 苍溪县| 福安市| 仙居县| 巩义市| 揭阳市| 独山县| 政和县| 鄂州市| 十堰市| 海伦市| 甘肃省| 泸溪县| 江油市| 阳朔县| 方正县| 隆尧县| 揭东县| 鄂伦春自治旗| 东乡族自治县| 娄烦县| 吉木萨尔县| 乐亭县| 高密市|