java理解

springboot

打包

mvn install:install-file -Dfile=<path-to-jar> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=jar
<path-to-jar> 是你的 JAR 文件的路徑。
<group-id> 是你的項目的組 ID。
<artifact-id> 是你的項目的構件 ID。
<version> 是你的項目的版本號。mvn install:install-file -Dfile=D:\ojdbc6-11.2.0.1.0.jar -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.1.0 -Dpackaging=jar

AOP

根據目標對象是否實現接口自動選擇動態代理機制。

  • JDK 動態代理:適用于目標對象實現了接口的情況。

    JDK 動態代理是 Java 提供的一種動態創建代理對象的機制。它允許在運行時動態地創建一個代理類,該代理類實現了與目標對象相同的接口,并且可以攔截對目標對象方法的調用。通過這種方式,可以在不修改目標對象代碼的情況下,對目標對象的方法調用進行增強(如添加日志、事務管理等)。

  • CGLIB 動態代理:適用于目標對象沒有實現接口的情況。

通過aspect注解定義切面,可以結合自定義注解實現 不改變源代碼情況下,在方法執行前后增加功能。

IOC

通過 IoC,Spring 容器負責管理對象的生命周期和依賴關系,而不是由開發者手動管理。

  • @Repository:標記一個類為數據訪問層組件,通常用于數據庫操作。
  • @Qualifier:用于指定注入的 Bean 的名稱,當存在多個同類型的 Bean 時,可以使用該注解來明確指定注入哪一個 Bean。
  • @Primary:用于指定默認注入的 Bean,當存在多個同類型的 Bean 時,Spring 容器會優先注入標記為 @Primary 的 Bean。
  • @Cacheable` 是 Spring 緩存框架提供的一個注解,用于聲明一個方法的結果是可緩存的。當方法被調用時,Spring 會檢查緩存中是否已經存在相應的值。如果存在,則直接從緩存中返回結果,而不會執行方法體;如果不存在,則執行方法體并將結果存入緩存,以便下次調用時可以直接從緩存中獲取。
  • @Transactional: 被標記的方法如果出現**RuntimeExceptionError**會回滾事物。
    1. Spring 事務的隔離級別有哪些?
      • READ_UNCOMMITTED:最低的隔離級別,允許讀取未提交的數據,可能出現臟讀。
      • READ_COMMITTED:允許讀取已提交的數據,避免了臟讀,但可能出現不可重復讀。
      • REPEATABLE_READ(默認級別):保證在同一個事務中多次讀取數據的結果是一致的,避免了不可重復讀,但可能出現幻讀。
      • SERIALIZABLE:最高的隔離級別,完全隔離并發事務,避免了臟讀、不可重復讀和幻讀,但性能開銷最大。
    2. 什么是臟讀、不可重復讀和幻讀?
      • 臟讀:一個事務讀取了另一個事務未提交的數據。
      • 不可重復讀:一個事務在兩次讀取同一數據時,數據被另一個事務修改,導致兩次讀取的結果不一致。
      • 幻讀:一個事務在兩次讀取同一范圍的數據時,數據被另一個事務插入或刪除,導致兩次讀取的結果不一致。

線程池

線程池的基本概念

  1. 什么是線程池?
    • 線程池是一種多線程處理形式,處理過程中將任務添加到隊列,然后在創建了線程后,從隊列中取出任務并執行。
    • 線程池的主要目的是減少線程創建和銷毀的開銷,提高線程的復用性。
  2. 線程池的主要優點是什么?
    • 減少線程創建和銷毀的開銷:線程池會復用已創建的線程,減少線程創建和銷毀的次數。
    • 提高響應速度:任務提交后可以直接從線程池中獲取線程執行,減少了線程創建的時間。
    • 提高線程的可管理性:線程池可以對線程進行統一管理,如設置線程的最大數量、隊列大小等。
    • 避免資源耗盡:通過限制線程的最大數量,避免系統資源耗盡。
  3. 線程池的主要組成部分是什么?
    • 線程池管理器:負責創建和管理線程池。
    • 工作線程:線程池中實際執行任務的線程。
    • 任務隊列:用于存儲待執行任務的隊列。
    • 任務接口:所有任務必須實現的接口,以便工作線程可以執行。

線程池的實現原理

  1. Java 中的線程池是如何實現的?
    • Java 的線程池主要通過 java.util.concurrent 包中的 Executor 框架實現。
    • Executor 是一個接口,定義了執行任務的方法。
    • ExecutorServiceExecutor 的子接口,提供了更豐富的功能,如線程池的管理。
    • ThreadPoolExecutorExecutorService 的實現類,提供了線程池的核心實現。
  2. ThreadPoolExecutor 的構造參數有哪些?
    • corePoolSize:核心線程數,線程池中始終保持的線程數量。
    • maximumPoolSize:最大線程數,線程池中允許的最大線程數量。
    • keepAliveTime:非核心線程的空閑存活時間。
    • unitkeepAliveTime 的時間單位。
    • workQueue:任務隊列,用于存儲待執行任務的隊列。
    • threadFactory:線程工廠,用于創建線程。
    • handler:拒絕策略,當任務隊列滿且線程數達到最大值時,如何處理新任務。
  3. 線程池的拒絕策略有哪些?
    • AbortPolicy:直接拋出 RejectedExecutionException
    • CallerRunsPolicy:由調用線程執行任務。
    • DiscardPolicy:直接丟棄任務。
    • DiscardOldestPolicy:丟棄隊列中最老的任務,然后嘗試提交新任務。

線程池的使用方法

  1. 如何創建一個線程池?

    • 使用 ThreadPoolExecutor 的構造方法創建線程池。

    • 示例:

      import java.util.concurrent.*;public class ThreadPoolExample {public static void main(String[] args) {ThreadPoolExecutor executor = new ThreadPoolExecutor(2, // 核心線程數4, // 最大線程數60L, // 空閑存活時間TimeUnit.SECONDS, // 時間單位new LinkedBlockingQueue<Runnable>(100) // 任務隊列);for (int i = 0; i < 10; i++) {executor.execute(() -> {System.out.println("Task executed by: " + Thread.currentThread().getName());});}executor.shutdown();}
      }
      
  2. 如何關閉線程池?

    • 使用 shutdown() 方法關閉線程池,等待所有任務完成。
    • 使用 shutdownNow() 方法立即關閉線程池,嘗試中斷正在執行的任務。
  3. 如何提交任務到線程池?

    • 使用 execute(Runnable command) 方法提交任務。
    • 使用 submit(Callable<T> task) 方法提交任務并返回 Future 對象。

線程池的性能優化

  1. 如何優化線程池的性能?
    • 合理設置線程池大小:根據系統的硬件資源和任務類型,合理設置核心線程數和最大線程數。
    • 選擇合適的任務隊列:根據任務的特點選擇合適的任務隊列,如 LinkedBlockingQueueArrayBlockingQueue
    • 設置合理的拒絕策略:根據業務需求選擇合適的拒絕策略,避免任務丟失。
    • 監控線程池狀態:通過 ThreadPoolExecutor 提供的方法監控線程池的狀態,如 getActiveCount()getCompletedTaskCount() 等。

線程池的高級特性

  1. 什么是線程池的飽和策略?

    • 當任務隊列滿且線程數達到最大值時,線程池會采取的策略。可以通過 RejectedExecutionHandler 接口自定義飽和策略。
  2. 如何自定義線程工廠?

    • 實現 ThreadFactory 接口,自定義線程的創建邏輯。

    • 示例:

      import java.util.concurrent.*;public class CustomThreadFactory implements ThreadFactory {private final String threadNamePrefix;public CustomThreadFactory(String threadNamePrefix) {this.threadNamePrefix = threadNamePrefix;}@Overridepublic Thread newThread(Runnable r) {return new Thread(r, threadNamePrefix + "-Thread-" + Thread.currentThread().getId());}public static void main(String[] args) {ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100),new CustomThreadFactory("MyCustomThread"));for (int i = 0; i < 10; i++) {executor.execute(() -> {System.out.println("Task executed by: " + Thread.currentThread().getName());});}executor.shutdown();}
      }
      

線程池的常見問題

  1. 線程池中的線程是如何復用的?
    • 線程池中的線程在執行完一個任務后,會返回線程池,等待下一個任務。如果線程池中的線程數量超過核心線程數且空閑時間超過 keepAliveTime,則會銷毀多余的線程。
  2. 線程池中的線程是如何銷毀的?
    • 當線程池中的線程數量超過核心線程數且空閑時間超過 keepAliveTime 時,多余的線程會被銷毀。
    • 當調用 shutdown() 方法時,線程池會等待所有任務完成后再銷毀所有線程。
    • 當調用 shutdownNow() 方法時,線程池會嘗試中斷正在執行的任務,并立即銷毀所有線程。
  3. 線程池中的任務是如何調度的?
    • 線程池中的任務通過任務隊列進行調度。任務隊列可以是阻塞隊列(如 LinkedBlockingQueueArrayBlockingQueue)或非阻塞隊列(如 SynchronousQueue)。
    • 線程池會從任務隊列中取出任務并分配給空閑的線程執行。

線程池的監控

  1. 如何監控線程池的狀態?
    • 使用 ThreadPoolExecutor 提供的方法監控線程池的狀態,如:
      • getActiveCount():獲取當前活躍的線程數。
      • getCompletedTaskCount():獲取已完成的任務數。
      • getTaskCount():獲取任務總數。
      • getPoolSize():獲取線程池中的線程數。
      • getLargestPoolSize():獲取線程池中曾經出現的最大線程數。

設計模式

裝飾器加適配器

理解:

準備一個接口,兩個實現類,實現類一實現基本功能,實現類二中將實現類一注入進去,調用實現類一的方法,在方法前后添加特殊邏輯。

應用場景:

流程里用不用適配器,就看一點:各環節接口對不上,但又得一起干活。 對不上(參數、格式、方法名不一樣),又改不了其中一方,就用適配器當“翻譯”;能對上,或者能直接改接口,就不用折騰。

示例:

public interface ZSQservice {String ZSQService(String arg0, String arg1);
}
@Service
public class ZSQserviceImpl implements ZSQservice {@Overridepublic String ZSQService(String arg0, String arg1) {System.out.println("ZSQservice impl, arg0=" + arg0 + ", arg1=" + arg1);return "return, arg0=" + arg0 + ", arg1=" + arg1;}
}
@Slf4j
@Service
public class ZSQLOGIMPL implements ZSQservice {private ZSQservice zsqservice;public ZSQLOGIMPL(@Qualifier("ZSQEncryImpl")ZSQservice zsqservice) {this.zsqservice = zsqservice;}@Overridepublic String ZSQService(String arg0, String arg1) {log.info("執行前記錄參數 arg0=" + arg0 + ", arg1=" + arg1);String returnJson = zsqservice.ZSQService(arg0, arg1);log.info("執行后記錄結果 "+returnJson);return returnJson;}
}
@Slf4j
@Service
public class ZSQEncryImpl implements ZSQservice {private ZSQservice zsqservice;public ZSQEncryImpl(@Qualifier("ZSQserviceImpl") ZSQservice zsqservice) {this.zsqservice = zsqservice;}@Overridepublic String ZSQService(String arg0, String arg1) {log.info("數據加密中");String json = zsqservice.ZSQService(arg0, arg1);log.info("數據加密完成");return json;}
}
  @Testvoid zsqTest(){ZSQservice zsQservice = new ZSQLOGIMPL(new ZSQEncryImpl(new ZSQserviceImpl()));zsQservice.ZSQService("1","2");}
: 執行前記錄參數 arg0=1, arg1=2
: 數據加密中ZSQservice impl, arg0=1, arg1=2
: 數據加密完成
: 執行后記錄結果 return, arg0=1, arg1=2

代理模式

只要裝飾器模式不添加特定功能就是代理,也可以看aop是spring自動進行代理的。

AOP加自定義注解

示例:

1. 添加依賴

pom.xml 中添加 Spring AOP 的依賴:

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

2. 自定義注解

2.1 @LogAction

作用:記錄方法的執行日志,包括方法名、入參和出參。
屬性

  • action:描述日志內容,可選,默認值為 "日志記錄"
package com.example.annotation;import java.lang.annotation.*;@Target({ElementType.METHOD, ElementType.TYPE})  // 可以標注在方法或類上
@Retention(RetentionPolicy.RUNTIME)  // 運行時保留
public @interface LogAction {String action() default "日志記錄";  // 默認值
}

3. 自定義注解例子

3.1 @LogAction 示例
package com.example.service;import com.example.annotation.LogAction;
import org.springframework.stereotype.Service;

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

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

相關文章

圖論核心算法詳解:從存儲結構到最短路徑(附C++實現)

目錄 一、圖的基礎概念與術語 二、圖的存儲結構 1. 鄰接矩陣 實現思路&#xff1a; 2. 鄰接表 實現思路&#xff1a; 應用場景&#xff1a; 時間復雜度分析&#xff1a; 三、圖的遍歷算法 1. 廣度優先搜索&#xff08;BFS&#xff09; 核心思想&#xff1a; 應用場…

力扣top100(day03-02)--圖論

本文為力扣TOP100刷題筆記 筆者根據數據結構理論加上最近刷題整理了一套 數據結構理論加常用方法以下為該文章&#xff1a; 力扣外傳之數據結構&#xff08;一篇文章搞定數據結構&#xff09; 200. 島嶼數量 class Solution {// DFS輔助方法&#xff0c;用于標記和"淹沒&q…

建造者模式:從“參數地獄”到優雅構建

深夜&#xff0c;一條緊急告警刺穿寂靜&#xff1a;核心報表服務因NullPointerException全線崩潰。排查根源&#xff0c;罪魁禍首竟是一個擁有10多個參數的“上帝構造函數”。本文將從這個災難現場出發&#xff0c;引入“鏈式建造者模式”進行重構&#xff0c;并深入Spring AI、…

jenkins在windows配置sshpass

我的服務器里jenkins是通過docker安裝的&#xff0c;jenkins與項目都部署在同一臺服務器上還好&#xff0c;但是當需要通過jenkins構建&#xff0c;再通過scp遠程推送到別的服務器上&#xff0c;就出問題了&#xff0c;畢竟不是手動執行scp命令&#xff0c;可以手動輸入密碼&am…

Linux操作系統從入門到實戰(十八)在Linux里面怎么查看進程

Linux操作系統從入門到實戰&#xff08;十八&#xff09;在Linux里面怎么查看進程前言一、如何識別一個進程&#xff1f;—— PID二、怎么查看進程的信息&#xff1f;方式1&#xff1a;通過/proc目錄方式2&#xff1a;用ps命令三、父進程是什么&#xff1f;—— PPID四、bash是…

[TryHackMe](知識學習)---基于堆棧得到緩沖區溢出

1.了解緩沖區溢出WINDOWS程序動態調試工具immunity debuggerhttps://www.immunityinc.com/products/debugger/2.Mona腳本#!/usr/bin/env python3import socket, time, sysip "10.201.99.37"port 1337 timeout 5 prefix "OVERFLOW1 "string prefix &q…

LRU算法與LFU算法

知識點&#xff1a; LRU是Least Recently Used的縮寫&#xff0c;意思是最近最少使用&#xff0c;它是一種Cache替換算法 Cache的容量有限&#xff0c;因此當Cache的容量用完后&#xff0c;而又有新的內容需要添加進來時&#xff0c; 就需要挑選 并舍棄原有的部分內容&#xf…

目標檢測公開數據集全解析:從經典到前沿

目標檢測公開數據集全解析&#xff1a;從經典到前沿 一、引言 目標檢測&#xff08;Object Detection&#xff09;是計算機視覺領域的核心任務之一&#xff0c;旨在在圖像或視頻中識別并定位感興趣的物體。與圖像分類不同&#xff0c;目標檢測不僅需要判斷物體的類別&#xf…

數據備份與進程管理

一、數據備份1.Linux服務器中需要備份的數據&#xff08;1&#xff09;Linux系統重要數據&#xff1a;/root/目錄&#xff0c;/home/目錄&#xff0c;/etc/目錄&#xff08;2&#xff09;安裝服務的數據&#xff1a;Apache&#xff08;配置文件&#xff0c;網頁主目錄&#xff…

docker volume卷入門教程

1. 基礎概念 Docker卷是專門用于持久化容器數據的存儲方案&#xff0c;獨立于容器生命周期。其核心優勢包括&#xff1a; 數據持久化&#xff1a;容器刪除后數據仍保留跨容器共享&#xff1a;多個容器可訪問同一卷備份與遷移&#xff1a;支持直接復制卷數據驅動支持&#xff1a…

計算機網絡——協議

1. 計算機網絡分層1.1 OSI 7層模型應用層表示層會話層傳輸層網絡層數據鏈路層物理層1.2 TCP/IP 4 層模型應用層運輸層網際層網絡接口層1.3 5層體系機構應用層傳輸層網絡層數據鏈路層物理層2. 應用層協議2.1 HTTP協議2.1.1 基本介紹HTTP&#xff08;HyperText Transfer Protocol…

【React】hooks 中的閉包陷阱

在 React Hooks 中的 閉包陷阱&#xff08;Closure Trap&#xff09;在 useEffect、事件回調、定時器等場景里很常見。1. 閉包陷阱是什么 當你在函數組件里定義一個回調&#xff08;比如事件處理函數&#xff09;&#xff0c;這個回調會捕獲當時渲染時的變量值。如果后面狀態更…

校園快遞小程序(騰訊地圖API、二維碼識別、Echarts圖形化分析)

&#x1f388;系統亮點&#xff1a;騰訊地圖API、二維碼識別、Echarts圖形化分析&#xff1b;一.系統開發工具與環境搭建1.系統設計開發工具后端使用Java編程語言的Spring boot框架 項目架構&#xff1a;B/S架構 運行環境&#xff1a;win10/win11、jdk17小程序&#xff1a; 技術…

Python網絡爬蟲(二) - 解析靜態網頁

文章目錄一、網頁解析技術介紹二、Beautiful Soup庫1. Beautiful Soup庫介紹2. Beautiful Soup庫幾種解析器比較3. 安裝Beautiful Soup庫3.1 安裝 Beautiful Soup 43.2 安裝解析器4. Beautiful Soup使用步驟4.1 創建Beautiful Soup對象4.2 獲取標簽4.2.1 通過標簽名獲取4.2.2 通…

【Linux基礎知識系列】第九十四篇 - 如何使用traceroute命令追蹤路由

在網絡環境中&#xff0c;了解數據包從源主機到目標主機的路徑是非常重要的。這不僅可以幫助我們分析網絡連接問題&#xff0c;還可以用于診斷網絡延遲、丟包等問題。traceroute命令是一個強大的工具&#xff0c;它能夠追蹤數據包在網絡中的路徑&#xff0c;顯示每一跳的延遲和…

達夢數據閃回查詢-快速恢復表

Time:2025/08/12Author:skatexg一、環境說明DM數據庫&#xff1a;DM8.0及以上版本二、適用場景研發在誤操作或變更數據后&#xff0c;想馬上恢復表到某個時間點&#xff0c;可以通過閃回查詢功能快速實現&#xff08;通過全量備份恢復時間長&#xff0c;成本高&#xff09;三、…

力扣(LeetCode) ——225 用隊列實現棧(C語言)

題目&#xff1a;用隊列實現棧示例1&#xff1a; 輸入&#xff1a; [“MyStack”, “push”, “push”, “top”, “pop”, “empty”] [[], [1], [2], [], [], []] 輸出&#xff1a; [null, null, null, 2, 2, false] 解釋&#xff1a; MyStack myStack new MyStack(); mySta…

微軟推出AI惡意軟件檢測智能體 Project Ire

開篇 在8月5號&#xff0c;微軟研究院發布了一篇博客文章&#xff0c;在該篇博客中推出了一款名為Project Ire的AI Agent。該Agent可以在無需人類協助的情況下&#xff0c;自主分析和分類二進制文件。它可以在無需了解二進制文件來源或用途的情況下&#xff0c;對文件進行完全的…

哪些對會交由SpringBoot容器管理?

在 Spring Boot 中,交由容器管理的對象通常稱為“Spring Bean”,這些對象的創建、依賴注入、生命周期等由 Spring 容器統一管控。以下是常見的會被 Spring Boot 容器管理的對象類型及識別方式: 一、通過注解聲明的組件(最常見) Spring Boot 通過類級別的注解自動掃描并注…

Android POS應用在android運行常見問題及解決方案

概述 本文檔記錄了在Android POS應用開發過程中遇到的兩個關鍵問題及其解決方案&#xff1a; UnsatisfiedLinkError: couldnt find "libnative.so" 錯誤ActivityNotFoundException 錯誤商戶信息一致性檢查繞過 問題1&#xff1a;UnsatisfiedLinkError - libnative.so…