SpringBoot整合策略模式之基于 ApplicationContextAware + 枚举类实现

news2024/9/26 3:24:14

文章目录

  • 1、ILog
  • 2、LogType 枚举类
  • 3、DemoController
  • 4、application.properties
  • 5、DesignDemoApplication

1、ILog

package com.atguigu.design.demo.spring;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public interface ILog {

    void log(String msg);

    LogType getType();
}
@Component
class FileLog implements ILog {
    @Override
    public void log(String msg) {
        System.out.println("输出日志到文件:"  + msg);
    }

    @Override
    public LogType getType() {
        return LogType.FILE_LOG;
    }
}
@Component
class ConsoleLog implements ILog {
    @Override
    public void log(String msg) {
        System.out.println("输出日志到控制台:" + msg);
    }

    @Override
    public LogType getType() {
        return LogType.CONSOLE_LOG;
    }
}
@Component
class LogClient implements ApplicationContextAware {

    private static final Map<String, ILog> MAP = new ConcurrentHashMap<>();

    /*
    @Autowired
    private FileLog fileLog;

    @Autowired
    private ConsoleLog consoleLog;

    @PostConstruct
    public void init() {
        MAP.put("1", fileLog);
        MAP.put("2", consoleLog);
    }
    */

    /**
     * 根据类型记录日志信息
     *
     * @param type 日志类型,用于区分不同类型的日志
     * @param msg 待记录的消息
     */
    public void log(String type, String msg) {
        MAP.get(type).log(msg);
    }

    /**
     * 设置应用上下文,用于初始化日志策略
     * 该方法通过应用上下文获取所有类型的日志策略,并将其初始化
     *
     * @param applicationContext 应用上下文
     * @throws BeansException 如果无法从应用上下文中获取日志策略,抛出该异常
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        // 获取所有实现ILog接口的Bean
        Map<String, ILog> beansOfType = applicationContext.getBeansOfType(ILog.class);
        // 如果没有找到任何ILog实现,则直接返回
        if (CollectionUtils.isEmpty(beansOfType)) {
            return;
        }
        // 将Map中的值转换为Collection类型
        Collection<ILog> beans = beansOfType.values();

        // 遍历所有日志策略Bean,将它们按照类型添加到MAP中
        beans.forEach(bean->{
            // 获取日志策略的类型
            LogType type = bean.getType();
            // 将日志策略添加到MAP中,以便后续根据类型获取对应的日志策略
            MAP.put(type.type, bean);
        });
    }
}

2、LogType 枚举类

package com.atguigu.design.demo.spring;
public enum LogType {
    FILE_LOG("1","文件日志"),
    CONSOLE_LOG("2","控制台日志")
    ;

    public String type;
    public String desc;

    LogType(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }
}

3、DemoController

package com.atguigu.design.demo.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
    @Autowired
    private LogClient logClient;

    @GetMapping("log/{type}")
    public String log(@PathVariable String type, @RequestParam("msg") String msg) {
        logClient.log(type, msg);
        return "日志输出成功!";
    }
}


4、application.properties

spring.application.name=design-demo
server.port=10010


5、DesignDemoApplication

package com.atguigu.design.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


// Generated by https://start.springboot.io
// 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn
@SpringBootApplication
public class DesignDemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DesignDemoApplication.class, args);
	}

}


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2077524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx学习(第二天)

一.Nginx高级配置 1.1 Nginx状态页 基于nginx 模块 ngx_http_stub_status_module 实现&#xff0c; 在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module 否则配置完成之后监测会是提示法错误 注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态 …

PeriodWave: Multi-Period Flow Matching for High-Fidelity Waveform Generation

preprintKorea Seoul, Korea 文章目录 abstractmethodFlow Matching for Waveform GenerationHigh-frequency Information Modeling for Flow Matching demo page&#xff0c; PeriodWave 三者最好&#xff0c;而且能把原声中的噪声去掉&#xff0c;GAN一类声码器做不到的。 Pe…

vllm 部署GLM4模型进行 Zero-Shot 文本分类实验,让大模型给出分类原因,准确率可提高6%

文章目录 简介数据集实验设置数据集转换模型推理评估 简介 本文记录了使用 vllm 部署 GLM4-9B-Chat 模型进行 Zero-Shot 文本分类的实验过程与结果。通过对 AG_News 数据集的测试&#xff0c;研究发现大模型在直接进行分类时的准确率为 77%。然而&#xff0c;让模型给出分类原…

地理空间数据分析技巧:优化的热点分析与异常值分析的应用

热点分析作为一种常用的空间统计方法&#xff0c;能够帮助我们识别地理空间中的热点和冷点区域&#xff0c;即那些高值或低值集中出现的地方。而优化的热点分析进一步简化了这一过程&#xff0c;使用户无需手动调整参数即可获得可靠的结果。此外&#xff0c;异常值分析则专注于…

wooyu漏洞库YYDS!!!入门之道:重现乌云漏洞库

目录 wooyun乌云漏洞库搭建 1、搭建资料 文件结构分析&#xff1a; ​编辑2、搭建过程 2.1、搭建wooyun网站 2.2、配置数据库 2.2.1、修改数据库配置文件conn.php 2.2.2、创建wooyun数据库&#xff0c;并解压数据库文件 2.2.3、连接数据库&#xff08;数据库默认连接密…

信号与系统——定义与分类(1)

一、信号与系统 信号&#xff1a;信号是信息的表现形式或传送载体&#xff0c;例如电磁波。信号可以用一个函数 yx (t) 来表示。 系统&#xff1a;是指若干相互关联的事物组合而成,具有特定功能的整体。换句话说就是&#xff0c;系统就是对输入信号进行加工和处理&#xff0c…

Nginx: 反向代理和动静分离概述

反向代理 反向代理服务器介于用户和真实服务器之间&#xff0c;提供请求和响应的中转服务对于用户而言&#xff0c;访问反向代理服务器就是访问真实服务器反向代理可以有效降低服务器的负载消耗&#xff0c;提升效率 1 &#xff09;反向代理的模型 现在我们有一个用户和真实服…

新版cubemx生成CMake工程浮点数打印问题记录

问题现象 解决方案 set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} --specsnano.specs -u _printf_float")参考Cortex-M4权威指南 重新下载和测试

[Algorithm][综合训练][打怪][判断是不是平衡二叉树][最大子矩阵]详细讲解

目录 1.打怪1.题目链接2.算法原理详解 && 代码实现 2.判断是不是平衡二叉树1.题目链接2.算法原理详解 && 代码实现 3.最大子矩阵1.题目链接2.算法原理详解 && 代码实现 1.打怪 1.题目链接 打怪 2.算法原理详解 && 代码实现 自己的版本&…

C++ 设计模式——代理模式

C 设计模式——代理模式 C 设计模式——代理模式1. 主要组成成分2. 逐步构建代理模式2.1 抽象主题类定义2.2 真实主题类实现2.3 代理类实现2.4 主函数 3. 代理模式 UML 图代理模式 UML 图解析 4. 代理模式的优点5. 代理模式的缺点6. 代理模式的分类7. 代理模式和装饰者模式比较…

MybatisPlus:实现分页效果并解决错误:cant found IPage for args

我们在做开发使用mybatisplus 做分页查询的时候遇到了个问题&#xff1a; 继承 IPage拦截没有作用会默认分页&#xff0c;这个时候报了cant found IPage for args 错误~~~ 我们分析了下&#xff0c;其实这个问题很简单&#xff0c;是因为没有给默认值赋值&#xff0c;因为查询…

日撸Java三百行(day35:图的m着色问题)

目录 一、问题描述 二、思路分析 三、代码实现 总结 一、问题描述 在高中学习排列组合的时候&#xff0c;有一个非常经典的问题&#xff0c;就是涂色问题&#xff0c;即用m种颜色给n块区域涂色&#xff0c;要求每块区域只能涂同一种颜色且相邻区域的颜色不能相同&#xff…

pyinstaller将python程序打包成exe文件

将python代码打包成exe文件可以在不安装python环境的情况下直接运行python代码&#xff0c;譬如自己在自己的电脑上写好了代码&#xff0c;想发给其他人使用&#xff0c;可以用下述方法将python程序打包成exe文件&#xff0c;其他人直接执行exe文件即可使用该程序。 1.安装pyi…

二叉搜索树:数据结构之美

目录 引言基础知识 定义性质操作详解 插入节点删除节点查找节点遍历 前序遍历中序遍历后序遍历高级主题 平衡问题AVL树简介应用案例总结 引言 二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树&#xff0c;它的每个节点具有以下性质&#xff1a;左子树上的所有节点的键…

Python数据采集与网络爬虫技术实训室解决方案

在大数据与人工智能时代&#xff0c;数据采集与分析已成为企业决策、市场洞察、产品创新等领域不可或缺的一环。而Python&#xff0c;作为一门高效、易学的编程语言&#xff0c;凭借其强大的库支持和广泛的应用场景&#xff0c;在数据采集与网络爬虫领域展现出了非凡的潜力。唯…

Mysql重要参数

1、是否开启慢SQL日志 show VARIABLES like slow_query_log%; 2、慢SQL日志保存位置 show VARIABLES like slow_query_log_file%; 3、慢SQL的阈值&#xff0c;超过则是慢SQL&#xff0c;单位秒&#xff0c;默认10s show VARIABLES like long_query_time%;

小阿轩yx-Kubernetes存储入门

小阿轩yx-Kubernetes存储入门 前言 数据是一个企业的发展核心&#xff0c;它涉及到数据存储和数据交换的内容。在生产环境中尤为重要的一部分在 Kubernetes 中另一个重要的概念就是数据持久化 Volume。 Volume 的概念 对多数项目而言 数据文件的存储是非常常见的 在 Kube…

计算机的错误计算(七十四 )

摘要 回复网友的疑问&#xff1a;用错数解释计算机的错误计算&#xff08;六十四&#xff09;中的错误计算原因。 计算机的错误计算&#xff08;六十四&#xff09;到&#xff08;六十九&#xff09;&#xff0c;以及&#xff08;七十一&#xff09;与&#xff08;七十三&…

攻防世界 1000次点击

做题笔记。 下载解压 查壳。 32位ida打开。 查找字符串。 winmain函数写的&#xff0c;程序运行如下&#xff1a; 一开始思路是想着分析找到关键代码然后去od进行调试。 后来&#xff0c;额&#xff0c;不想看代码了。吐了。 尝试去字符串搜索flag样式&#xff0c;确实一发现…

高效恢复,无忧存储:2024年数据恢复工具大搜罗

不知道你是否了解过电子存储设备&#xff0c;我们的设备往往都存储在一个小小的芯片里&#xff0c;它为我们提供了数据携带的便捷性&#xff0c;当然也为我们带来了数据意外丢失的风险。为了我们的数据安全&#xff0c;我们来探讨一下有什么数据恢复工具能为我们的资料保驾护航…