RabbitMQ基本使用,docker安装RabbitMQ,SpringBoot整合RabbitMQ

1.拉取镜像

docker pull rabbitmq:3.9.15-management

2.运行容器

docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.9.15-management

3.访问地址

安装ip加端口号

http://192.168.123.3:15672/

客户端如下:

在这里插入图片描述
登录账号密码:
username:guest
password:guest

4.新增用户

创建管理员账号:
admin
admin
点击add user保存
在这里插入图片描述

在这里插入图片描述

5.新增虚拟空间

在这里插入图片描述

名字要以/开头
/mqname1
在这里插入图片描述

创建成功
在这里插入图片描述

查看是否授予权限
在这里插入图片描述
授权给guest用户权限,根据自己需要授权
在这里插入图片描述
授权成功
在这里插入图片描述

6.原生RabbitMq代码实现

加入依赖

        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.6.0</version>
        </dependency>
package com.mq.pruducer;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * @Author: 简单模式生产者
 * @Date: 2024/01/29/15:16
 * @Description: good good study,day day up
 */
public class SimpleProducer {


    /**
     * 简单模式消息的生产者发送消息
     * @param args
     */
    public static void main(String[] args) throws Exception{
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置RabbitMQ服务主机地址
        connectionFactory.setHost("192.168.3.123");
        //设置RabbitMQ服务端口,默认5672
        connectionFactory.setPort(5672);
        //设置虚拟主机名字,默认/
        connectionFactory.setVirtualHost("/mqname1");
        //设置用户连接名,默认guest
        connectionFactory.setUsername("admin");
        //设置连接密码,默认guest
        connectionFactory.setPassword("admin");
        //创建连接
        Connection connection = connectionFactory.newConnection();
        //创建频道
        Channel channel = connection.createChannel();
        //声明队列
        /**
         * 1.队列的名字
         * 2.持久化
         * 3.是否独占队列,ture:只有这个对象可以操作这个队列,其他的对象如果要操作,只能等这个队列操作结束,相当于加锁
         * 4.在本次连接释放以后,是否删除队列---类似数据库临时表
         * 5.队列的附加属性
         */
        channel.queueDeclare("simple_queue", true, false, false, null);

        for (int i = 0; i < 10; i++) {
            //创建消息
            String message = "这是RabbitMQ的第" + i + "条消息!";
            //消息发送
            /**
             * 1.交换机
             * 2.routingkey是什么:简单模式下和队列的名字保持一致
             * 3.消息的附加属性是什么
             * 4.消息的内容是什么
             */
            channel.basicPublish("","simple_queue", null, message.getBytes());
            //关闭资源
        }
        channel.close();
        connection.close();
    }
}

查看发送消息
在这里插入图片描述

在这里插入图片描述
发送了10条消息
在这里插入图片描述

消费消息

package com.mq.consumer;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

/**
 * @Author: 简单模式消息消费者
 * @Date: 2024/01/29/15:31
 * @Description: good good study,day day up
 */
public class SimpleConsumer {


    /**
     * 简单模式消息消费者接受消息
     * @param args
     */
    public static void main(String[] args) throws Exception{
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置RabbitMQ服务主机地址,默认localhost
        connectionFactory.setHost("192.168.3.123");
        //设置RabbitMQ服务端口,默认5672
        connectionFactory.setPort(5672);
        //设置虚拟主机名字,默认/
        connectionFactory.setVirtualHost("/mqname1");
        //设置用户连接名,默认guest
        connectionFactory.setUsername("admin");
        //设置连接密码,默认guest
        connectionFactory.setPassword("admin");
        //创建连接
        Connection connection = connectionFactory.newConnection();
        //创建频道
        Channel channel = connection.createChannel();
        //声明队列
        /**
         * 1.队列的名字
         * 2.持久化
         * 3.是否独占队列
         * 4.在本次连接释放以后,是否删除队列---临时表
         * 5.队列的附加属性
         */
        channel.queueDeclare("simple_queue", true, false, false, null);
        //创建消费者,并设置消息处理:自定义的操作
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
            /**
             * 真实自定义处理消息的逻辑
             * @param consumerTag:消息的标签
             * @param envelope:消息的属性:消息属于哪个交换机发来的, 消息数据哪个队列=消息routingkey是什么,消息的编号
             * @param properties
             * @param body:消息的内容
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException, UnsupportedEncodingException {
                String s = new String(body, "UTF-8");
                System.out.println("收到的消息的内容为:" + s);
                long deliveryTag = envelope.getDeliveryTag();//消息的编号
                String exchange = envelope.getExchange();//交换机的信息
                String routingKey = envelope.getRoutingKey();//routingKey的信息
                System.out.println("收到的消息的编号为:" + deliveryTag);
                System.out.println("收到的消息的所属的为:" + exchange);
                System.out.println("收到的消息所属的队列为:" + routingKey);

                //保存消息到数据库
            }
        };

        //消息监听
        /**
         * 1.监听队列的名字
         * 2.是否自动确认消息
         */
        channel.basicConsume("simple_queue", true, defaultConsumer);
        //关闭资源(不建议关闭,建议一直监听消息)
    }
}

在这里插入图片描述

已经消费

在这里插入图片描述

广播模式

package com.mq.pruducer;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * @Author: 广播模式生产者
 * @Date: 2024/01/29/15:58
 * @Description: good good study,day day up
 */
public class FanoutProducer {

    /**
     * 广播模式消息的生产者发送消息
     * @param args
     */
    public static void main(String[] args) throws Exception{
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置RabbitMQ服务主机地址,默认localhost
        connectionFactory.setHost("192.168.3.123");
        //设置RabbitMQ服务端口,默认5672
        connectionFactory.setPort(5672);
        //设置虚拟主机名字,默认/
        connectionFactory.setVirtualHost("/mqname1");
        //设置用户连接名,默认guest
        connectionFactory.setUsername("admin");
        //设置连接密码,默认guest
        connectionFactory.setPassword("admin");
        //创建连接
        Connection connection = connectionFactory.newConnection();
        //创建频道
        Channel channel = connection.createChannel();
        //声明队列
        /**
         * 1.队列的名字
         * 2.持久化
         * 3.是否独占队列
         * 4.在本次连接释放以后,是否删除队列---临时表
         * 5.队列的附加属性
         */
        channel.queueDeclare("fanout_queue_1", true, false, false, null);
        channel.queueDeclare("fanout_queue_2", true, false, false, null);

        //声明交换机
        /**
         * 1.交换机的名字
         * 2.交换机的类型
         */
        channel.exchangeDeclare("fanout_exchange", BuiltinExchangeType.FANOUT);

        //绑定
        /**
         * 1.队列
         * 2.交换机
         * 3.routingkey
         */
        channel.queueBind("fanout_queue_1", "fanout_exchange", "");
        channel.queueBind("fanout_queue_2", "fanout_exchange", "");

        for (int i = 0; i < 10; i++) {
            //创建消息
            String message = "这是广播模式的第" + i + "条消息!";
            //消息发送
            /**
             * 1.交换机
             * 2.routingkey是什么:简单模式下和队列的名字保持一致
             * 3.消息的附加属性是什么
             * 4.消息的内容是什么
             */
            if(i % 3  == 0){
                channel.basicPublish("fanout_exchange","", null, message.getBytes());
            }else{
                channel.basicPublish("fanout_exchange","", null, message.getBytes());
            }

            //关闭资源
        }
        channel.close();
        connection.close();
    }
}

消费者

package com.mq.consumer;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @Author: 广播模式消费者1
 * @Date: 2024/01/29/16:03
 * @Description: good good study,day day up
 */
public class FanoutConsumer1 {


    /**
     * 广播模式消息消费者接受消息
     * @param args
     */
    public static void main(String[] args) throws Exception{
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置RabbitMQ服务主机地址,默认localhost
        connectionFactory.setHost("192.168.3.123");
        //设置RabbitMQ服务端口,默认5672
        connectionFactory.setPort(5672);
        //设置虚拟主机名字,默认/
        connectionFactory.setVirtualHost("/mqname1");
        //设置用户连接名,默认guest
        connectionFactory.setUsername("admin");
        //设置连接密码,默认guest
        connectionFactory.setPassword("admin");
        //创建连接
        Connection connection = connectionFactory.newConnection();
        //创建频道
        Channel channel = connection.createChannel();
        //声明队列
        /**
         * 1.队列的名字
         * 2.持久化
         * 3.是否独占队列
         * 4.在本次连接释放以后,是否删除队列---临时表
         * 5.队列的附加属性
         */
        channel.queueDeclare("fanout_queue_1", true, false, false, null);
        //创建消费者,并设置消息处理:自定义的操作
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
            /**
             * 真实自定义处理消息的逻辑
             * @param consumerTag:消息的标签
             * @param envelope:消息的属性:消息属于哪个交换机发来的, 消息数据哪个队列=消息routingkey是什么,消息的编号
             * @param properties
             * @param body:消息的内容
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String s = new String(body, "UTF-8");
                System.out.println("收到的消息的内容为:" + s);
                long deliveryTag = envelope.getDeliveryTag();//消息的编号
                String exchange = envelope.getExchange();//交换机的信息
                String routingKey = envelope.getRoutingKey();//routingKey的信息
                System.out.println("收到的消息的编号为:" + deliveryTag);
                System.out.println("收到的消息的所属的为:" + exchange);
                System.out.println("收到的消息所属的队列为:" + routingKey);

                //保存消息到数据库
            }
        };

        //消息监听
        /**
         * 1.监听队列的名字
         * 2.是否自动确认消息
         */
        channel.basicConsume("fanout_queue_1", true, defaultConsumer);
        //关闭资源(不建议关闭,建议一直监听消息)
    }
}

package com.mq.consumer;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @Author: 广播模式消费者2
 * @Date: 2024/01/29/16:03
 * @Description: good good study,day day up
 */
public class FanoutConsumer2 {


    /**
     * 广播模式消息消费者接受消息
     * @param args
     */
    public static void main(String[] args) throws Exception{
        //创建连接工厂对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置RabbitMQ服务主机地址,默认localhost
        connectionFactory.setHost("192.168.3.123");
        //设置RabbitMQ服务端口,默认5672
        connectionFactory.setPort(5672);
        //设置虚拟主机名字,默认/
        connectionFactory.setVirtualHost("/mqname1");
        //设置用户连接名,默认guest
        connectionFactory.setUsername("admin");
        //设置连接密码,默认guest
        connectionFactory.setPassword("admin");
        //创建连接
        Connection connection = connectionFactory.newConnection();
        //创建频道
        Channel channel = connection.createChannel();
        //声明队列
        /**
         * 1.队列的名字
         * 2.持久化
         * 3.是否独占队列
         * 4.在本次连接释放以后,是否删除队列---临时表
         * 5.队列的附加属性
         */
        channel.queueDeclare("fanout_queue_2", true, false, false, null);
        //创建消费者,并设置消息处理:自定义的操作
        DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
            /**
             * 真实自定义处理消息的逻辑
             * @param consumerTag:消息的标签
             * @param envelope:消息的属性:消息属于哪个交换机发来的, 消息数据哪个队列=消息routingkey是什么,消息的编号
             * @param properties
             * @param body:消息的内容
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                String s = new String(body, "UTF-8");
                System.out.println("收到的消息的内容为:" + s);
                long deliveryTag = envelope.getDeliveryTag();//消息的编号
                String exchange = envelope.getExchange();//交换机的信息
                String routingKey = envelope.getRoutingKey();//routingKey的信息
                System.out.println("收到的消息的编号为:" + deliveryTag);
                System.out.println("收到的消息的所属的为:" + exchange);
                System.out.println("收到的消息所属的队列为:" + routingKey);

                //保存消息到数据库
            }
        };

        //消息监听
        /**
         * 1.监听队列的名字
         * 2.是否自动确认消息
         */
        channel.basicConsume("fanout_queue_2", true, defaultConsumer);
        //关闭资源(不建议关闭,建议一直监听消息)
    }
}

广播模式队列
在这里插入图片描述
广播模式交换机

在这里插入图片描述

7.springboot整合RabbitMQ

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
            <version>2.3.4.RELEASE</version>
        </dependency>
server:
  port: 19012
spring:
  rabbitmq:
    host: 192.168.3.123
    port: 5672
    virtual-host: /mqname1
    username: admin
    password: admin

配置类

package com.mq.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author: 配置类
 * @Date: 2024/01/29/16:37
 * @Description: good good study,day day up
 */
@Configuration
public class RabbitMQConfig {
    //创建队列
    @Bean("myQueue")
    public Queue myQueue(){
        return QueueBuilder.durable("springboot_queue").build();
    }

    //创建交换机
    @Bean("myExchange")
    public Exchange myExchange(){
        return ExchangeBuilder.topicExchange("springboot_exchange").build();
    }

    //创建绑定
    @Bean
    public Binding myBinding(@Qualifier("myQueue") Queue myQueue,
                             @Qualifier("myExchange") Exchange myExchange){
        return BindingBuilder.bind(myQueue).to(myExchange).with("user.#").noargs();
    }
}

发送消息测试

package com.mq.controller;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: 测试类
 * @Date: 2024/01/29/13:36
 * @Description: good good study,day day up
 */
@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private RabbitTemplate rabbitTemplate;


    @RequestMapping("/one")
    public String one(){
        rabbitTemplate.convertAndSend("springboot_exchange","user.insert","1新增类型的消息");
        rabbitTemplate.convertAndSend("springboot_exchange","user.update","2修改类型的消息");
        rabbitTemplate.convertAndSend("springboot_exchange","user.delete","3删除类型的消息");
        return "发送成功";
    }

}

新建一个监听服务

package com.listener;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @Author: 监听类mq
 * @Date: 2024/01/29/17:19
 * @Description: good good study,day day up
 */
@Component
public class MessageListener {
    /**
     * 监听某个队列的消息
     * @param message 接收到的消息
     */
    @RabbitListener(queues = "springboot_queue")
    public void myListener1(String message){
        System.out.println("消费者接收到的消息为:" + message);
    }
}

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过Opencv进行角点检测

目录 引入 介绍 ①使用的主要函数介绍 ②实际例子解释 ③自相似性是什么? 引入 我们想要获取图片上的角点,就要用到我们的harris角点检测 介绍 ①使用的主要函数介绍 cv2.cornerHarris() img&#xff1a; 数据类型为 float32 的入图像 不是float32的数据要使用&#xff0…

扩展学习|一文明晰推荐系统应用开发核心技术发展

文献来源&#xff1a;Lu J, Wu D, Mao M, et al. Recommender system application developments: a survey[J]. Decision support systems, 2015, 74: 12-32. 主题&#xff1a;关于推荐系统应用开发的调查研究 关键词:推荐系统、电子服务个性化、电子商务、电子学习、电子政务 …

FastBee开源物联网平台2.0开源版发布啦!!!

一、项目介绍 物美智能(wumei-smart)更名为蜂信物联(FastBee)。 FastBee开源物联网平台&#xff0c;简单易用&#xff0c;更适合中小企业和个人学习使用。适用于智能家居、智慧办公、智慧社区、农业监测、水利监测、工业控制等。 系统后端采用Spring boot&#xff1b;前端采用…

手机壳也能散热了?

作为一个玩了6年的王者荣耀玩家&#xff0c;手机发热真的很影响游戏体验&#xff01;&#xff01;游戏掉帧&#xff0c;性能下降很恼人&#xff0c;试过好几个散热工具&#xff0c;实际效果都不太好&#xff5e; 自从入了Mate 60之后&#xff0c;看着这款微泵液冷壳毫无犹豫第…

【解决】Unity 工程无法正常打开而崩溃问题

开发平台&#xff1a;Unity 2022.3.17f1c1 一、问题描述 访问 Unity 工程等待 Open Projet&#xff08;busy for 时间&#xff09;&#xff0c;出现崩溃、闪退等情况&#xff0c;导致无法正常进入Unity编辑页面。 二、问题分析 笔者在 URP 渲染管线下处理 Obi Fluid 流体插件 D…

动手学深度学习(一)深度学习介绍1

目录 一、引言 1.日常生活中的机器学习&#xff1a; 2.机器学习中的关键组件&#xff1a; 2.1 数据&#xff1a; 2.2 模型&#xff1a; 2.3 目标函数&#xff1a; 2.4 优化算法&#xff1a; 3. 各种机器学习问题&#xff1a; 3.1 监督学习&#xff1a; 3.1.1 回归&…

Databend 开源周报第 130 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持 CREATE OR…

推荐一款Linux、数据库、Redis、MongoDB统一管理平台!

官方演示 状态查看 ssh 终端 文件操作 数据库操作 sql 编辑器 在线增删改查数据 Redis 操作 Mongo 操作 系统管理 账号管理 角色管理 资源管理 一.安装 1.下载安装包 cd /opt wget https://gitee.com/dromara/mayfly-go/releases/download/v1.7.1/mayfly-go-linux-amd64.zi…

Hana SQL+正则表达式

目录 一、Pre 前言 二、知识点拆解 1&#xff09;case when…then…else 2&#xff09;json_value 函数 拓展资料 3&#xff09;CAST 函数 拓展资料 4) ROUND 函数 5&#xff09;occurences_regexpr 函数 拓展资料 6&#xff09;正则表达式 拓展资料 三、整合分析…

C++PythonC# 三语言OpenCV从零开发(7):图像的阈值

文章目录 相关链接前言阈值阈值使用代码PythonCCsharpcsharp代码问题 总结 相关链接 C&Python&Csharp in OpenCV 专栏 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程&#xff08;附带课程课件资料课件笔记&#xff09; OpenCV一个窗口同时显示多张图片 …

宋绪杰:我的大数据成长之旅 | 提升之路系列(三)

导读 为了发挥清华大学多学科优势&#xff0c;搭建跨学科交叉融合平台&#xff0c;创新跨学科交叉培养模式&#xff0c;培养具有大数据思维和应用创新的“π”型人才&#xff0c;由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

SV-7102T网络播放解码器

SV-7102T是一款IP网络广播终端&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数据&#xff0c;支持48KHz采样&#xff0c;192Kbps的音频流播放&#xff0c;并提供两路立体声15W的功率输出.SV-7102T设备只有网络广播功能&#xff0c;是一款简单的带功放输出的网…

Wireshark中的TCP协议包分析

Wireshark可以跟踪网络协议的通讯过程&#xff0c;本节通过TCP协议&#xff0c;在了解Wireshark使用的基础上&#xff0c;重温TCP协议的通讯过程。 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传…

如何使用手机安装JuiceSSH远程连接本地Linux服务器

⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 文章目录 ⛳️ 推荐1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址…

PAT-Apat甲级题1003(python和c++实现)下

PTA | 1003 Emergency 书接上回&#xff0c;上次我们使用了python实现无向带权图与DFS算法的设计&#xff0c;本次我们将使用C对本题进行解答&#xff0c;思路和题目分析同上一节内容&#xff0c;本次我们将在上一节的基础上继续实现。 okok现在又是激动人心的手搓代码时间&a…

MySQL解决 恢复从备份点到灾难点之间数据恢复

CSDN 成就一亿技术人&#xff01; 今天分享一期 mysql中 备份之后发生灾难造成数据丢失 那么如何恢复中间的数据呢&#xff1f; 数据库数据高于一切&#xff08;任何数据是不能丢失的&#xff09; CSDN 成就一亿技术人&#xff01; 目录 1.准备测试数据库 2.备份数据库 观…

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用

背景 开发中我们基本使用windows系统比较快捷&#xff0c;但是部署的时候我们又希望使用linux比较便宜&#xff0c;硬件产商还仅提供了c sdk&#xff01;苦了我们做二次开发的码农。 方案 需要确认一件事&#xff0c;目前c这门语言不是跨平台的 第一个问题【C生成dll在window…

C语言——深入理解指针1

目录 1. 内存和地址1.1 内存 2. 指针变量和地址2.1 取地址操作符2.2 指针变量和解引用操作符&#xff08;*&#xff09;2.2.1 指针变量2.2.2 如何拆解指针变量2.2.3 解引用操作符 2.3 指针的大小 3. 指针变量类型的意义3.1 指针的解引用3.2 指针 - 整数3.3 void*指针 4. const…

TypeScript 学习笔记(Day2)

「写在前面」 本文为 b 站黑马程序员 TypeScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. TypeScript 学习笔记&#xff08;Day1&#xff09; 目录 3 TypeScript 常…

百度输入法往选字框里强塞广告

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 国内几乎100%的输入法都有广告&#xff0c;只是你们没发现而已&#xff01;&#xff01;&#xff01; 百度输入法居然在输入法键盘上推送广告&#xff0c;近日&#xff0c;博主阑夕 表示&#xff0c;V2EX论坛上有…