国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

當前位置:首頁 > 科技  > 軟件

SpringBoot3進階用法,你學會了嗎?

來源: 責編: 時間:2023-08-09 23:02:58 433觀看
導讀一、簡介在上篇《SpringBoot3基礎》中已經完成入門案例的開發和測試,在這篇內容中再來看看進階功能的用法;主要涉及如下幾個功能點:調度任務:在應用中提供一定的輕量級的調度能力,比如方法按指定的定時規則執行,或者異步執

一、簡介

在上篇《SpringBoot3基礎》中已經完成入門案例的開發和測試,在這篇內容中再來看看進階功能的用法;lFZ28資訊網——每日最新資訊28at.com

主要涉及如下幾個功能點:lFZ28資訊網——每日最新資訊28at.com

調度任務:在應用中提供一定的輕量級的調度能力,比如方法按指定的定時規則執行,或者異步執行,從而完成相應的代碼邏輯;lFZ28資訊網——每日最新資訊28at.com

郵件發送:郵件作為消息體系中的渠道,是常用的功能;lFZ28資訊網——每日最新資訊28at.com

應用監控:實時或定期監控應用的健康狀態,以及各種關鍵的指標信息;lFZ28資訊網——每日最新資訊28at.com

切面編程:通過預編譯方式和運行期動態代理實現程序中部分功能統一維護的技術,可以將業務流程中的部分邏輯解耦處理,提升可復用性;lFZ28資訊網——每日最新資訊28at.com

二、工程搭建

1、工程結構

圖片圖片lFZ28資訊網——每日最新資訊28at.com

2、依賴管理

<!-- 基礎框架依賴 --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId>    <version>${spring-boot.version}</version></dependency><!-- 應用監控組件 --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-actuator</artifactId>    <version>${spring-boot.version}</version></dependency><!-- 切面編程組件 --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-aop</artifactId>    <version>${spring-boot.version}</version></dependency><!-- 郵件發送組件 --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-mail</artifactId>    <version>${spring-boot.version}</version></dependency>

這里再細致的查看一下各個功能的組件依賴體系,SpringBoot只是提供了強大的集成能力;lFZ28資訊網——每日最新資訊28at.com

圖片圖片lFZ28資訊網——每日最新資訊28at.com

3、啟動類

注意在啟動類中使用注解開啟了異步EnableAsync和調度EnableScheduling的能力;lFZ28資訊網——每日最新資訊28at.com

@EnableAsync@EnableScheduling@SpringBootApplicationpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }}

三、切面編程

1、定義注解

定義一個方法級的注解;lFZ28資訊網——每日最新資訊28at.com

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)@Documentedpublic @interface DefAop {    /**     * 模塊描述     */    String modelDesc();    /**     * 其他信息     */    String otherInfo();}

2、注解切面

在切面中使用Around環繞通知類型,會攔截到DefAop注解標記的方法,然后解析獲取各種信息,進而嵌入自定義的流程邏輯;lFZ28資訊網——每日最新資訊28at.com

@Component@Aspectpublic class LogicAop {    private static final Logger logger = LoggerFactory.getLogger(LogicAop.class) ;        /**     * 切入點     */    @Pointcut("@annotation(com.boot.senior.aop.DefAop)")    public void defAopPointCut() {    }    /**     * 環繞切入     */    @Around("defAopPointCut()")    public Object around (ProceedingJoinPoint proceedingJoinPoint) throws Throwable {        Object result = null ;        try{            // 執行方法            result = proceedingJoinPoint.proceed();        } catch (Exception e){            e.printStackTrace();        } finally {            // 處理邏輯            buildLogicAop(proceedingJoinPoint) ;        }        return result ;    }    /**     * 構建處理邏輯     */    private void buildLogicAop (ProceedingJoinPoint point){        // 獲取方法        MethodSignature signature = (MethodSignature) point.getSignature();        Method reqMethod = signature.getMethod();        // 獲取注解        DefAop defAop = reqMethod.getAnnotation(DefAop.class);        String modelDesc = defAop.modelDesc() ;        String otherInfo = defAop.otherInfo();        logger.info("DefAop-modelDesc:{}",modelDesc);        logger.info("DefAop-otherInfo:{}",otherInfo);    }}

四、調度任務

1、異步處理

1.1 方法定義

通過Async注解標識兩個方法,方法在執行時會休眠10秒,其中一個注解指定異步執行使用asyncPool線程池;lFZ28資訊網——每日最新資訊28at.com

@Servicepublic class AsyncService {    private static final Logger log = LoggerFactory.getLogger(AsyncService.class);    @Async    public void asyncJob (){        try {            TimeUnit.SECONDS.sleep(10);        } catch (InterruptedException e) {            throw new RuntimeException(e);        }        log.info("async-job-01-end...");    }    @Async("asyncPool")    public void asyncJobPool (){        try {            TimeUnit.SECONDS.sleep(10);        } catch (InterruptedException e) {            throw new RuntimeException(e);        }        log.info("async-job-02-end...");    }}

1.2 線程池

定義一個ThreadPoolTaskExecutor線程池對象;lFZ28資訊網——每日最新資訊28at.com

@Configurationpublic class PoolConfig {    @Bean("asyncPool")    public Executor asyncPool () {        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();        // 線程池命名前綴        executor.setThreadNamePrefix("async-pool-");        // 核心線程數5        executor.setCorePoolSize(5);        // 最大線程數10        executor.setMaxPoolSize(10);        // 緩沖執行任務的隊列50        executor.setQueueCapacity(50);        // 線程的空閑時間60秒        executor.setKeepAliveSeconds(60);        // 線程池對拒絕任務的處理策略        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());        // 線程池關閉的時等待所有任務都完成再繼續銷毀其他的Bean        executor.setWaitForTasksToCompleteOnShutdown(true);        // 設置線程池中任務的等待時間        executor.setAwaitTerminationSeconds(300);        return executor;    }}

1.3 輸出信息

從輸出的日志信息中可以發現,兩個異步方法所使用的線程池不一樣,asyncJob采用默認的cTaskExecutor線程池,asyncJobPool方法采用的是async-pool線程池;lFZ28資訊網——每日最新資訊28at.com

[schedule-pool-1] c.boot.senior.schedule.ScheduleService   : async-job-02-end...[cTaskExecutor-1] c.boot.senior.schedule.ScheduleService   : async-job-01-end...

2、調度任務

2.1 調度配置

通過實現SchedulingConfigurer接口,來修改調度任務的配置,這里重新定義任務執行的線程池;lFZ28資訊網——每日最新資訊28at.com

@Configurationpublic class ScheduleConfig implements SchedulingConfigurer {    @Override    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {        scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));    }}

2.2 調度方法

通過Scheduled注解來標記方法,基于定時器的規則設定,來統一管理方法的執行時間;lFZ28資訊網——每日最新資訊28at.com

@Componentpublic class ScheduleJob {    private static final Logger log = LoggerFactory.getLogger(ScheduleJob.class);    private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;    /**     * 上一次開始執行時間點之后10秒再執行     */    @Scheduled(fixedRate = 10000)    private void timerJob1(){        log.info("timer-job-1:{}",format.format(new Date()));    }    /**     * 上一次執行完畢時間點之后10秒再執行     */    @Scheduled(fixedDelay = 10000)    private void timerJob2(){        log.info("timer-job-2:{}",format.format(new Date()));    }    /**     * Cron表達式:每30秒執行一次     */    @Scheduled(cron = "0/30 * * * * ?")    private void timerJob3(){        log.info("timer-job-3:{}",format.format(new Date()));    }}

五、郵件發送

1、郵件配置

采用QQ郵箱來模擬郵件的發送方,需要先開啟smtp郵件傳輸協議,在QQ郵箱的設置/賬戶路徑下,并且獲取相應的授權碼,在項目的配置中使用;lFZ28資訊網——每日最新資訊28at.com

圖片lFZ28資訊網——每日最新資訊28at.com

spring:  application:    name: boot-senior  # 郵件配置  mail:    host: smtp.qq.com    port: 465    protocol: smtps    username: 郵箱賬號    password: 郵箱授權碼    properties:      mail.smtp.ssl.enable: true

2、方法封裝

定義一個簡單的郵件發送方法,并且可以添加附件,是常用的功能之一;另外也可以通過Html靜態頁渲染,再轉換為郵件內容的方式;lFZ28資訊網——每日最新資訊28at.com

@Servicepublic class SendMailService {    @Value("${spring.mail.username}")    private String userName ;    @Resource    private JavaMailSender sender;    /**     * 帶附件的郵件發送方法     * @param toUsers 接收人     * @param subject 主題     * @param content 內容     * @param attachPath 附件地址     * @return java.lang.String     * @since 2023-07-10 17:03     */    public String sendMail (String[] toUsers,String subject,                            String content,String attachPath) throws Exception {        // MIME郵件類        MimeMessage mimeMessage = sender.createMimeMessage();        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);        // 郵件發送方From和接收方To        helper.setFrom(userName);        helper.setTo(toUsers);        // 郵件主題和內容        helper.setSubject(subject);        helper.setText(content);        // 郵件中的附件        File attachFile = ResourceUtils.getFile(attachPath);        helper.addAttachment(attachFile.getName(), attachFile);        // 執行郵件發送命令        sender.send(mimeMessage);        return "send...mail...sus" ;    }}

測試結果lFZ28資訊網——每日最新資訊28at.com

圖片圖片lFZ28資訊網——每日最新資訊28at.com

六、應用監控

1、監控配置

在springboot的actuator組件中,可以通過提供的Rest接口,來獲取應用的監控信息;lFZ28資訊網——每日最新資訊28at.com

# 應用監控配置management:  endpoints:    web:      exposure:        # 打開所有的監控點        include: "*"      base-path: /monitor  endpoint:    health:      enabled: true      show-details: always    beans:      enabled: true    shutdown:      enabled: true

2、相關接口

2.1 Get類型接口:主機:端口/monitor/health,查看應用的健康信息,三個核心指標:status狀態,diskSpace磁盤空間,ping檢查;lFZ28資訊網——每日最新資訊28at.com

{    /* 狀態值 */ "status": "UP", "components": {     /* 磁盤空間 */  "diskSpace": {   "status": "UP",   "details": {    "total": 250685575168,    "free": 112149811200,    "threshold": 10485760,    "path": "Path/butte-spring-parent/.",    "exists": true   }  },  /* Ping檢查 */  "ping": {   "status": "UP"  } }}

2.2 Get類型接口:主機:端口/monitor/beans,查看bean列表;lFZ28資訊網——每日最新資訊28at.com

{ "contexts": {  "boot-senior": {   "beans": {    "asyncPool": {     "scope": "singleton",     "type": "org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor",     "resource": "class path resource [com/boot/senior/schedule/PoolConfig.class]"    },    "asyncService": {     "scope": "singleton",     "type": "com.boot.senior.schedule.AsyncService$$SpringCGLIB$$0"    }   }  } }}

2.3 Post類型接口:主機:端口/monitor/shutdown,關閉應用程序;lFZ28資訊網——每日最新資訊28at.com

{    "message": "Shutting down, bye..."}

七、參考源碼

文檔倉庫:https://gitee.com/cicadasmile/butte-java-note源碼倉庫:https://gitee.com/cicadasmile/butte-spring-parent

本文鏈接:http://m.rrqrq.com/showinfo-26-5154-0.htmlSpringBoot3進階用法,你學會了嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: SpringBoot整合RabbitMQ延遲隊列&amp;優先級隊列詳解

下一篇: VasDolly服務端打渠道包教程

標簽:
  • 熱門焦點
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
在线不卡a资源高清| 欧美午夜电影在线观看| 欧美一区激情视频在线观看| 亚洲精品黄色| 欧美一区二视频| 亚洲欧洲成人精品av97| 久久国产精品99精品国产| 欧美伊人久久| 欧美色老头old∨ideo| 亚洲欧美在线aaa| 国产在线播放一区二区三区| 91久久久久| 精品少妇一区二区三区日产乱码 | 粉嫩欧美一区二区三区高清影视| 色综合欧美在线| 亚洲chinese男男1069| 国产在线麻豆精品观看| 最新国产乱人伦偷精品免费网站| 91精品国产入口| 天堂在线亚洲视频| 国内精品美女在线观看| 欧美一区二区三区在线观看视频 | 色吧成人激情小说| 亚洲欧洲无码一区二区三区| 国产东北露脸精品视频| 亚洲欧美日韩国产| 中文字幕一区在线观看视频| 国产99久久久国产精品潘金| 色国产综合视频| 亚洲日本丝袜连裤袜办公室| av电影在线观看一区| 亚洲国产精品尤物yw在线观看| 国产美女娇喘av呻吟久久| 亚洲专区一区二区三区| 国产精品久久精品日日| 成人黄色片在线观看| 欧美午夜精品电影| 亚洲成人激情av| 亚洲国产一区二区三区高清| 久久久精品日韩欧美| 国产成人8x视频一区二区| 欧美午夜精品久久久久久超碰 | 欧美久久久久久久久| 午夜激情久久久| 国产精品试看| 亚洲综合免费观看高清完整版在线 | 久久综合资源网| 国产福利一区二区三区视频| 欧美午夜一区二区三区免费大片| 亚洲成人自拍偷拍| 亚洲国产国产亚洲一二三| 国产日韩欧美不卡在线| 成人h版在线观看| 日韩精品自拍偷拍| 高清不卡在线观看| 日韩美女主播在线视频一区二区三区 | 亚久久调教视频| 亚洲午夜久久久久久久久久久| 亚洲性视频h| 亚洲视频一区二区免费在线观看| 韩国av一区| 亚洲精品久久7777| 国产精品久久亚洲7777| 一区二区三区欧美激情| 亚洲一区二三| 日韩av在线免费观看不卡| 91黄色免费看| 久久99精品一区二区三区| 欧美日韩国产美女| 福利一区在线观看| 久久久精品综合| 亚洲大胆女人| 无码av免费一区二区三区试看| 欧美亚洲一区二区三区| 日本免费在线视频不卡一不卡二| 色婷婷国产精品| 国产麻豆成人传媒免费观看| 欧美一区永久视频免费观看| av一二三不卡影片| 亚洲欧洲av另类| 久久久水蜜桃| 国产精品自拍在线| 国产日韩av一区二区| 国产综合视频| 性久久久久久久| 91麻豆精品91久久久久同性| 成人久久久精品乱码一区二区三区| 久久久99免费| 一本久久知道综合久久| 久久国产精品露脸对白| 精品福利一区二区三区免费视频| 欧美日韩国产精品一区二区亚洲| 亚洲综合免费观看高清完整版 | 91在线观看免费视频| 亚洲精品视频免费看| 欧美日韩亚洲高清一区二区| av动漫一区二区| 不卡的av中国片| 尤物在线观看一区| 欧美精品久久99久久在免费线| 色综合天天综合网天天狠天天 | 欧美日本乱大交xxxxx| 欧美成人午夜| 天天色综合成人网| 精品国产欧美一区二区| 国产精品试看| 成人午夜视频在线观看| 一区二区三区四区在线播放| 欧美日本韩国一区二区三区视频| 欧美久久影院| 伦理电影国产精品| 国产欧美精品日韩区二区麻豆天美| 欧美综合二区| 99r国产精品| 喷白浆一区二区| 国产精品免费丝袜| 欧美日韩小视频| 一区二区三区国产在线| 成人一区二区三区视频| 五月天丁香久久| 国产精品色一区二区三区| 欧美日韩在线播| 国产精品手机视频| 欧美国产高清| 国产精品亚洲人在线观看| 亚洲精品国产精华液| 精品噜噜噜噜久久久久久久久试看| 国产毛片一区| 欧美色一级片| 丁香另类激情小说| 蜜臀av性久久久久蜜臀aⅴ四虎| 中文字幕av一区二区三区免费看| 欧美日韩电影在线播放| 亚洲综合社区| 国产精品www.| eeuss鲁一区二区三区| 奇米影视一区二区三区| 亚洲六月丁香色婷婷综合久久 | 国产精品久久九九| 欧美精品免费观看二区| 国产91对白在线观看九色| 喷白浆一区二区| 亚洲图片欧美视频| 国产精品久久久久久久久免费相片| 在线电影国产精品| 欧美在线三级电影| 欧美亚洲一区| 国产欧美在线| 亚洲欧洲日夜超级视频| 国内精品福利| 你懂的一区二区| 9色porny自拍视频一区二区| 国产在线观看免费一区| 免费久久99精品国产| 亚洲成a人片在线观看中文| 亚洲欧美日韩综合aⅴ视频| 中文子幕无线码一区tr| 久久精品一区蜜桃臀影院| 欧美精品一区二区蜜臀亚洲| 欧美一区二区精品在线| 制服丝袜亚洲播放| 欧美日韩精品一区二区三区| 欧洲精品一区二区三区在线观看| 久久久久.com| 色诱视频网站一区| 在线亚洲人成电影网站色www| 一本一本久久a久久精品综合妖精| 欧美精品91| 海角社区69精品视频| 亚洲激情网站| 国产视频一区免费看| 午夜一区二区三视频在线观看| 国产婷婷精品| 色域天天综合网| 欧美精品久久天天躁| 日韩亚洲欧美一区| 26uuuu精品一区二区| 欧美精品一区二区蜜臀亚洲| 欧美激情一区在线观看| 国产精品素人视频| 91在线看国产| 91丨九色丨黑人外教| 欧美日韩国产在线一区| 亚洲精品1区| 亚洲欧洲精品成人久久奇米网| 欧美aaaaa成人免费观看视频| 成人动漫一区二区三区| 亚洲一区二区毛片| 日韩免费性生活视频播放| 肉丝袜脚交视频一区二区| 激情综合网av| www.色综合.com| 国产综合18久久久久久| 六月婷婷一区| 欧美一区二区三区婷婷月色| 精品国产乱码久久久久久闺蜜| 中文av字幕一区| 香蕉成人啪国产精品视频综合网| 另类欧美日韩国产在线| jlzzjlzz亚洲日本少妇|