
前言Java 修飾符分為兩大體系訪問權(quán)限修飾符控制類 / 成員可見范圍、非訪問修飾符定義特性、生命周期、Spring 框架專屬語義。 SpringBoot/Spring 開發(fā)中修飾符貫穿 Controller、Service、Mapper、實體類、工具類、配置類全場景不同修飾符搭配注解會產(chǎn)生截然不同的 Bean 生命周期、依賴注入、序列化、繼承效果。 本文以多表格拆分 場景適配 Spring 工程實操規(guī)范完整梳理。一、第一大類訪問權(quán)限修飾符4 個控制可見范圍核心作用限定類、成員變量、成員方法、構(gòu)造器可被調(diào)用的范圍作用域從小到大排序private 默認(rèn)(包私有) protected public表 1四大訪問修飾符作用域?qū)φ毡硇揎椃形拿Q本類內(nèi)部同一個包下其他類子類不同包任意包所有類Spring 項目常規(guī)使用場景private私有? 可見? 不可見? 不可見? 不可見1.Service 注入的 Mapper 成員變量 2. 實體類 PO/DO 所有屬性字段 3. 工具類內(nèi)部私有工具方法 4. 常量私有成員無修飾符 default包私有 / 默認(rèn)? 可見? 可見? 不可見? 不可見Spring 極少主動使用僅同一包內(nèi)協(xié)作工具類臨時方法protected受保護(hù)? 可見? 可見? 可見? 不可見1. 父類公共基礎(chǔ) PO 審計字段createTime/updateTime 2. 抽象父 Service 通用業(yè)務(wù)模板方法public公共? 可見? 可見? 可見? 可見1.Controller 所有接口方法 2.Service 接口定義、實現(xiàn)類對外業(yè)務(wù)方法 3.Mapper 接口 4. 對外暴露的工具類靜態(tài)方法表 2訪問修飾符使用硬性規(guī)范Spring 工程最佳實踐代碼元素推薦修飾符禁止使用原因說明實體類 PO/DTO/Form 屬性字段privatepublic封裝特性通過 get/set 訪問Jackson 序列化默認(rèn)適配私有字段Service 層注入 Mapper 對象privatepublic/protected依賴注入無需對外暴露保證封裝Controller 接口請求方法public其他SpringMVC 需要外部反射調(diào)用接口方法必須 public業(yè)務(wù)接口XXXServicepublicdefault跨包調(diào)用實現(xiàn)類必須公共工具類內(nèi)部工具方法privatepublic僅類內(nèi)調(diào)用無需對外開放抽象父類模板方法protectedprivate供子類重寫拓展外部不可調(diào)用二、第二大類基礎(chǔ)非訪問修飾符Java 原生核心修飾符Spring 高頻搭配注解使用模塊 1static 靜態(tài)修飾符表 3static 修飾不同元素效果 Spring 場景修飾對象核心特性Spring 開發(fā)適用場景禁忌場景static 變量靜態(tài)變量屬于類本身不屬于實例全局唯一一份內(nèi)存所有對象共享1. 全局常量public static final 2. 工具類全局配置參數(shù)不能修飾 Autowired 注入成員靜態(tài)變量無法被 Spring 自動注入static 方法靜態(tài)方法無需 new 實例類名。方法名 () 直接調(diào)用內(nèi)部只能訪問靜態(tài)資源通用工具類日期轉(zhuǎn)換、Bean 拷貝、加解密工具方法不能調(diào)用非靜態(tài)成員不能加 Transactional 事務(wù)注解事務(wù)依賴實例代理static 代碼塊類加載時執(zhí)行一次僅初始化靜態(tài)資源工具類加載初始化配置、加載證書文件業(yè)務(wù)層幾乎不用static 內(nèi)部類脫離外部類可獨立實例化復(fù)雜 DTO 嵌套內(nèi)部枚舉 / 子對象極少使用模塊 2final 最終修飾符不可修改表 4final 修飾不同元素規(guī)則對照表修飾對象語義約束Spring 項目使用場景final 變量賦值一次后永久不可修改1. 全局常量public static final String REDIS_PREFIX user:;2. 方法入?yún)⒔狗椒▋?nèi)篡改入?yún)ο笠胒inal 方法子類無法重寫該方法父類固定模板方法不允許子類篡改核心邏輯final 類類不能被繼承無子類1. 通用工具類BeanUtil、DateUtil 2. 枚舉類默認(rèn)都是 final模塊 3abstract 抽象修飾符面向接口編程核心Spring 架構(gòu)基石表 5abstract 使用規(guī)則 業(yè)務(wù)場景修飾對象約束規(guī)則Spring 架構(gòu)場景abstract 抽象類不能 new 實例可包含抽象方法 普通成員變量 / 普通方法通用父 BaseService、BaseController封裝分頁、異常統(tǒng)一處理abstract 抽象方法無方法體必須被子類實現(xiàn)重寫模板方法模式定義業(yè)務(wù)標(biāo)準(zhǔn)流程子類差異化實現(xiàn)關(guān)鍵接口 interface 默認(rèn)所有方法都是 public abstract模塊 4synchronized /volatile/transient 并發(fā)序列化修飾符表 6并發(fā) 序列化修飾符場景明細(xì)修飾符核心作用Spring 使用場景synchronized同步鎖保證多線程原子性、可見性定時任務(wù)多線程并發(fā)爭搶資源、庫存扣減簡易加鎖分布式推薦 Redissonvolatile保證變量內(nèi)存可見性禁止指令重排多線程全局開關(guān)標(biāo)記定時任務(wù)啟停標(biāo)記transient序列化忽略字段PO 實體中不需要存入 Redis / 序列化的臨時字段三、第三大類Spring 生態(tài)專屬語義修飾結(jié)合注解生效Java 原生修飾符 Spring 注解聯(lián)動Spring 不會新增語法修飾符但通過原生修飾符 框架注解賦予特殊生命周期、依賴注入、代理特性是業(yè)務(wù)開發(fā)最常用組合。表 7Autowired 注入場景修飾符搭配規(guī)范成員變量修飾符搭配 Autowired 效果推薦度privateSpring 反射無視私有權(quán)限可正常注入封裝性最好????? 標(biāo)準(zhǔn)寫法protected子類可直接訪問注入對象適合父子 Service 繼承場景????public外部可隨意修改注入 Bean破壞容器單例不推薦?final搭配構(gòu)造注入推薦寫法private final UserMapper userMapper;構(gòu)造器注入不可變 Bean????? Spring 官方推薦表 8Bean 作用域 修飾符聯(lián)動單例 / 多例修飾符組合Bean 生命周期特性使用場景private static Autowired禁止使用靜態(tài)變量只會注入一次單例容器下會出現(xiàn)注入失效? 嚴(yán)禁private final 構(gòu)造注入Bean 創(chuàng)建完成后無法被修改線程安全無循環(huán)依賴隱患? 生產(chǎn)首選四、第四大類方法專屬修飾符匯總接口 / 實現(xiàn)類方法全覆蓋表 9方法所有修飾符組合含義對照表修飾符組合適用位置核心作用public voidController 接口方法接收前端 http 請求SpringMVC 反射調(diào)用public OverrideService 實現(xiàn)類重寫接口方法實現(xiàn)業(yè)務(wù)規(guī)范編譯器校驗方法簽名protected abstract抽象父類模板方法預(yù)留拓展點子類必須實現(xiàn)private static工具類內(nèi)部靜態(tài)工具方法全局調(diào)用無狀態(tài)線程安全public static final常量工具方法邏輯永久固定不可重寫private synchronized類內(nèi)多線程同步方法本地鎖保證線程安全五、綜合總表Spring 分層代碼全層級修飾符標(biāo)準(zhǔn)配置表 10項目各層代碼統(tǒng)一修飾符規(guī)范企業(yè)級開發(fā)標(biāo)準(zhǔn)代碼分層代碼元素標(biāo)準(zhǔn)修飾符補(bǔ)充說明控制層 Controller類public交給 SpringMVC 掃描注冊 Bean請求接口方法public必須公共才能被外部訪問業(yè)務(wù)層 Service業(yè)務(wù)接口public跨包調(diào)用接口實現(xiàn)類ServicepublicIOC 容器托管注入 Mapper 成員變量private final構(gòu)造器注入官方最優(yōu)方案業(yè)務(wù)實現(xiàn)方法public供上層調(diào)用數(shù)據(jù)訪問層 MapperMapper 接口publicMyBatis 掃描生成代理對象實體層 PO/DTO/Form實體類public序列化反射需要所有屬性字段private封裝get/set 訪問get/set 方法publicJackson 序列化依賴公共 getter通用工具類工具類public final禁止繼承工具方法public static類名直接調(diào)用全局常量public static final統(tǒng)一配置常量配置類 Configuration配置類publicSpring 掃描配置 BeanBean 生成對象方法public容器注冊第三方組件六、高頻易錯坑點總結(jié)? 靜態(tài)變量不能使用 Autowiredstatic 屬于類加載階段早于 Spring 容器初始化注入一定會失效? private 方法不能加 TransactionalSpring 事務(wù)基于 JDK/CGLIB 動態(tài)代理私有方法無法被代理攔截事務(wù)不生效? final 成員變量推薦構(gòu)造器注入杜絕字段注入循環(huán)依賴問題線程安全性更高? 實體屬性一律 private遵循 Java 封裝原則適配 JSON 序列化、MyBatis 字段映射? 接口內(nèi)變量默認(rèn) public static final方法默認(rèn) public abstract無需手動書寫。