- CPU密集型任務:線程數 ≈ CPU核心數 + 1
- IO密集型任務:線程數 ≈ CPU核心數 * (1 + IO等待時間/CPU計算時間)
- 通用建議:Runtime.getRuntime().availableProcessors()獲取CPU核心數作為參考
- CPU使用率:保持在70%-90%之間較理想
- 任務隊列長度:隊列不應持續增長
- 響應時間:應在可接受范圍內
- 吞吐量:達到最優值后不再隨線程數增加而提升
- 系統資源:內存、文件描述符等是否充足
- execute(Runnable command):執行無返回值的任務
- submit(Callable?task):提交有返回值的任務,返回Future對象
- submit(Runnable task):提交Runnable任務,返回Future
- submit(Runnable task, T result):提交Runnable任務并指定返回結果
- ??Java對象頭中的Mark Word??
- 每個Java對象都有一個對象頭,其中包含Mark Word
- Mark Word存儲了對象的哈希碼、GC分代年齡、鎖狀態等信息
- 鎖信息就存儲在Mark Word中
- ??鎖的升級過程(偏向鎖->輕量級鎖->重量級鎖)??
- ??無鎖狀態??:對象剛創建時的狀態
- ??偏向鎖??:只有一個線程訪問時,在Mark Word中記錄線程ID
- ??輕量級鎖??:多個線程交替訪問,通過CAS操作競爭鎖
- ??重量級鎖??:多線程競爭激烈時,升級為操作系統層面的互斥鎖
- ??同步實現??
- ??monitorenter??和??monitorexit??字節碼指令
- 每個對象都有一個監視器鎖(monitor)
- 進入同步塊時執行monitorenter,退出時執行monitorexit
- ??AQS (AbstractQueuedSynchronizer)??
- Java并發包中鎖的基礎框架
- 使用一個volatile int state表示鎖狀態
- 通過CAS操作實現鎖的獲取和釋放
- 維護一個FIFO隊列管理等待線程
- ??CAS (Compare And Swap)??
- 原子操作,比較并交換
- 現代CPU提供的指令級原子操作
- 是樂觀鎖的實現基礎
- ??防止網絡過載??:通過動態調整發送速率,避免過多數據同時涌入網絡導致路由器緩沖區溢出和丟包
- ??公平性??:確保多個TCP連接能公平共享網絡帶寬資源
- ??提高網絡利用率??:在不過載的前提下盡可能充分利用可用帶寬
- ??慢啟動(Slow Start)??
- 連接開始時,擁塞窗口(cwnd)從1個MSS開始
- 每收到一個ACK,cwnd增加1個MSS(指數增長)
- 直到達到慢啟動閾值(ssthresh)或發生擁塞
- ??擁塞避免(Congestion Avoidance)??
- 當cwnd >= ssthresh時,進入線性增長階段
- 每RTT時間cwnd增加1個MSS
- ??快速重傳(Fast Retransmit)??
- 收到3個重復ACK時,立即重傳丟失的報文段
- 而不必等待超時
- ??快速恢復(Fast Recovery)??
- 發生快速重傳后,調整ssthresh和cwnd
- 避免像超時那樣完全從慢啟動開始
特性 | String | StringBuffer | StringBuilder |
可變性 | 不可變 | 可變 | 可變 |
線程安全 | 不可變故線程安全 | 線程安全(synchronized方法) | 非線程安全 |
性能 | 高(因不可變) | 較低(同步開銷) | 最高 |
使用場景 | 常量字符串 | 多線程環境字符串操作 | 單線程環境字符串操作 |
繼承關系 | Object | AbstractStringBuilder | AbstractStringBuilder |
- ??通用字段(General Header Fields)?
- Cache-Control:控制緩存行為
- Connection:控制連接狀態(如keep-alive)
- Date:消息產生的日期時間
- ??請求字段(Request Header Fields)??
- Host:請求的目標主機和端口號
- User-Agent:客戶端信息
- Accept:可接受的響應內容類型
- Authorization:認證信息
- ??響應字段(Response Header Fields)??
- Server:服務器信息
- Set-Cookie:設置Cookie
- Content-Type:響應體的MIME類型
- Content-Length:響應體長度
- ??實體字段(Entity Header Fields)??
- Content-Encoding:內容編碼方式
- Expires:內容過期時間
- Last-Modified:最后修改時間
- 父類靜態變量和靜態塊
- 子類靜態變量和靜態塊
- 父類實例變量和實例塊
- 父類構造方法
- 子類實例變量和實例塊
- 子類構造方法
- ??定義??:
- 負責管理應用中Bean的生命周期
- 提供Bean的創建、配置、組裝和管理服務
- ??核心功能??:
- 依賴注入
- 生命周期管理
- 作用域管理
- AOP代理創建
- ??定義??:
- 控制反轉(Inversion of Control)容器
- 實現依賴注入(DI)模式的核心組件
- ??主要實現??:
- BeanFactory:基礎IOC容器
- ApplicationContext:擴展了更多企業級功能
- ??相同點??:
- 都負責管理Bean對象
- 都實現依賴注入功能
- ??不同點??:
特性 | Spring Bean容器 | Spring IOC容器 |
功能范圍 | 專注于Bean生命周期管理 | 更廣泛,包括資源訪問、事件等 |
實現級別 | 概念層面 | 具體接口和實現類 |
使用場景 | 泛指Bean管理功能 | 特指依賴注入實現機制 |
典型代表 | - | BeanFactory, ApplicationContext |
- 兩者在大多數情況下可以互換使用
- 嚴格來說,IOC容器是實現Bean容器功能的機制
- ApplicationContext是功能最完整的IOC容器實現
- IOC(Inversion of Control):控制反轉
- 將對象的創建、依賴管理交給容器而非程序員
- ??實現原理??:
- 通過反射機制動態創建和管理對象
- 維護Bean之間的依賴關系
- 在適當時候注入依賴
- ??核心價值??:
- ??解耦??:減少組件間的直接依賴
- ??可維護性??:集中管理對象生命周期
- ??可測試性??:便于模擬依賴進行測試
- ??靈活性??:配置變更不影響代碼
- ??工作流程??:
- 讀取配置(注解/XML)
- 創建Bean定義
- 實例化Bean
- 注入依賴
- 初始化Bean
- 提供服務
- 銷毀Bean
- ??主要接口??:
- BeanFactory:基礎IOC容器
- ApplicationContext:擴展接口,添加更多企業功能
- BeanDefinition:描述Bean的元數據
- 依賴注入,IOC的具體實現技術
- 容器將依賴關系自動注入到組件中
- ??實現方式??:
- ??構造器注入??:通過構造方法注入
- ??Setter注入??:通過setter方法注入
- ??字段注入??:直接注入字段(反射實現)
- ??注入類型??:
- ??按類型注入??:@Autowired(默認按類型)
- ??按名稱注入??:@Qualifier指定名稱
- ??強制依賴??:使用required=true
- ??可選依賴??:使用required=false
- ??優勢??:
- 減少樣板代碼
- 提高可測試性
- 降低耦合度
- 配置靈活
- ??相關注解??:
- @Autowired:自動裝配
- @Resource:JSR-250標準注解
- @Inject:JSR-330標準注解
- @Value:注入簡單值
- ??作用域類型??:
- ??單例(Singleton)??:默認,每個容器一個實例
- ??原型(Prototype)??:每次請求創建新實例
- ??請求(Request)??:每個HTTP請求一個實例
- ??會話(Session)??:每個HTTP會話一個實例
- ??全局會話(Global Session)??:Portlet應用專用
- ??配置方式??:
- ??延遲加載(Lazy Initialization)??:
- 只有第一次使用時才創建實例
- 減少應用啟動時間
- 適用于不立即需要的Bean
- ??配置方式??:
- ??組合使用示例??:
- ??注意事項??:
- 延遲加載的Bean在第一次訪問時會有輕微性能開銷
- 原型作用域的Bean通常需要配合延遲加載
- 某些Bean(如基礎設施Bean)不適合延遲加載
- ??反射機制??:
- Class.forName()加載類
- Constructor.newInstance()創建實例
- Field.set()注入屬性
- ??動態代理??:
- JDK動態代理(基于接口)
- CGLIB代理(基于子類)
- ??工廠模式??:
- BeanFactory接口定義獲取Bean的方法
- 各種實現類提供具體創建邏輯
- ??生命周期管理??:
- InstantiationAwareBeanPostProcessor
- BeanPostProcessor
- InitializingBean/DisposableBean接口
- ??防止資源泄漏??:
- 關閉數據庫連接
- 釋放文件句柄
- 清理網絡連接
- ??避免內存泄漏??:
- 移除緩存引用
- 清理監聽器
- 斷開對象引用鏈
- ??優雅關閉??:
- 保存狀態
- 完成未完成的操作
- 記錄日志
- ??概念??:
- 對象不再被使用但無法被GC回收
- 導致內存占用持續增長
- ??Spring中常見原因??:
- 未正確實現DisposableBean
- 靜態集合持有Bean引用
- 監聽器未正確注銷
- 線程池未關閉
- ??檢測方法??:
- 內存分析工具(VisualVM, MAT)
- 監控內存使用情況
- 分析GC日志
- 用戶請求-DispatcherServlet
- HandlerMapping找到處理器
- 調用處理器返回ModelAndView
- 視圖解析器解析視圖
- 渲染視圖返回響應
- ??清晰的職責分離??:
- 各組件分工明確
- 易于維護和擴展
- ??靈活配置??:
- 支持注解驅動
- 多種視圖技術集成
- ??強大的數據綁定??:
- 自動請求參數綁定
- 支持表單驗證
- ??國際化支持??:
- 本地化解析
- 主題支持
- ??測試友好??:
- 易于單元測試
- 支持Mock測試
- ??集成能力??:
- 與其他Spring項目無縫集成
- 支持RESTful開發
- ??擴展性強??:
- 可自定義各組件實現
- 攔截器機制靈活
- ??編程式事務??:
- 使用TransactionTemplate
- 通過代碼顯式控制事務邊界
- 精確控制事務范圍
- 靈活處理復雜邏輯
- 代碼侵入性強
- 容易遺漏提交/回滾
- ??聲明式事務??:
- 使用@Transactional注解
- 基于AOP實現
- 非侵入式
- 配置簡單
- 減少樣板代碼
- 粒度較粗(方法級別)
- 異常處理需注意
傳播行為類型 | 說明 |
REQUIRED(默認) | 當前有事務則加入,沒有則新建 |
REQUIRES_NEW | 新建事務,掛起當前事務 |
SUPPORTS | 當前有事務則加入,沒有則以非事務執行 |
NOT_SUPPORTED | 以非事務執行,掛起當前事務 |
MANDATORY | 必須在事務中運行,否則拋出異常 |
NEVER | 必須在非事務中運行,否則拋出異常 |
NESTED | 嵌套事務執行 |
隔離級別 | 說明 |
DEFAULT | 使用數據庫默認級別 |
READ_UNCOMMITTED | 讀未提交,可能臟讀 |
READ_COMMITTED | 讀已提交,避免臟讀 |
REPEATABLE_READ | 可重復讀,避免臟讀和不可重復讀 |
SERIALIZABLE | 串行化,最高隔離級別 |
特性 | #{} | ${} |
處理方式 | 預編譯處理(占位符?) | 字符串替換(直接拼接SQL) |
安全性 | 防止SQL注入 | 有SQL注入風險 |
參數類型 | 自動識別并轉換 | 原樣輸出 |
適用場景 | 參數值 | 表名、列名等非參數部分 |
日期處理 | 自動格式化為數據庫兼容格式 | 需要手動處理 |
空值處理 | 自動處理null | 可能引發語法錯誤 |
- 優先使用#{},防止SQL注入
- ${}僅用于動態表名、列名等非參數部分
- 使用${}時要確保參數值可信或經過校驗
- 復雜SQL可混合使用兩者
- ??條件不確定的查詢??:
- 根據不同條件拼接不同SQL
- 避免寫多個相似的SQL語句
- ??靈活的表操作??:
- 動態選擇表名、列名
- 適應表結構變化
- ??批量操作??:
- 動態生成批量插入/更新語句
- 簡化批量數據處理
- ??避免SQL拼接風險??:
- 提供安全的動態SQL構建方式
- 減少手動拼接錯誤
- ??if??:條件判斷
- ??choose/when/otherwise??:多選一
- ??trim/where/set??:處理SQL片段
- ??foreach??:循環處理
- ??bind??:創建變量
- ??主體提交認證信息??:
- ??委托Authenticator認證??:
- 調用Realm的doGetAuthenticationInfo方法
- 獲取認證信息(AuthenticationInfo)
- ??憑證匹配??:
- 使用CredentialsMatcher比較提交的和存儲的憑證
- 匹配成功完成認證
- ??創建已認證主體??:
- 綁定主體到當前線程
- 設置認證標志
- ??權限檢查觸發??:
- ??委托Authorizer授權??:
- 調用Realm的doGetAuthorizationInfo方法
- 獲取授權信息(AuthorizationInfo)
- ??權限驗證??:
- 檢查角色/權限是否匹配
- 不匹配拋出UnauthorizedException
- ??訪問控制??:
- 驗證通過允許訪問
- 否則拒絕訪問
- ??Subject??:當前操作用戶
- ??SecurityManager??:安全管理者
- ??Authenticator??:認證器
- ??Authorizer??:授權器
- ??Realm??:安全數據源
- ??SessionManager??:會話管理
特性 | BeanFactory | ApplicationContext |
功能定位 | 基礎IOC容器 | 企業級擴展容器 |
加載時機 | 延遲加載(按需初始化) | 啟動時預加載所有單例Bean |
國際化支持 | 不支持 | 支持(MessageSource) |
事件發布 | 不支持 | 支持(ApplicationEventPublisher) |
AOP支持 | 需要額外配置 | 內置支持 |
資源訪問 | 基本支持 | 更豐富的資源訪問方式(ResourceLoader) |
自動注冊 | 不支持BeanPostProcessor自動注冊 | 支持 |
典型實現 | DefaultListableBeanFactory | ClassPathXmlApplicationContext, AnnotationConfigApplicationContext |
性能 | 啟動快,運行時慢 | 啟動慢,運行時快 |
使用場景 | 資源受限環境 | 大多數企業應用 |
作用域 | 說明 | 適用場景 | 線程安全要求 |
singleton(默認) | 每個容器一個實例 | 無狀態服務,配置類 | 必須線程安全 |
prototype | 每次請求創建新實例 | 有狀態Bean | 通常不需要 |
request | 每個HTTP請求一個實例 | Web請求相關數據 | 不需要 |
session | 每個HTTP會話一個實例 | 用戶會話數據 | 不需要 |
application | 每個ServletContext一個實例 | Web應用全局數據 | 必須線程安全 |
websocket | 每個WebSocket會話一個實例 | WebSocket通信 | 不需要 |
- ??輕量級??:
- 非侵入式設計
- 最小化應用代碼對框架的依賴
- ??IOC/DI??:
- 松耦合
- 易于測試和維護
- ??AOP支持??:
- 分離橫切關注點
- 聲明式服務(事務、安全等)
- ??集成能力??:
- 與各種技術棧無縫集成
- 一站式解決方案
- ??模塊化設計??:
- 按需選擇模塊
- 靈活組合
- ??簡化開發??:
- 減少樣板代碼
- 提高開發效率
- ??強大的生態??:
- Spring Boot
- Spring Cloud
- Spring Data等
- Spring中常見的設計模式??:
- ??工廠模式??:
- BeanFactory
- ApplicationContext
- ??單例模式??:
- 默認Bean作用域
- 應用上下文
- ??代理模式??:
- AOP實現
- @Transactional
- ??模板方法??:
- JdbcTemplate
- RestTemplate
- ??觀察者模式??:
- 事件發布/監聽機制
- ??適配器模式??:
- HandlerAdapter
- AdvisorAdapter
- ??裝飾者模式??:
- Wrapper類
- 動態代理
- ??策略模式??:
- 資源訪問策略
- 事務管理策略
- ??默認行為??:
- Controller默認是單例
- 必須設計為無狀態(避免實例變量)
- ??安全實踐??:
- 使用局部變量而非實例變量
- 使用ThreadLocal保存請求相關狀態
- 將共享狀態聲明為原型作用域
- ??并發工具??:
- 使用并發集合
- 同步關鍵代碼塊
- ??作用域選擇??:
- 對有狀態需求使用request/session作用域
- ??注解支持??:
- @Scope("prototype")使Controller成為原型
- ??XML配置??:
<bean id="collectionBean" class="com.example.CollectionBean"> <property name="list"> <list> <value>Java</value> <ref bean="otherBean"/> </list> </property> <property name="set"> <set> <value>Spring</value></set> </property> <property name="map"> <map> <entry key="key1" value="value1"/> <entry key="key2" ref="otherBean"/> </map> </property>
</bean>
- ??注解配置??:
@Component
public class CollectionBean { @Autowired private List<MyInterface> implementations; @Resource(name = "myMap") private Map<String, Object> map;
} @Configuration
public class AppConfig { @Bean public List<String> stringList() { return Arrays.asList("A", "B");
}
@Bean public Map<String, Integer> myMap() {Map<String, Integer> map = new HashMap<>(); map.put("key1", 100); return map; }
}
- ??Java Util類注入??:
@Autowired private ResourceLoader resourceLoader;
- ??編程式事務??:
- 使用TransactionTemplate
- 使用PlatformTransactionManager直接管理
- ??聲明式事務??:
- XML配置:
- 注解驅動:@Transactional
- 基于AOP代理
- 基于字節碼生成(ASPECTJ)
- REQUIRED, REQUIRES_NEW, NESTED等
- DEFAULT, READ_UNCOMMITTED等
- ??一致性API??:
- 統一不同持久化技術的事務API
- 切換持久化技術不影響業務代碼
- ??聲明式支持??:
- 通過配置管理事務
- 減少樣板代碼
- ??編程式選擇??:
- 靈活控制事務邊界
- ??集成測試??:
- 易于模擬和測試
- ??多種實現??:
- JDBC, JPA, Hibernate等支持
- ??AOP支持??:
- 非侵入式事務管理
- ??DispatcherServlet??:前端控制器
- ??HandlerMapping??:請求到處理器的映射
- ??Controller??:處理業務邏輯
- ??ModelAndView??:封裝模型和視圖
- ??ViewResolver??:視圖名稱解析
- ??HandlerInterceptor??:攔截器
- ??HandlerAdapter??:適配不同處理器
- ??MultipartResolver??:文件上傳
- ??LocaleResolver??:國際化
- ??ThemeResolver??:主題解析
- ??返回JSON??:
@RestController
public class AjaxController {@GetMapping("/user") public User getUser() { return new User("John", 30); }
}
- ??@ResponseBody??:
@Controller
public class AjaxController { @RequestMapping("/data")@ResponseBody public String getData() { return "AJAX response"; }
}
- ??Jackson支持??:
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>
- ??前端調用??:
特性 | Spring MVC | Struts2 |
設計理念 | 基于方法 | 基于類 |
性能 | 更高 | 較低 |
線程安全 | 方法局部變量 | 成員變量需注意 |
攔截器 | HandlerInterceptor | 獨立攔截器棧 |
視圖技術 | 更靈活 | 主要JSP |
集成 | 與Spring生態無縫 | 需要額外集成 |
REST支持 | 優秀 | 較弱 |
配置 | 注解為主 | XML配置為主 |
- 加載配置:mybatis-config.xml + Mapper XML
- 創建SqlSessionFactory
- 創建SqlSession
- 執行SQL:
- 獲取Mapper接口代理
- 解析SQL/參數
- 執行數據庫操作
- 返回結果:結果映射
- 關閉會話
- 類型安全
- 避免硬編碼
- IDE支持更好
- MyBatis開發步驟??:
- 添加依賴:mybatis.jar + 數據庫驅動
- 創建全局配置文件:mybatis-config.xml
- 創建實體類
- 創建Mapper接口
- 創建SQL映射文件(XML或注解)
- 獲取SqlSessionFactory
- 獲取SqlSession
- 獲取Mapper接口實例
- 執行數據庫操作
- 提交事務/關閉會話
JDBC不足 | MyBatis解決方案 |
大量樣板代碼 | 自動生成/簡化代碼 |
手動處理連接/異常 | 自動管理資源 |
SQL與Java代碼混合 | SQL與代碼分離 |
硬編碼參數/結果映射 | 自動參數綁定/結果映射 |
手動處理事務 | 聲明式事務支持 |
緩存支持弱 | 提供一/二級緩存 |
不同數據庫差異處理復雜 | 方言支持 |
批量操作繁瑣 | 提供批量執行器 |
- SQL控制靈活
- 學習曲線平緩
- 輕量級
- 動態SQL強大
- 與Spring集成好
- 性能接近JDBC
- SQL工作量大
- 移植性較差
- 緩存機制較簡單
- 復雜映射配置較多