亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot搭Flowable搞工作流的實(shí)現(xiàn)示例

 更新時(shí)間:2025年09月03日 09:12:52   作者:星辰聊技術(shù)  
本文主要介紹了SpringBoot搭Flowable搞工作流的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、先把環(huán)境整明白:準(zhǔn)備工作不踩坑

1. 新建 Spring Boot 項(xiàng)目(手殘黨也能秒懂)

打開你的 IDEA,新建一個(gè) Spring Boot 項(xiàng)目。記得選 Web 模塊,畢竟咱后續(xù)可能要搞點(diǎn)接口測(cè)試啥的。如果用命令行的話,一行命令搞定:

spring init --name=flowable-demo --groupId=com.example --artifactId=flowable-demo --version=2.7.12 --packaging=jar --dependencies=web,mysql,flowable-spring-boot-starter-process flowable-demo

這里重點(diǎn)說(shuō)下依賴 flowable-spring-boot-starter-process,這可是 Flowable 和 Spring Boot 聯(lián)姻的關(guān)鍵信物,自帶自動(dòng)配置功能,能讓我們少寫一大堆繁瑣配置。

2. 數(shù)據(jù)庫(kù)配置:和 MySQL 做好朋友

咱先給項(xiàng)目找個(gè)「?jìng)}庫(kù)」存流程數(shù)據(jù)。打開 application.properties,加上數(shù)據(jù)庫(kù)配置:

spring.datasource.url=jdbc:mysql://localhost:3306/flowable_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
1.2.3.4.

注意這里用了 MySQL 8.0 的驅(qū)動(dòng),如果你的數(shù)據(jù)庫(kù)是 5.x 版本,記得把驅(qū)動(dòng)換成 com.mysql.jdbc.Driver,不然可能會(huì)報(bào)「找不到驅(qū)動(dòng)」的玄學(xué)錯(cuò)誤哦。

3. Flowable 核心配置:讓引擎聽指揮

接著告訴 Flowable 咱們的需求:

# 關(guān)閉自動(dòng)部署(開發(fā)階段建議關(guān)閉,避免每次啟動(dòng)都重新部署流程)
flowable.engine.auto-deploy-process-definitions=false
# 開啟流程模型編輯器(后面畫流程圖全靠它)
flowable.ui.modeler.enabled=true
# 設(shè)置歷史記錄級(jí)別(記錄所有操作,方便排查問(wèn)題)
flowable.history.level=full

這里重點(diǎn)說(shuō)下 history.level,默認(rèn)是 audit,只會(huì)記錄關(guān)鍵事件,咱們?cè)O(shè)為 full 后,連任務(wù)的創(chuàng)建、分配、完成時(shí)間都會(huì)記錄下來(lái),調(diào)試的時(shí)候簡(jiǎn)直不要太方便。

二、流程設(shè)計(jì)初體驗(yàn):用可視化工具畫流程圖

1. 啟動(dòng)項(xiàng)目,打開 Modeler 界面

把項(xiàng)目跑起來(lái),訪問(wèn) http://localhost:8080/flowable-modeler,會(huì)看到一個(gè)登錄界面。別慌,F(xiàn)lowable 默認(rèn)的賬號(hào)密碼是 admin/admin,輸進(jìn)去就能看到高大上的流程設(shè)計(jì)器了。

這個(gè)界面有點(diǎn)像 Visio,左邊是各種流程元素,什么開始事件、用戶任務(wù)、結(jié)束事件,拖出來(lái)就能用。咱們來(lái)畫一個(gè)最簡(jiǎn)單的請(qǐng)假流程:

  • 拖一個(gè)「開始事件」放在畫布上,這就是流程的起點(diǎn)。
  • 拖一個(gè)「用戶任務(wù)」,改名叫「部門經(jīng)理審批」,這一步需要人來(lái)處理。
  • 再拖一個(gè)「用戶任務(wù)」,改名叫「HR 審批」。
  • 最后拖一個(gè)「結(jié)束事件」。

然后用連接線把它們按順序連起來(lái),一個(gè)簡(jiǎn)單的串行審批流程就畫好了。

2. 給任務(wù)節(jié)點(diǎn)加屬性:告訴引擎找誰(shuí)干活

雙擊「部門經(jīng)理審批」節(jié)點(diǎn),在右邊的屬性面板里,找到「Assignee」(任務(wù)負(fù)責(zé)人),這里可以寫固定的用戶 ID,比如 manager,不過(guò)實(shí)際項(xiàng)目中肯定是動(dòng)態(tài)指定的,后面咱會(huì)用代碼實(shí)現(xiàn)。先記住這個(gè)地方,后面會(huì)用到。

3. 導(dǎo)出流程定義:讓代碼認(rèn)識(shí)你的流程圖

畫好流程圖后,點(diǎn)擊左上角的保存,會(huì)讓你輸入流程名稱、key 等信息。流程 key 很重要,后面啟動(dòng)流程的時(shí)候要靠它來(lái)識(shí)別,比如咱們?cè)O(shè)為 leaveProcess。保存后,點(diǎn)擊右上角的「導(dǎo)出為 XML」,會(huì)得到一個(gè) .bpmn20.xml 文件,這個(gè)文件就是流程定義的核心,后面要部署到引擎里。

三、代碼實(shí)現(xiàn):讓流程跑起來(lái)才是硬道理

1. 引入流程引擎對(duì)象:Flowable 的核心工具

在 Spring Boot 里,F(xiàn)lowable 會(huì)自動(dòng)注入一個(gè) ProcessEngine 對(duì)象,里面封裝了所有操作流程的方法。咱們可以在需要的地方直接注入:

@Autowired
private ProcessEngine processEngine;

這個(gè)對(duì)象就像一個(gè)超級(jí)管家,能幫我們部署流程、啟動(dòng)流程、查詢?nèi)蝿?wù)等等,后面咱會(huì)頻繁用到它。

2. 部署流程定義:把流程圖交給引擎管理

有兩種方式部署流程,一種是直接讀取本地的 .bpmn20.xml 文件,另一種是通過(guò) Modeler 界面上傳部署。咱們先試試代碼部署:

@RestController
@RequestMapping("/process")
public class ProcessController {
    @Autowired
    private RepositoryService repositoryService; // 流程定義相關(guān)服務(wù)
    @PostMapping("/deploy")
    public String deployProcess() {
        // 讀取流程文件
        ClassPathResource resource = new ClassPathResource("processes/leaveProcess.bpmn20.xml");
        try {
            InputStream inputStream = resource.getInputStream();
            // 部署流程
            Deployment deployment = repositoryService.createDeployment()
               .name("請(qǐng)假流程")
               .addInputStream("leaveProcess.bpmn20.xml", inputStream)
               .deploy();
            return "部署成功,部署 ID:" + deployment.getId();
        } catch (IOException e) {
            e.printStackTrace();
            return "部署失敗";
        }
    }
}

這里用到了 RepositoryService,它是專門管理流程定義和部署的服務(wù)。部署成功后,數(shù)據(jù)庫(kù)里的 ACT_RE_DEPLOYMENT、ACT_RE_PROCDEF 等表就會(huì)有數(shù)據(jù)了,這就是流程定義的元數(shù)據(jù)。

3. 啟動(dòng)流程實(shí)例:讓流程開始跑起來(lái)

部署完流程后,就可以啟動(dòng)流程實(shí)例了。比如小明要請(qǐng)假,就需要啟動(dòng)一個(gè)請(qǐng)假流程的實(shí)例:

@PostMapping("/start")
public String startProcess(@RequestParam String userId) {
    // 使用流程 key 啟動(dòng)流程,并傳遞參數(shù)(這里傳遞申請(qǐng)人 ID)
    Map<String, Object> variables = new HashMap<>();
    variables.put("applicant", userId); // 申請(qǐng)人 ID,后面審批時(shí)可能會(huì)用到
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess", variables);
    return "流程啟動(dòng)成功,流程實(shí)例 ID:" + processInstance.getId();
}

這里用到了 RuntimeService,它是管理運(yùn)行中的流程實(shí)例和執(zhí)行對(duì)象的服務(wù)。啟動(dòng)流程時(shí)可以傳遞變量,這些變量可以在流程節(jié)點(diǎn)中使用,比如在任務(wù)分配時(shí),根據(jù)變量動(dòng)態(tài)指定負(fù)責(zé)人。

4. 查詢用戶任務(wù):讓用戶知道該干啥了

當(dāng)流程走到用戶任務(wù)節(jié)點(diǎn)時(shí),需要查詢當(dāng)前用戶有哪些待辦任務(wù)。比如部門經(jīng)理登錄系統(tǒng),需要看到自己待審批的任務(wù):

@GetMapping("/tasks")
public List<Task> getTasks(@RequestParam String userId) {
    List<Task> tasks = taskService.createTaskQuery()
       .taskAssignee(userId) // 根據(jù)任務(wù)負(fù)責(zé)人查詢
       .orderByTaskCreateTime().desc() // 按創(chuàng)建時(shí)間倒序排列
       .list();
    return tasks;
}

這里用到了 TaskService,專門管理任務(wù)的創(chuàng)建、分配、完成等操作。taskAssignee 就是咱們之前在流程圖里設(shè)置的任務(wù)負(fù)責(zé)人,不過(guò)實(shí)際項(xiàng)目中,更多是通過(guò)候選人或者候選組來(lái)分配任務(wù),后面咱會(huì)講到。

5. 完成任務(wù):推動(dòng)流程往下走

用戶處理完任務(wù)后,需要完成任務(wù),讓流程走到下一個(gè)節(jié)點(diǎn)。比如部門經(jīng)理審批通過(guò),任務(wù)就會(huì)到 HR 那里:

@PostMapping("/complete")
public String completeTask(@RequestParam String taskId, @RequestParam Map<String, Object> variables) {
    taskService.complete(taskId, variables); // 完成任務(wù)時(shí)可以傳遞變量,比如審批意見
    return "任務(wù)完成,流程繼續(xù)";
}

這里的 variables 可以傳遞審批結(jié)果、意見等信息,這些信息可以在后續(xù)節(jié)點(diǎn)中使用,比如 HR 審批時(shí)可以看到部門經(jīng)理的意見。

四、進(jìn)階操作:讓流程更靈活更強(qiáng)大

1. 動(dòng)態(tài)分配任務(wù):別再寫死負(fù)責(zé)人了

前面咱們?cè)诹鞒虉D里寫死了任務(wù)負(fù)責(zé)人 manager,這在實(shí)際項(xiàng)目中肯定不行,畢竟不同的流程可能有不同的審批人。Flowable 支持多種任務(wù)分配方式:

  • 候選人(Candidate Users):任務(wù)可以分配給多個(gè)候選人,任何一個(gè)候選人都可以認(rèn)領(lǐng)任務(wù)。
// 分配候選人
taskService.addCandidateUser(taskId, "user1");
taskService.addCandidateUser(taskId, "user2");
// 查詢候選人任務(wù)
List<Task> candidateTasks = taskService.createTaskQuery()
   .taskCandidateUser(userId)
   .list();
  • 候選組(Candidate Groups):把用戶分組,任務(wù)分配給組,組內(nèi)成員都可以處理。
taskService.addCandidateGroup(taskId, "managerGroup");
  • 表達(dá)式分配:在流程圖里用 EL 表達(dá)式動(dòng)態(tài)指定負(fù)責(zé)人,比如根據(jù)流程變量 managerId 來(lái)分配。
assignee="${managerId}"

2. 流程變量的妙用:讓流程更智能

流程變量就像流程里的「全局變量」,可以在各個(gè)節(jié)點(diǎn)之間傳遞數(shù)據(jù)。比如請(qǐng)假流程里的請(qǐng)假天數(shù)、請(qǐng)假原因,都可以作為流程變量存儲(chǔ),還可以在流程條件中使用。比如添加一個(gè)條件分支,請(qǐng)假天數(shù)超過(guò) 3 天需要總經(jīng)理審批:

在流程圖里加一個(gè)「排他網(wǎng)關(guān)」,連接線的條件表達(dá)式可以寫:

${days > 3}

然后在啟動(dòng)流程時(shí)傳遞 days 變量,流程就會(huì)根據(jù)這個(gè)條件自動(dòng)選擇走向。

3. 歷史數(shù)據(jù)查詢:出了問(wèn)題別慌,有記錄可查

前面咱們?cè)O(shè)置了 history.level=full,現(xiàn)在可以用 HistoryService 來(lái)查詢歷史數(shù)據(jù)了。比如查詢某個(gè)流程實(shí)例的所有歷史任務(wù):

@Autowired
private HistoryService historyService;

public void queryHistoryTasks(String processInstanceId) {
    List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery()
       .processInstanceId(processInstanceId)
       .orderByHistoricTaskInstanceStartTime().asc()
       .list();
    for (HistoricTaskInstance task : tasks) {
        System.out.println("任務(wù)名稱:" + task.getName() + ",負(fù)責(zé)人:" + task.getAssignee() + ",狀態(tài):" + task.getTaskStatus());
    }
}

還可以查詢歷史流程變量、歷史審批意見等,簡(jiǎn)直是排查問(wèn)題的神器。

4. 與 Spring Security 集成:安全問(wèn)題不能忽視

如果你的項(xiàng)目用了 Spring Security 做權(quán)限管理,F(xiàn)lowable 的 Modeler 界面也需要做權(quán)限控制??梢宰远x一個(gè)認(rèn)證處理器,實(shí)現(xiàn) FlowableAuthenticationProvider 接口,把 Spring Security 的用戶信息傳遞給 Flowable。具體代碼有點(diǎn)多,這里就不展開了,后面咱們可以專門寫一篇講權(quán)限集成的文章。

五、實(shí)戰(zhàn)案例:搞一個(gè)完整的請(qǐng)假流程

1. 流程圖設(shè)計(jì)(升級(jí)版)

咱們來(lái)設(shè)計(jì)一個(gè)更真實(shí)的請(qǐng)假流程:

  • 開始事件 -> 申請(qǐng)人填寫請(qǐng)假單(用戶任務(wù),收集請(qǐng)假天數(shù)、原因等信息)
  • -> 排他網(wǎng)關(guān)(判斷請(qǐng)假天數(shù)是否超過(guò) 3 天)

是 -> 部門經(jīng)理審批 -> HR 審批 -> 總經(jīng)理審批(如果是管理層請(qǐng)假,跳過(guò)總經(jīng)理審批)

否 -> HR 審批

  • 結(jié)束事件

這里用到了網(wǎng)關(guān)和條件分支,讓流程更靈活。畫流程圖的時(shí)候,記得給每個(gè)節(jié)點(diǎn)起有意義的名字,方便后續(xù)代碼處理。

2. 服務(wù)層代碼實(shí)現(xiàn)(關(guān)鍵邏輯)

@Service
publicclass LeaveProcessService {

    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;

    // 啟動(dòng)請(qǐng)假流程
    publicString startLeaveProcess(String applicant, int days, String reason) {
        Map<String, Object> variables = new HashMap<>();
        variables.put("applicant", applicant);
        variables.put("days", days);
        variables.put("reason", reason);
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess", variables);
        return processInstance.getId();
    }

    // 審批任務(wù)(支持通過(guò)/拒絕)
    publicvoid approveTask(String taskId, String approver, boolean approved, String comment) {
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        if (task == null) {
            thrownew RuntimeException("任務(wù)不存在");
        }
        // 先認(rèn)領(lǐng)任務(wù)(如果是候選人)
        taskService.claim(taskId, approver);
        Map<String, Object> variables = new HashMap<>();
        variables.put("approved", approved);
        variables.put("comment", comment);
        taskService.complete(taskId, variables);
    }

    // 查詢當(dāng)前用戶的待辦任務(wù)(包括候選任務(wù))
    public List<Task> get待辦任務(wù)(String userId) {
        return taskService.createTaskQuery()
           .taskAssignee(userId)
           .or()
           .taskCandidateUser(userId)
           .endOr()
           .orderByTaskCreateTime().desc()
           .list();
    }
}

這里重點(diǎn)處理了候選人任務(wù)的認(rèn)領(lǐng)、審批意見的記錄,以及復(fù)雜的任務(wù)查詢條件。

3. 測(cè)試流程(Postman 走起)

  • 啟動(dòng)流程:POST /process/start?userId=xiaoming,請(qǐng)求體傳 {"days": 5, "reason": "去看偶像演唱會(huì)"}
  • 查詢小明的任務(wù):此時(shí)沒(méi)有任務(wù),因?yàn)榈谝粋€(gè)任務(wù)是申請(qǐng)人填寫請(qǐng)假單,這里咱們簡(jiǎn)化了,假設(shè)啟動(dòng)流程后直接到部門經(jīng)理審批。
  • 部門經(jīng)理審批:POST /process/complete?taskId=123&variables={"approved": true, "comment": "同意"}
  • 查看流程狀態(tài):通過(guò) runtimeService.createProcessInstanceQuery().processInstanceId(xxx).singleResult() 查看是否走到下一個(gè)節(jié)點(diǎn)。

六、常見問(wèn)題與解決方案:踩過(guò)的坑都給你填上

1. 依賴沖突:找不到 Flowable 的類

有時(shí)候引入 Flowable 依賴后,會(huì)和 Spring Boot 的某些版本沖突,比如出現(xiàn) ClassNotFoundException: org.flowable.engine.ProcessEngine。這時(shí)候可以檢查 pom.xml 里的依賴版本,確保 Flowable 的版本和 Spring Boot 兼容,或者排除沖突的依賴:

<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter-process</artifactId>
    <version>6.8.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2. 流程定義版本問(wèn)題:改了流程圖沒(méi)生效

每次部署流程定義時(shí),F(xiàn)lowable 會(huì)生成新的版本。如果啟動(dòng)流程時(shí)還是用舊的 key,可能會(huì)走到舊版本的流程。可以在部署時(shí)加上 deploymenyName 和 key,或者在啟動(dòng)流程時(shí)指定版本:

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess", "1.0"); // 指定版本 1.0

或者直接用最新版本:

ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder()
   .processDefinitionKey("leaveProcess")
   .latestVersion()
   .start();

3. 任務(wù)查詢性能問(wèn)題:數(shù)據(jù)量大了查不動(dòng)

當(dāng)任務(wù)表數(shù)據(jù)量很大時(shí),taskService.createTaskQuery().list() 會(huì)很慢??梢越o ACT_RU_TASK 表的 ASSIGNEE、CANDIDATE_USER 等字段加索引,或者分頁(yè)查詢:

Page<Task> tasks = taskService.createTaskQuery()
   .taskAssignee(userId)
   .orderByTaskCreateTime().desc()
   .listPage(pageable.getPageNumber(), pageable.getPageSize());

4. 中文亂碼問(wèn)題:流程節(jié)點(diǎn)名稱顯示亂碼

如果在流程圖里用了中文,部署后數(shù)據(jù)庫(kù)里顯示亂碼,需要檢查數(shù)據(jù)庫(kù)連接是否設(shè)置了正確的字符集,以及 Modeler 保存時(shí)是否編碼正確。確保數(shù)據(jù)庫(kù)、連接 URL、表結(jié)構(gòu)都是 UTF-8 編碼。

七、Flowable 對(duì)比其他工作流引擎:為啥選它?

1. 對(duì)比 Activiti

Flowable 其實(shí)是從 Activiti 團(tuán)隊(duì)分裂出來(lái)的,兼容性很好,Activiti 的流程定義可以直接拿到 Flowable 里用。但 Flowable 在性能和擴(kuò)展性上做了優(yōu)化,比如支持分布式部署、更好的異步處理,而且社區(qū)活躍度更高,文檔更詳細(xì)。

2. 對(duì)比 Camunda

Camunda 功能很強(qiáng)大,支持云部署,但商業(yè)版收費(fèi)較高,社區(qū)版功能有限。Flowable 保持了開源免費(fèi)策略,同時(shí)提供了企業(yè)版支持,性價(jià)比更高,適合中小團(tuán)隊(duì)使用。

3. 為啥和 Spring Boot 是絕配?

  • 自動(dòng)配置:不用手動(dòng)寫一堆配置類,開箱即用。
  • 無(wú)縫集成:和 Spring 的依賴注入、事務(wù)管理、安全框架完美結(jié)合。
  • 生態(tài)豐富:可以和 Spring Cloud、MyBatis 等框架輕松搭配,拓展性強(qiáng)。

八、總結(jié):爽在哪里?

用 Spring Boot 搭 Flowable 搞工作流,爽就爽在這幾個(gè)地方:

  1. 開發(fā)效率高:不用從頭寫工作流邏輯,可視化設(shè)計(jì)器讓流程建模像搭積木。
  2. 維護(hù)成本低:流程變更只需要改流程圖,部署新版本即可,代碼幾乎不用動(dòng)。
  3. 擴(kuò)展性強(qiáng):支持各種復(fù)雜流程場(chǎng)景,無(wú)論是串行、并行、分支、循環(huán),都能輕松搞定。
  4. 調(diào)試方便:豐富的歷史記錄和查詢接口,讓你隨時(shí)知道流程走到哪一步,出了問(wèn)題分分鐘定位。

到此這篇關(guān)于SpringBoot搭Flowable搞工作流的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot搭Flowable工作流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 詳解在spring中使用JdbcTemplate操作數(shù)據(jù)庫(kù)的幾種方式

    詳解在spring中使用JdbcTemplate操作數(shù)據(jù)庫(kù)的幾種方式

    這篇文章主要介紹了詳解在spring中使用JdbcTemplate操作數(shù)據(jù)庫(kù)的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • springboot調(diào)用python腳本的實(shí)現(xiàn)示例

    springboot調(diào)用python腳本的實(shí)現(xiàn)示例

    本文介紹了在SpringBoot應(yīng)用中調(diào)用Python腳本,包括ProcessBuilder類和ApacheCommonsExec庫(kù)兩種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12
  • SpringBoot中的Javaconfig代碼示例

    SpringBoot中的Javaconfig代碼示例

    JavaConfig是一種使用Java類替代XML配置文件的方式來(lái)定義Spring?Bean的機(jī)制,通過(guò)使用`@Configuration`和`@Bean`注解,可以將第三方JAR包中的對(duì)象納入Spring?IOC容器管理,本文介紹SpringBoot中的Javaconfig,感興趣的朋友一起看看吧
    2025-02-02
  • SpringBoot+Vue使用Echarts的方式

    SpringBoot+Vue使用Echarts的方式

    這篇文章主要介紹了SpringBoot+Vue使用Echarts的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • java實(shí)現(xiàn)郵件發(fā)送詳解

    java實(shí)現(xiàn)郵件發(fā)送詳解

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)郵件發(fā)送示例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • JDBC連接數(shù)據(jù)庫(kù)的方法匯總

    JDBC連接數(shù)據(jù)庫(kù)的方法匯總

    這篇文章主要介紹了JDBC連接數(shù)據(jù)庫(kù)的方法,結(jié)合實(shí)例形式總結(jié)分析了JDBC連接各種常見數(shù)據(jù)庫(kù)的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-08-08
  • SpringBoot配置Druid數(shù)據(jù)監(jiān)控代碼實(shí)例

    SpringBoot配置Druid數(shù)據(jù)監(jiān)控代碼實(shí)例

    這篇文章主要介紹了SpringBoot配置Druid數(shù)據(jù)監(jiān)控代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • spring-core組件詳解——PropertyResolver屬性解決器

    spring-core組件詳解——PropertyResolver屬性解決器

    這篇文章主要介紹了spring-core組件詳解——PropertyResolver屬性解決器,需要的朋友可以參考下
    2016-05-05
  • SpringBoot大學(xué)心理服務(wù)系統(tǒng)實(shí)現(xiàn)流程分步講解

    SpringBoot大學(xué)心理服務(wù)系統(tǒng)實(shí)現(xiàn)流程分步講解

    本系統(tǒng)主要論述了如何使用JAVA語(yǔ)言開發(fā)一個(gè)大學(xué)生心理服務(wù)系統(tǒng) ,本系統(tǒng)將嚴(yán)格按照軟件開發(fā)流程進(jìn)行各個(gè)階段的工作,采用B/S架構(gòu),面向?qū)ο缶幊趟枷脒M(jìn)行項(xiàng)目開發(fā)
    2022-09-09
  • 使用java NIO及高速緩沖區(qū)寫入文件過(guò)程解析

    使用java NIO及高速緩沖區(qū)寫入文件過(guò)程解析

    這篇文章主要介紹了使用java NIO及高速緩沖區(qū)寫入文件過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論