告別混亂!【Java Web】項目分層架構全指南:核心三層 + 關鍵輔助包詳解


目錄

1.前言

2.正文

2.1為什么要分層

2.2核心三層詳解

2.2.1Controller層(表現層/API層)

2.2.2Service層(業務邏輯層)

2.2.3DAO層(持久層)

2.3. 核心關系與數據流轉:分層架構的交互邏輯

2.3.1. 依賴方向控制

2.3.2數據對象轉換

2.3.3. 異常處理機制

2.3.4分層交互的黃金法則

2.4.關鍵輔助包講解

2.4.1 model/entity/domain 包

2.4.2 dto/vo 包

2.4.3 repository 包

2.4.4 config 包

2.4.5 util 包

2.4.6 common 包

2.4.7 exception/advice 包

2.4.8 interceptor/filter/aop 包

2.4.9 constant 包

3.小結


1.前言

當你打開一個全新的Java項目,面對空白的IDE窗口時,第一個技術決策將決定整個項目的命運。這個決策不是選擇Spring Boot還是Quarkus,不是用MyBatis還是JPA,甚至不是確定數據庫類型——而是如何組織你的代碼結構

當所有代碼混沌地堆砌在一起,項目便注定走向"屎山"的命運。而分層架構,正是對抗這種混沌的最有力武器。

本文將深入剖析Java項目分層的核心邏輯:

  • 解剖分層價值:直面混沌代碼的五大痛點

  • 解構三層模型:Controller-Service-DAO的精準職責邊界

  • 透視數據流轉:DTO/Entity的優雅轉換之道

  • 搭建支撐體系:9大關鍵輔助包構建健壯生態

現在,讓我們揭開分層架構的面紗,掌握構建可持續Java應用的基石法則。


插播一條消息~

🔍?十年經驗淬煉 · 系統化AI學習平臺推薦

系統化AI學習平臺 https://www.captainbed.cn/scy/

? 為什么值得投入?

  • 📚 完整知識體系:從數學基礎 → 工業級項目(人臉識別/自動駕駛/GANs),內容由淺入深

  • 💻 實戰為王:每小節配套可運行代碼案例(提供完整源碼)

  • 🎯 零基礎友好:用生活案例講解算法,無需擔心數學/編程基礎

🚀 特別適合

  • 想系統補強AI知識的開發者

  • 轉型人工智能領域的從業者

  • 需要項目經驗的學生


2.正文

2.1為什么要分層

在軟件開發中,隨著功能增加和業務邏輯復雜化,代碼的組織方式直接影響項目的可持續性。未分層架構的典型表現是關注點混雜:一個類或模塊同時承擔了數據訪問、業務規則處理、用戶界面交互等多種職責。這種結構會迅速引發一系列可維護性和擴展性問題:

核心痛點分析:

  1. 高耦合性 (High Coupling)

    • 不同功能的代碼物理上相鄰且邏輯上相互依賴。

    • 后果:修改數據庫訪問邏輯可能迫使業務層和表示層同步調整;更換前端技術需要重寫包含業務邏輯的代碼塊。

    • 影響:變更成本指數級增長,系統僵化。

  2. 低內聚性 (Low Cohesion)

    • 單一模塊承擔多個不相關的職責,違反單一職責原則 (SRP)。

    • 后果:理解模塊功能需要梳理無關代碼;定位特定邏輯(如價格計算)效率低下。

    • 影響:代碼可讀性差,認知負擔加重。

  3. 可測試性障礙 (Testability Barriers)

    • 業務邏輯與數據庫、UI 緊耦合。

    • 后果:單元測試需要啟動數據庫、模擬 HTTP 請求等環境。

    • 影響:測試編寫困難、執行緩慢,導致測試覆蓋率低下。

  4. 可維護性惡化 (Maintainability Degradation)

    • 功能代碼分散或冗余。

    • 后果:修復缺陷需在多處相似邏輯中定位;添加新功能缺乏明確插入點。

    • 影響:開發效率下降,錯誤率上升。

  5. 復用性缺失 (Lack of Reusability)

    • 通用邏輯(如數據查詢)與特定上下文綁定。

    • 后果:相同功能需重復實現,修改時需多處同步。

    • 影響:代碼冗余,一致性難以保障。

分層架構:系統化的解決方案

分層架構的核心是通過職責分離構建邏輯邊界。每一層聚焦特定功能域,并通過定義良好的接口與相鄰層交互:

  • 解耦核心價值:層間依賴單向流動(如Controller->Service->DAO)。修改數據訪問層實現(如從JDBC遷移至JPA)只需調整DAO層,Service層接口不變則無需修改。

  • 高內聚實現:每層/模塊職責明確(DAO層僅處理數據持久化,Service層封裝業務規則)。

  • 可測試性提升:業務邏輯可脫離數據庫進行單元測試;數據訪問層可通過接口模擬測試。

  • 可維護性增強:問題定位更精準(數據問題查DAO層,邏輯錯誤查Service層);功能擴展路徑清晰。

  • 復用性改善:通用能力(如基礎數據訪問)可封裝為獨立層供多業務復用。

分層思維的類比

  • 建筑學:地基(基礎設施層)- 承重結構(核心業務層)- 室內裝修(用戶交互層)。各層獨立演進,維護地基不影響居住空間。

  • 計算機體系:硬件層 - 操作系統層 - 應用層。應用開發無需關注硬件指令細節。

2.2核心三層詳解

項目分層架構中,Controller-Service-DAO是最基礎的模型。明確各層職責與交互邊界是架構設計的關鍵。下面進行逐層解析:

2.2.1Controller層(表現層/API層)

定位:系統與外部交互的入口,處理HTTP協議通信。

核心職責

  • 請求解析:接收HTTP請求,解析URL路徑、請求參數(@PathVariable@RequestParam)、Header及請求體(@RequestBody)。

  • 基礎校驗:執行參數格式校驗(如使用JSR 303注解?@NotNull,?@Valid)。

  • 服務調度:調用對應的Service層方法執行業務邏輯。

  • 異常處理:捕獲Service層拋出的業務異常,或交由全局異常處理器處理。

  • 響應封裝:將Service層返回的數據轉換為客戶端所需格式(JSON/XML/視圖模型)。

技術實現

@RestController // 聲明為REST控制器
@RequestMapping("/api/orders") // 基礎路徑映射
public class OrderController {@Autowiredprivate OrderService orderService; // 依賴業務層接口@PostMappingpublic ResponseEntity<OrderDTO> createOrder(@RequestBody @Valid OrderCreateRequest request) {// 1. 接收并校驗請求體// 2. 調用Service執行業務OrderDTO order = orderService.createOrder(request); // 3. 封裝HTTP響應return ResponseEntity.status(HttpStatus.CREATED).body(order); }
}

關鍵原則

  • 保持精簡:僅處理協議轉換,業務邏輯零侵入。

  • 無狀態性:不存儲業務狀態,依賴Service層管理。

  • 單一入口:每個Controller聚焦一個業務域(如OrderController)。

常見誤區

  • 業務邏輯泄露:在Controller中進行價格計算、狀態判斷等業務操作。

  • 跨層訪問:直接調用DAO層操作數據庫,繞過Service層。

  • 過度轉換:在Controller內實現復雜的數據結構轉換(應使用專用轉換器)。


2.2.2Service層(業務邏輯層)

定位:系統的核心領域邏輯處理器,保障業務一致性。

核心職責

  • 業務規則實現:執行具體的業務邏輯(如訂單計價、庫存校驗)。

  • 事務管理:通過@Transactional聲明事務邊界,確保原子性操作。

  • 資源協調:組合調用多個DAO方法或微服務接口(如支付服務)。

  • 業務校驗:執行復雜規則校驗(如“用戶積分是否足夠”)。

  • 領域模型轉換:將DAO層實體(Entity)轉換為業務DTO。

技術實現

@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderDao orderDao; // 依賴數據層接口@Autowiredprivate PaymentServiceClient paymentClient; // 依賴外部服務@Transactional // 聲明事務邊界@Overridepublic OrderDTO createOrder(OrderCreateRequest request) {// 1. 業務校驗(如庫存檢查)validateStock(request.getItems());// 2. 構建領域對象Order order = buildOrderDomain(request);// 3. 調用DAO持久化數據orderDao.save(order);// 4. 調用外部服務(如支付)paymentClient.processPayment(order.getId(), order.getTotalAmount());// 5. 返回業務DTOreturn OrderMapper.toDTO(order); }
}

關鍵原則

  • 業務焦點:所有核心業務規則集中在此層實現。

  • 接口隔離:通過接口(OrderService)暴露能力,隱藏實現細節。

  • 事務控制:事務聲明在Service層,避免分布式事務碎片化。

  • 可復用設計:業務方法應獨立于調用方(Controller/定時任務)。

常見誤區

  • 持久化邏輯泄露:在Service中直接編寫SQL或JPA條件查詢。

  • 協議耦合:處理HTTP狀態碼、響應頭等協議層細節。

  • 上帝服務:單個Service類過度膨脹(應拆分為OrderValidationServiceOrderCalculationService等子域服務)。


2.2.3DAO層(持久層)

定位:數據存儲的技術抽象層,封裝底層存儲訪問細節。

核心職責

  • CRUD操作:提供數據的創建、查詢、更新、刪除基礎能力。

  • 數據映射:實現數據庫表結構與領域對象的雙向轉換。

  • 技術封裝:隱藏具體存儲實現(SQL/NoSQL/文件系統)。

  • 連接管理:處理數據庫連接池、事務會話等底層資源。

技術實現

@Repository // Spring組件注解(含異常轉換)
public interface OrderDao extends JpaRepository<Order, Long> { // Spring Data JPA 自動實現接口// 自定義查詢方法@Query("SELECT o FROM Order o WHERE o.userId = :userId AND o.status = :status")List<Order> findByUserAndStatus(@Param("userId") Long userId, @Param("status") OrderStatus status);
}// MyBatis實現
@Mapper
public interface OrderMapper {@Insert("INSERT INTO orders(...) VALUES(...)")@Options(useGeneratedKeys = true, keyProperty = "id")void insert(Order order);
}

關鍵原則

  • 技術專注:只關注數據存取,不包含業務規則。

  • 接口抽象:通過接口(OrderDao)暴露操作,支持實現替換。

  • 存儲無關:上層不感知使用MySQL還是MongoDB(依賴倒置)。

  • 性能優化:負責SQL調優、二級緩存等存儲層性能問題。

常見誤區

  • 業務邏輯入侵:在SQL語句或存儲過程中實現業務規則(如CASE WHEN status='PAID' THEN ...)。

  • 領域對象暴露:將數據庫實體(Entity)直接返回給Controller層(應通過Service轉換為DTO)。

  • 接口設計失衡:方法粒度不合理(如saveUserAndUpdateOrder違反單一職責)。

關鍵約束

  1. 單向調用:Controller → Service → DAO

  2. 禁止跨層訪問(如Controller直接調用DAO)

  3. 實體對象不出Service層(DAO返回Entity,Service轉換為DTO)

2.3. 核心關系與數據流轉:分層架構的交互邏輯

分層架構的核心價值體現在各層之間的協作關系和數據流轉機制上。以下是關鍵交互流程的解析:

數據流轉全流程圖解

2.3.1. 依賴方向控制

  • 嚴格單向依賴

    • Controller ? Service ? DAO

    • 禁止反向依賴:DAO 層不得調用 Service 方法

    • 禁止跨層調用:Controller 不得直接訪問 DAO

  • 設計價值

    • 符合依賴倒置原則(DIP)

    • 下層變更不影響上層(如更換ORM框架只需修改DAO實現)

    • 各層可獨立測試和演進

2.3.2數據對象轉換

不同層級使用不同數據對象,實現職責隔離:

層級輸入對象輸出對象轉換說明
DAO層Entity / 查詢參數Entity / 值對象直接操作數據庫實體
Service層Entity / DTODTO / 業務對象Entity→DTO轉換
Controller層DTO / 請求對象VO(View Object)DTO→VO轉換

轉換示例:?

// DAO層返回數據庫實體
@Repository
public interface UserDao {UserEntity findById(Long id); // 返回Entity
}// Service層進行轉換
@Service
public class UserService {public UserDTO getUser(Long id) {UserEntity entity = userDao.findById(id);return UserMapper.INSTANCE.toDTO(entity); // Entity->DTO}
}// Controller層適配視圖
@RestController
public class UserController {@GetMapping("/users/{id}")public UserVO getUser(@PathVariable Long id) {UserDTO dto = userService.getUser(id);return new UserVO(dto.getId(), dto.getName()); // DTO->VO}
}

2.3.3. 異常處理機制

異常按層級分類處理:

  • DAO層異常

    • 類型:DataAccessException(Spring封裝)

    • 示例:SQL語法錯誤、連接超時

    • 處理:向上拋出,不處理業務語義

  • Service層異常

    • 類型:自定義BusinessException

    • 示例:余額不足、庫存校驗失敗

    • 特點:攜帶業務錯誤碼和友好消息

  • Controller處理

    @RestControllerAdvice
    public class GlobalExceptionHandler {// 處理業務異常@ExceptionHandler(BusinessException.class)public ResponseEntity<ErrorResponse> handleBusinessEx(BusinessException ex) {return ResponseEntity.badRequest().body(new ErrorResponse(ex.getCode(), ex.getMessage()));}// 處理系統異常@ExceptionHandler(DataAccessException.class)public ResponseEntity<ErrorResponse> handleDataAccessEx() {return ResponseEntity.internalServerError().body(new ErrorResponse("DB_ERROR", "數據庫服務異常"));}
    }

2.3.4分層交互的黃金法則

  1. 數據隔離原則

    • ?Entity 只在 DAO-Service 層流轉

    • DTO 在 Service-Controller 層傳遞

    • VO 僅用于 Controller-Client 交互?

  2. 異常傳遞規范

    • DAO 異常 → Service 層轉換業務異常

    • Service 異常 → Controller 統一處理

    • 禁止在 DAO 層捕獲業務異常

  3. 接口契約約束

    • 層間通過接口交互(Service接口、DAO接口)

    • 實現可替換(如JDBC實現替換為JPA實現)

關鍵認知:分層不是簡單的目錄劃分,而是通過規范的數據流轉和接口契約,構建可維護、可擴展的代碼生態系統。這種約束看似增加了轉換成本,實則是應對復雜性的必要投資。

2.4.關鍵輔助包講解

2.4.1 model/entity/domain 包

定位:領域模型的核心容器
職責

  • 存放數據庫映射實體類(UserEntityOrderEntity

  • 定義領域驅動設計(DDD)中的聚合根、值對象

  • 封裝核心業務屬性與行為

最佳實踐

// 實體類示例(JPA注解)
@Entity
@Table(name = "t_user")
public class UserEntity {@Id@GeneratedValue(strategy = IDENTITY)private Long id;@Column(nullable = false, length = 32)private String name;@Column(unique = true, updatable = false)private String email;// 領域行為方法public boolean isVip() {return this.vipLevel > 0;}
}

關鍵約束

  • 禁止直接暴露:Controller層不應直接返回Entity對象

  • 貧血模型規避:實體類應包含領域行為方法(如calculateTotal()

  • 持久化解耦:領域模型與數據庫表結構非強綁定(可用DTO轉換)


2.4.2 dto/vo 包

定位:層間數據傳輸的契約載體
核心類型

類型用途示例
Request DTO接口入參UserCreateRequest
Response DTOService層出參UserDetailDTO
VOController最終響應對象UserVO

轉換示例

public class UserDTO {// 不暴露敏感字段private Long id;private String displayName;private Integer vipLevel;// 轉換邏輯集中管理public static UserDTO fromEntity(UserEntity entity) {return new UserDTO(entity.getId(),entity.getName() + "(" + entity.getCode() + ")",entity.getVipLevel());}
}

設計價值

  • 安全隔離:屏蔽passwordsalary等敏感字段

  • 協議適配:VO可包含前端專用的字段(如formattedDate

  • 版本兼容:實體變更不影響接口契約


2.4.3 repository 包

定位:持久層的現代接口抽象
Spring Data JPA范式

@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> {// 方法名自動推導查詢List<UserEntity> findByStatusAndVipLevelGreaterThan(UserStatus status, int minLevel);// 自定義SQL查詢@Query("SELECT u FROM UserEntity u WHERE u.lastLogin < :expireDate")List<UserEntity> findInactiveUsers(@Param("expireDate") LocalDate date);
}

技術選型對比

實現方式適用場景特點
Spring Data JPA快速CRUD開發接口自動實現
MyBatis Mapper復雜SQL優化XML/注解雙模式
JdbcTemplate極致性能控制原生SQL操作

2.4.4 config 包

定位:系統組件的裝配中心
典型配置類

@Configuration
public class AppConfig {// 數據源配置@Bean@ConfigurationProperties(prefix = "spring.datasource")public DataSource dataSource() {return DruidDataSourceBuilder.create().build();}// MVC消息轉換器@Beanpublic HttpMessageConverters customConverters() {FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();return new HttpMessageConverters(converter);}// 線程池配置@Bean("taskExecutor")public Executor asyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10);executor.setQueueCapacity(200);return executor;}
}

配置管理原則

  1. 環境隔離:通過application-{profile}.yml管理多環境配置

  2. 密鑰安全:敏感信息使用jasypt加密或注入Vault

  3. 組件可見性:使用@ConditionalOnProperty控制Bean加載條件


2.4.5 util 包

定位:通用技術能力工具箱
工具類設計規范

public final class DateUtils {// 禁止實例化private DateUtils() {}// 線程安全的日期格式化private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 日期轉字符串public static String format(LocalDateTime date) {return date.format(FORMATTER);}// 解析日期public static LocalDateTime parse(String dateStr) {return LocalDateTime.parse(dateStr, FORMATTER);}
}

工具類分類

  • 字符串處理StringUtils

  • 集合操作CollectionUtils

  • 加解密EncryptUtils

  • IO操作FileUtils

  • 校驗工具ValidationUtils

禁忌:避免在util包中存放業務相關的工具方法(應放入業務模塊)


2.4.6 common 包

定位:項目全局基礎設施
核心內容

// 統一響應體
public class ApiResponse<T> {private int code;private String msg;private T data;public static <T> ApiResponse<T> success(T data) {return new ApiResponse<>(200, "OK", data);}
}// 業務異常基類
public class BusinessException extends RuntimeException {private final ErrorCode errorCode;public BusinessException(ErrorCode code) {super(code.getMessage());this.errorCode = code;}
}

最佳實踐

  • 使用枚舉管理錯誤碼:

    public enum ErrorCode {USER_NOT_FOUND(1001, "用戶不存在"),BALANCE_INSUFFICIENT(2001, "余額不足");private final int code;private final String message;
    }

2.4.7 exception/advice 包

定位:異常處理的統一防線
全局異常處理器

@RestControllerAdvice
public class GlobalExceptionHandler {// 處理業務異常@ExceptionHandler(BusinessException.class)public ApiResponse<Void> handleBusinessEx(BusinessException ex) {return ApiResponse.fail(ex.getErrorCode());}// 處理參數校驗異常@ExceptionHandler(MethodArgumentNotValidException.class)public ApiResponse<Void> handleValidEx(MethodArgumentNotValidException ex) {String errorMsg = ex.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining("|"));return ApiResponse.fail(ErrorCode.INVALID_PARAM, errorMsg);}
}

異常處理策略

  1. 業務異常:轉換為友好提示(HTTP 200 + 錯誤碼)

  2. 參數異常:返回具體校驗失敗字段(HTTP 400)

  3. 系統異常:記錄日志并返回通用錯誤(HTTP 500)


2.4.8 interceptor/filter/aop 包

定位:橫切關注點解決方案
技術對比

組件作用域典型場景
FilterServlet容器級別字符編碼/跨域處理
InterceptorSpring MVC級別登錄驗證/權限檢查
AOP方法級別日志/事務/緩存/性能監控

AOP實踐示例

@Aspect
@Component
public class PerformanceMonitor {// 監控Service層方法性能@Around("execution(* com.example..service.*.*(..))")public Object logTime(ProceedingJoinPoint pjp) throws Throwable {long start = System.currentTimeMillis();Object result = pjp.proceed();long cost = System.currentTimeMillis() - start;if (cost > 300) { // 慢方法預警logger.warn("Method {} executed in {} ms", pjp.getSignature(), cost);}return result;}
}

2.4.9 constant 包

定位:項目常量管理的核心中樞
常量管理范式

public final class OrderConstants {// 狀態枚舉public static final int STATUS_CREATED = 10;public static final int STATUS_PAID = 20;// 緩存鍵模板public static final String CACHE_KEY_ORDER = "order:%s";// 配置項鍵名public static final String CONFIG_MAX_QUANTITY = "order.max.quantity";
}

升級方案:使用枚舉強化類型安全

public enum OrderStatus {CREATED(10, "已創建"),PAID(20, "已支付");private final int code;private final String desc;// 通過code獲取枚舉public static OrderStatus fromCode(int code) { ... }
}

3.小結

今天的分享到這里就結束了,喜歡的小伙伴點點贊點點關注,你的支持就是對我最大的鼓勵,大家加油!

另外最后的最后,歡迎大家加入我的社區哦,初創社區難免經驗不足,請大家多多包涵,也歡迎大家前來多多交流。

愛吃烤雞翅的酸菜魚社區-CSDN社區云 https://bbs.csdn.net/forums/aaa1f71356f6475db42ea9ea09a392bc?spm=1001.2014.3001.6685

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90496.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90496.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90496.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決Docker Compose報錯

解決Docker Compose報錯&#xff1a;exec ./entrypoint.sh: no such file or directory在使用Docker Compose部署應用時&#xff0c;你是否遇到過exec ./entrypoint.sh: no such file or directory這個令人頭疼的錯誤&#xff1f;本文將深入分析錯誤原因并提供多種解決方案&…

【element plus】el-select,allow-create不需要點回車鍵

<el-selectv-model"row.expertName"filterableremoteallow-createdefault-first-optionreserve-keywordplaceholder"請輸入姓名":remote-method"remoteMethod":loading"loadingName"change"(val) > handleNameChange(row, …

RK3588 HDMI-RX 驅動、RGA 加速與 OpenCV GStreamer 支持完整指南

一、環境檢測與前置依賴 確認內核與 HDMI-RX 節點&#xff1a; uname -a # 輸出&#xff1a;6.1.0-1025-rockchip ...dmesg | grep -i hdmirx # 應能看到 hdmirx-controller 節點&#xff1a; # fdee0000.hdmirx-controller driver probe ok!如果僅出現&#xff1a; rockchi…

AS32A601芯片QSPI 調試技術解析與與實戰經驗分享

一、概述&#xff08;一&#xff09;QSPI 簡介QSPI&#xff08;Quad Serial Peripheral Interface&#xff09;是一種高速串行通信接口&#xff0c;在標準 SPI&#xff08;Serial Peripheral Interface&#xff09;的基礎上擴展至 4 條數據線&#xff08;Quad Mode&#xff09;…

TDengine 轉化函數 TO_TIMESTAMP 用戶手冊

TDengine TO_TIMESTAMP 函數用戶使用手冊 函數概述 TO_TIMESTAMP 是 TDengine 中的標量函數&#xff0c;用于將字符串按照指定格式轉換為時間戳。該函數在數據導入、時間格式轉換、以及處理各種時間字符串格式時非常有用。 語法 TO_TIMESTAMP(ts_str_literal, format_str_liter…

關于我司即將對商業間諜行為進行法律訴訟的通知

最后警告我司所屬社交媒體中所有友商間諜&#xff1a;請于2025年7月26日上午十點前&#xff0c;自行刪除我方好友&#xff0c;并停止通過欺詐行為&#xff08;包括但不限于冒充客戶等&#xff09;盜取我司商業秘密的行為。十點后&#xff0c;我司將開始進行逐一排查&#xff0c…

【打怪升級 - 03】YOLO11/YOLO12/YOLOv10/YOLOv8 完全指南:從理論到代碼實戰,新手入門必看教程

引言&#xff1a;為什么選擇 YOLO&#xff1f; 在目標檢測領域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;系列模型一直以其高效性和準確性備受關注。作為新版本&#xff0c;YOLO系列的新版本總能在前輩的基礎上進行了多項改進&#xff0c;包括更高的檢測精度…

JMeter每次壓測前清除全部以確保異常率準確(以黑馬點評為例、詳細圖解)

目錄 一、前言 二、未清除全部會出現的情況(以樂觀鎖解決超賣問題為例) 三、清除全部就能得到準確的結果 一、前言 在學習黑馬點評之前我并沒有接觸過JMeter這個壓測軟件&#xff0c;然后在黑馬點評視頻中老師也是直接拿起JMeter就開始使用&#xff0c;所以我一直在不斷搜索…

關于新學C++編程Visual Studio 2022開始,使用Cmake工具構建Opencv和SDK在VS里編譯項目開發簡介筆記

1. C 項目build文件夾 2. VS解決方案管理器Solution——.sln文件 3. CMake 自動化構建工具 4. SDK軟件開發工具包作為初學者&#xff0c;從工程項目開始接觸完整一套流程工具和編譯&#xff0c;有助于快速上手。 一、C 項目build文件夾在 VS2022 中打開 C 項目后&#xff0c;在…

測試ppyoloe的小樣本few-shot能力,10張圖片精度達到69.8%

近期公司有個項目&#xff0c;需要解決長尾樣本的問題&#xff0c;所以測試了一下paddlepaddle小樣本的能力。 環境&#xff1a;&#xff1a;T4 、ubuntu 、cuda-11.6 、py3.9、 paddlepaddle-gpu2.6.0、pip install opencv-python4.5.5.64 -i https://pypi.tuna.tsinghua.…

結構化布線系統詳解

1. 結構化布線系統概述 結構化布線系統(Structured Cabling System, SCS)是一種標準化、模塊化的建筑物或建筑群內信息傳輸基礎設施&#xff0c;它為語音、數據、圖像等多媒體業務提供了統一的物理傳輸介質。與傳統的點對點布線方式不同&#xff0c;結構化布線采用層次化、標準…

【Java學習】匿名內部類的向外訪問機制

目錄 一、方法局部變量的訪問 1.生命周期 1.1方法生命周期 1.2匿名實例生命周期 1.3生命超時性 2.變量捕獲 2.1按值捕獲 2.1.1值捕獲優勢 2.1.1.1生命及時訪問 2.1.1.2線程安全 2.1.2常量值捕獲優勢 2.2按引用捕獲 引用捕獲風險 (1)生命超時訪問 (2)線程不安全 …

LinkedList的模擬實現+LinkedList和ArrayList的區別

目錄 LinkedList的模擬實現 什么是雙向鏈表 增加數據 頭插法&#xff1a; 尾插法&#xff1a; 指定的下標插入&#xff1a; 刪除數據 刪除雙向鏈表中出現的第一個key 置空所有數據 LinkedList和ArrayList的區別 順序表對應的集合類是ArrayList&#xff1b;鏈表對應的集…

Vue + WebSocket 實時數據可視化實戰:多源融合與模擬數據雙模式設計

在現代交通大屏項目中&#xff0c;實時數據的采集和可視化尤為重要。本文結合 Vue3 和 ECharts&#xff0c;分享一個支持多 WebSocket 數據源實時合并、模擬數據調試、自動重連的完整設計方案&#xff0c;幫助你快速搭建健壯的數據可視化組件。一、項目背景與核心需求實時接收多…

C#索引器、接口、泛型

以下是對提供的 C# 代碼中涉及的核心知識點的梳理和總結&#xff0c;涵蓋索引器、接口、泛型三大核心內容&#xff0c;以及相關實踐要點&#xff1a;一、索引器&#xff08;Indexer&#xff09;索引器是一種允許類或結構體像數組一樣通過[]語法訪問成員的特殊成員&#xff0c;本…

界面組件DevExpress WPF中文教程:Grid - 如何過濾節點?

DevExpress WPF擁有120個控件和庫&#xff0c;將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序&#xff0c;這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

Excel——INDEX和MATCH傻傻分不清?

核心邏輯?先用 MATCH 找到目標姓名在表格中的 ?行號&#xff0c;再用 INDEX 根據行號 ?提取對應信息。就像查字典&#xff1a;先用拼音找到字的頁碼&#xff08;MATCH 找行號&#xff09;再翻到該頁看具體解釋&#xff08;INDEX 取數據&#xff09;?分步拆解&#xff08;以…

制造業低代碼平臺實戰評測:簡道云、釘釘宜搭、華為云Astro、金蝶云·蒼穹、斑斑低代碼,誰更值得選?

上回聊了斑斑和簡道云&#xff0c;不少同行私信問我其他幾個低代碼平臺怎么樣&#xff0c;今天就給大家來個"五大門派"終極對決&#xff01; 一、先說痛點 制造業搞數字化最怕三件事&#xff1a; 1.錢花了沒效果&#xff08;大平臺用不起&#xff0c;小工具不夠用&…

Jenkins中HTML文件顯示樣式問題解決方案

Jenkins中HTML文件顯示樣式問題解決方案 問題描述 在Jenkins中歸檔的HTML文件顯示格式失效&#xff0c;樣式無法正常顯示&#xff0c;但在本地瀏覽器中打開卻能正常顯示。 問題原因 Jenkins為了安全考慮&#xff0c;默認設置了嚴格的內容安全策略(Content Security Policy, CSP…

四、配置文件

文章目錄1. 文件類型1.1 properties1.2 yaml1.2.1 簡介1.2.2 基本語法1.2.3 數據類型1.2.4 示例2. 配置提示1. 文件類型 1.1 properties 同以前的properties的用法 1.2 yaml 1.2.1 簡介 YAML 是 “YAML Ain’t Markup Language”&#xff08;YAML 不是一種標記語言&#x…