SpringBoot 多模块开发 笔记(一)

  • 多模块开发 简易版
  1. dao 层 也可以说是 Mapper 层
  2. web 层 将 controller 放在这一层 还有 统一返回类型 和 自定义异常 也在放在这里 启动类也放在这里
  3. model 层 也就是 数据对象 比如常见的 User 类
  4. server 层 业务逻辑层 或者说 service 层更好
创建步骤
  1. 创建一个正常的 Springboot 项目
  2. 删除 src 目录 和 不需要的 mvn 文件
  3. 修改 pom.xml
    1. 值得注意的是新版 idea 创建 Springboot 项目强制使用 jdk 17 这里使用的 解决办法就是 正常使用jdk17 创建项目创建完成后再在pom.xml中修改回来
    2. 解决办法不止 一种可以自行搜索
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.6.RELEASE</version></parent><groupId>com.codervibe</groupId><artifactId>springbootmultimodule</artifactId><version>0.0.1-SNAPSHOT</version><name>springbootmultimodule</name><description>springbootmultimodule</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><!-- 修改打包方式为 pom --><packaging>pom</packaging><!--指定子模块--><modules><module>dao</module><module>web</module><module>server</module><module>model</module></modules><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version><scope>provided</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>
  1. 依次创建 所需的 子模块 dao controller server model
  2. 将 这些模块的 打包方式改为 jar 并将 父模块改为 项目所在的模块
  3. 依赖关系 也就是将 到模块加入到 server 模块的pom.xml 中依次类推
    1. server 模块 依赖于 dao 模块
    2. controller 模块依赖于 server 模块
    3. dao server controller 三个子模块 均依赖于 model 模块
  • 父模块 添加的依赖 比如 mybatis 会同步到 子模块中
  1. 创建一个简易的 controller
@RestController
@RequestMapping("/user")
public class UserController {Logger logger = LoggerFactory.getLogger(UserController.class);@GetMapping("/list")public R list() {List<User> userList = new ArrayList<>();userList.add(new User(1, "孙悟空", "1111", "94df@f4m2.com.cn", new Date(), "1"));userList.add(new User(2, "金蝉子", "1111", "461b@91y35u.xyz", new Date(), "1"));userList.add(new User(3, "鲁班七号", "11111", "6959@687kyp.com", new Date(), "1"));userList.add(new User(4, "鲁班大师", "11111", "fa57@196bmfgq.com.cn", new Date(), "1"));userList.add(new User(5, "安其拉", "111111", "88ac@o23wg.com", new Date(), "1"));logger.info("用户列表 :" + userList.toString());return R.ok().data("userItems", userList).message("用户列表");}
}
  1. 添加 application.yaml
spring:application:name: springbootmultimodulejackson:date-format:yyyy-MM-dd HH:mm:sstime-zone=GMT+8datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3307/vue_login?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=trueusername: rootpassword: admin
server:port: 5767undertow:io-threads: 16worker-threads: 256buffer-size: 1024direct-buffers: trueservlet:context-path: /springbootmultimodule
mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.codervibe.springbootmultimodule.modellogging:level:root: infocom.codervibe.springbootmultimodule: infocom.codervibe.springbootmultimodule.mapper: debugfile:path: ./log/
  1. 现在 添加 service的部分 包括 接口 和接口的实现
package com.codervibe.server.service;import com.codervibe.model.User;import java.util.List;public interface UserService {/*** 查询所有用户信息** @return boolean*/List<User> selectUserAll();/*** 添加用户信息列表* @return  boolean*/void addList(List<User> userList);
}
package com.codervibe.server.Impl;import com.codervibe.mapper.UserMapper;
import com.codervibe.model.User;
import com.codervibe.server.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;@Service("UserService")
public class UserServiceImpl implements UserService {Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);@Resourceprivate UserMapper userMapper;/*** 查询所有用户信息** @return userList*/@Overridepublic List<User> selectUserAll() {logger.info(userMapper.selectUserAll().toString());logger.info("即将返回数据");return userMapper.selectUserAll();}/*** 添加用户信息列表** @param userList* @return boolean*/@Overridepublic void addList(List<User> userList) {for (User user : userList) {userMapper.addList(user);}}
}
  1. 修改 controller 类的 方法 并依赖注入 service
package com.codervibe.web.controller;import com.codervibe.model.User;
import com.codervibe.server.service.UserService;
import com.codervibe.web.common.response.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.*;@RestController
@RequestMapping("/user")
public class UserController {Logger logger = LoggerFactory.getLogger(UserController.class);@Resourceprivate UserService userService;@GetMapping("/list")public R list() {logger.info("用户列表 :" + userService.selectUserAll().toString());return R.ok().data("userItems", userService.selectUserAll()).message("用户列表");}@GetMapping("/addList")public R addList() {List<User> userList = new ArrayList<>();userList.add(new User(1, "孙悟空", "1111", "94df@f4m2.com.cn", new Date(), "1"));userList.add(new User(2, "金蝉子", "1111", "461b@91y35u.xyz", new Date(), "1"));userList.add(new User(3, "鲁班七号", "11111", "6959@687kyp.com", new Date(), "1"));userList.add(new User(4, "鲁班大师", "11111", "fa57@196bmfgq.com.cn", new Date(), "1"));userList.add(new User(5, "安其拉", "111111", "88ac@o23wg.com", new Date(), "1"));Map<String, Object> map = new HashMap<>();try {userService.addList(userList);} catch (Exception e) {e.printStackTrace();map.put("fali", false);map.put("message", "用户注册失败" + e.getMessage());return R.error().data(map);}map.put("success", true);map.put("message", "用户注册成功");return R.ok().data(map);}
}
  1. 添加 dao 层 的 Mapper 以及 xml 实现
package com.codervibe.mapper;import com.codervibe.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Component;import java.util.List;@Mapper
@Component
public interface UserMapper {/*** 查询所有用户信息* @return*/List<User> selectUserAll();/*** 添加用户信息列表* @return  boolean*/boolean addList(User user);
}
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.codervibe.mapper.UserMapper"><insert id="addList" parameterType="com.codervibe.model.User" useGeneratedKeys="true" keyProperty="id">insert into user(username,password,email,createTime,role) values (#{username}, #{password},#{email}, #{createTime}, #{role})</insert><select id="selectUserAll" resultType="com.codervibe.model.User" >select * from user</select>
</mapper>
  1. 此时启动 就应用就会报错 这是因为 由于分模块导致没有扫描到其他包 需要在启动类上添加 注解 以扩大 扫描范围
package com.codervibe.web;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(scanBasePackages = {"com.codervibe"})
@MapperScan({"com.codervibe.mapper"})
public class WebApplication {public static void main(String[] args) {SpringApplication.run(WebApplication.class, args);}}
  1. 代码中用到的自定义返回类型
package com.codervibe.web.common.response;import lombok.Data;import java.util.HashMap;
import java.util.Map;@Data
public class R {private Boolean success;private Integer code;private String message;private Map<String, Object> data = new HashMap<>();// 构造器私有private R() {}// 通用返回成功public static R ok() {R r = new R();r.setSuccess(ResultCodeEnum.SUCCESS.getSuccess());r.setCode(ResultCodeEnum.SUCCESS.getCode());r.setMessage(ResultCodeEnum.SUCCESS.getMessage());return r;}// 通用返回失败,未知错误public static R error() {R r = new R();r.setSuccess(ResultCodeEnum.UNKNOWN_ERROR.getSuccess());r.setCode(ResultCodeEnum.UNKNOWN_ERROR.getCode());r.setMessage(ResultCodeEnum.UNKNOWN_ERROR.getMessage());return r;}// 设置结果,形参为结果枚举public static R setResult(ResultCodeEnum result) {R r = new R();r.setSuccess(result.getSuccess());r.setCode(result.getCode());r.setMessage(result.getMessage());return r;}/*** ------------使用链式编程,返回类本身-----------**/// 自定义返回数据public R data(Map<String, Object> map) {this.setData(map);return this;}// 通用设置datapublic R data(String key, Object value) {this.data.put(key, value);return this;}// 自定义状态信息public R message(String message) {this.setMessage(message);return this;}// 自定义状态码public R code(Integer code) {this.setCode(code);return this;}// 自定义返回结果public R success(Boolean success) {this.setSuccess(success);return this;}}
package com.codervibe.web.common.response;import lombok.Getter;@Getter
public enum ResultCodeEnum {SUCCESS(true,20000,"成功"),UNKNOWN_ERROR(false,20001,"未知错误"),PARAM_ERROR(false,20002,"参数错误"),NULL_POINT(false,20003,"空指针错误"),HTTP_CLIENT_ERROR(false,20004,"客户端错误");private  Boolean success;private  Integer code;private  String message;ResultCodeEnum(boolean success,Integer code,String message){this.success =success;this.code = code;this.message =message;}
}

注意

  1. 数据库的端口号为非默认端口号 请注意修改

企鹅粉丝群 179469398

项目地址

SpringBoot 多模块开发 笔记

  • 多模块开发 简易版
  1. dao 层 也可以说是 Mapper 层
  2. web 层 将 controller 放在这一层 还有 统一返回类型 和 自定义异常 也在放在这里 启动类也放在这里
  3. model 层 也就是 数据对象 比如常见的 User 类
  4. server 层 业务逻辑层 或者说 service 层更好
创建步骤
  1. 创建一个正常的 Springboot 项目
  2. 删除 src 目录 和 不需要的 mvn 文件
  3. 修改 pom.xml
    1. 值得注意的是新版 idea 创建 Springboot 项目强制使用 jdk 17 这里使用的 解决办法就是 正常使用jdk17 创建项目创建完成后再在pom.xml中修改回来
    2. 解决办法不止 一种可以自行搜索
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.6.RELEASE</version></parent><groupId>com.codervibe</groupId><artifactId>springbootmultimodule</artifactId><version>0.0.1-SNAPSHOT</version><name>springbootmultimodule</name><description>springbootmultimodule</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><!-- 修改打包方式为 pom --><packaging>pom</packaging><!--指定子模块--><modules><module>dao</module><module>web</module><module>server</module><module>model</module></modules><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version><scope>provided</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>
  1. 依次创建 所需的 子模块 dao controller server model
  2. 将 这些模块的 打包方式改为 jar 并将 父模块改为 项目所在的模块
  3. 依赖关系 也就是将 到模块加入到 server 模块的pom.xml 中依次类推
    1. server 模块 依赖于 dao 模块
    2. controller 模块依赖于 server 模块
    3. dao server controller 三个子模块 均依赖于 model 模块
  • 父模块 添加的依赖 比如 mybatis 会同步到 子模块中
  1. 创建一个简易的 controller
@RestController
@RequestMapping("/user")
public class UserController {Logger logger = LoggerFactory.getLogger(UserController.class);@GetMapping("/list")public R list() {List<User> userList = new ArrayList<>();userList.add(new User(1, "孙悟空", "1111", "94df@f4m2.com.cn", new Date(), "1"));userList.add(new User(2, "金蝉子", "1111", "461b@91y35u.xyz", new Date(), "1"));userList.add(new User(3, "鲁班七号", "11111", "6959@687kyp.com", new Date(), "1"));userList.add(new User(4, "鲁班大师", "11111", "fa57@196bmfgq.com.cn", new Date(), "1"));userList.add(new User(5, "安其拉", "111111", "88ac@o23wg.com", new Date(), "1"));logger.info("用户列表 :" + userList.toString());return R.ok().data("userItems", userList).message("用户列表");}
}
  1. 添加 application.yaml
spring:application:name: springbootmultimodulejackson:date-format:yyyy-MM-dd HH:mm:sstime-zone=GMT+8datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3307/vue_login?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=trueusername: rootpassword: admin
server:port: 5767undertow:io-threads: 16worker-threads: 256buffer-size: 1024direct-buffers: trueservlet:context-path: /springbootmultimodule
mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.codervibe.springbootmultimodule.modellogging:level:root: infocom.codervibe.springbootmultimodule: infocom.codervibe.springbootmultimodule.mapper: debugfile:path: ./log/
  1. 现在 添加 service的部分 包括 接口 和接口的实现
package com.codervibe.server.service;import com.codervibe.model.User;import java.util.List;public interface UserService {/*** 查询所有用户信息** @return boolean*/List<User> selectUserAll();/*** 添加用户信息列表* @return  boolean*/void addList(List<User> userList);
}
package com.codervibe.server.Impl;import com.codervibe.mapper.UserMapper;
import com.codervibe.model.User;
import com.codervibe.server.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;@Service("UserService")
public class UserServiceImpl implements UserService {Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);@Resourceprivate UserMapper userMapper;/*** 查询所有用户信息** @return userList*/@Overridepublic List<User> selectUserAll() {logger.info(userMapper.selectUserAll().toString());logger.info("即将返回数据");return userMapper.selectUserAll();}/*** 添加用户信息列表** @param userList* @return boolean*/@Overridepublic void addList(List<User> userList) {for (User user : userList) {userMapper.addList(user);}}
}
  1. 修改 controller 类的 方法 并依赖注入 service
package com.codervibe.web.controller;import com.codervibe.model.User;
import com.codervibe.server.service.UserService;
import com.codervibe.web.common.response.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.*;@RestController
@RequestMapping("/user")
public class UserController {Logger logger = LoggerFactory.getLogger(UserController.class);@Resourceprivate UserService userService;@GetMapping("/list")public R list() {logger.info("用户列表 :" + userService.selectUserAll().toString());return R.ok().data("userItems", userService.selectUserAll()).message("用户列表");}@GetMapping("/addList")public R addList() {List<User> userList = new ArrayList<>();userList.add(new User(1, "孙悟空", "1111", "94df@f4m2.com.cn", new Date(), "1"));userList.add(new User(2, "金蝉子", "1111", "461b@91y35u.xyz", new Date(), "1"));userList.add(new User(3, "鲁班七号", "11111", "6959@687kyp.com", new Date(), "1"));userList.add(new User(4, "鲁班大师", "11111", "fa57@196bmfgq.com.cn", new Date(), "1"));userList.add(new User(5, "安其拉", "111111", "88ac@o23wg.com", new Date(), "1"));Map<String, Object> map = new HashMap<>();try {userService.addList(userList);} catch (Exception e) {e.printStackTrace();map.put("fali", false);map.put("message", "用户注册失败" + e.getMessage());return R.error().data(map);}map.put("success", true);map.put("message", "用户注册成功");return R.ok().data(map);}
}
  1. 添加 dao 层 的 Mapper 以及 xml 实现
package com.codervibe.mapper;import com.codervibe.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Component;import java.util.List;@Mapper
@Component
public interface UserMapper {/*** 查询所有用户信息* @return*/List<User> selectUserAll();/*** 添加用户信息列表* @return  boolean*/boolean addList(User user);
}
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.codervibe.mapper.UserMapper"><insert id="addList" parameterType="com.codervibe.model.User" useGeneratedKeys="true" keyProperty="id">insert into user(username,password,email,createTime,role) values (#{username}, #{password},#{email}, #{createTime}, #{role})</insert><select id="selectUserAll" resultType="com.codervibe.model.User" >select * from user</select>
</mapper>
  1. 此时启动 就应用就会报错 这是因为 由于分模块导致没有扫描到其他包 需要在启动类上添加 注解 以扩大 扫描范围
package com.codervibe.web;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(scanBasePackages = {"com.codervibe"})
@MapperScan({"com.codervibe.mapper"})
public class WebApplication {public static void main(String[] args) {SpringApplication.run(WebApplication.class, args);}}
  1. 代码中用到的自定义返回类型
package com.codervibe.web.common.response;import lombok.Data;import java.util.HashMap;
import java.util.Map;@Data
public class R {private Boolean success;private Integer code;private String message;private Map<String, Object> data = new HashMap<>();// 构造器私有private R() {}// 通用返回成功public static R ok() {R r = new R();r.setSuccess(ResultCodeEnum.SUCCESS.getSuccess());r.setCode(ResultCodeEnum.SUCCESS.getCode());r.setMessage(ResultCodeEnum.SUCCESS.getMessage());return r;}// 通用返回失败,未知错误public static R error() {R r = new R();r.setSuccess(ResultCodeEnum.UNKNOWN_ERROR.getSuccess());r.setCode(ResultCodeEnum.UNKNOWN_ERROR.getCode());r.setMessage(ResultCodeEnum.UNKNOWN_ERROR.getMessage());return r;}// 设置结果,形参为结果枚举public static R setResult(ResultCodeEnum result) {R r = new R();r.setSuccess(result.getSuccess());r.setCode(result.getCode());r.setMessage(result.getMessage());return r;}/*** ------------使用链式编程,返回类本身-----------**/// 自定义返回数据public R data(Map<String, Object> map) {this.setData(map);return this;}// 通用设置datapublic R data(String key, Object value) {this.data.put(key, value);return this;}// 自定义状态信息public R message(String message) {this.setMessage(message);return this;}// 自定义状态码public R code(Integer code) {this.setCode(code);return this;}// 自定义返回结果public R success(Boolean success) {this.setSuccess(success);return this;}}
package com.codervibe.web.common.response;import lombok.Getter;@Getter
public enum ResultCodeEnum {SUCCESS(true,20000,"成功"),UNKNOWN_ERROR(false,20001,"未知错误"),PARAM_ERROR(false,20002,"参数错误"),NULL_POINT(false,20003,"空指针错误"),HTTP_CLIENT_ERROR(false,20004,"客户端错误");private  Boolean success;private  Integer code;private  String message;ResultCodeEnum(boolean success,Integer code,String message){this.success =success;this.code = code;this.message =message;}
}

注意

  1. 数据库的端口号为非默认端口号 请注意修改

企鹅粉丝群 179469398

项目地址

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

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

相关文章

unity 拖入文件 窗口大小

目录 unity 拖入文件插件 设置窗口大小 unity 拖入文件插件 GitHub - Bunny83/UnityWindowsFileDrag-Drop: Adds file drag and drop support for Unity standalong builds on windows. 设置窗口大小 file build

Iceberg从入门到精通系列之二十一:Spark集成Iceberg

Iceberg从入门到精通系列之二十一&#xff1a;Spark集成Iceberg 一、在 Spark 3 中使用 Iceberg二、添加目录三、创建表四、写五、读六、Catalogs七、目录配置八、使用目录九、替换会话目录十、使用目录特定的 Hadoop 配置值十一、加载自定义目录十二、SQL 扩展十三、运行时配置…

python--整体的模块

1、python程序的架构&#xff1a;是将一个程序分割为源代码文件的集合以及将这些部分连接在一起的方法2、在python中&#xff0c;一个py文件就是一个模块&#xff0c;多个模块组成一个包。3、python的模块的执行环境&#xff1a;一个模块包含了变量、函数、类以及其他的模块&am…

电子电器架构——车载网关转发buffer心得汇总

电子电器架构——车载网关转发buffer心得汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力…

Debezium系列之:字段schema详解

Debezium系列之:字段schema详解 一、字段schema二、字段schema参数解释一、字段schema {"type":"bytes","optional":true,"name":"org.apache.kafka.connect.data.Decimal","version":1,"parameters"…

手写Spring框架之: HelloSpring

代码路径&#xff1a;GitHub - tanglijiong/MiniSpringFramework: 用于spring学习和演示 1. 项目结构包介绍 core&#xff1a;核心功能&#xff0c;如Bean的创建和管理beans&#xff1a;与Bean定义和处理相关的类context&#xff1a;应用上下文相关&#xff0c;管理不同的Bean…

vue2父组件向子组件传值时,子组件同时接收多个数据类型,控制台报警的问题

最近项目遇到一个问题,就是我的父组件向子组件(公共组件)传值时,子组件同时接收多个数据类型,控制台报警的问题,如下图,子组件明明写了可同时接收字符串,整型和布尔值,但控制台依旧报警: 仔细检查父组件,发现父组件是这样写的: <common-tabletooltip :content=…

2024 springboot Mybatis-flex 打包出错

Mybatis-flex官网&#xff1a;快速开始 - MyBatis-Flex 官方网站 从 Mybatis-flex官网获取模板后&#xff0c;加入自己的项目内容想打包确保错&#xff0c;先试试一下方法 这里改成skip的默认是true改成false&#xff0c;再次打包就可以了

Git系列---标签管理

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.理解标签2.创建标签…

java常用开发安装及官方下载地址

1 linux 安装mysql8.x 安装教程&#xff1a;https://blog.csdn.net/ShockChen7/article/details/126965940 官网下载&#xff1a;https://dev.mysql.com/downloads/mysql/2 linux安装jdk1.8 安装教程&#xff1a;https://blog.csdn.net/R_Y_Fren/article/details/126707829 官…

MySQL原理(一)架构组成之物理文件组成

目录 一、日志文件 1、错误日志 Error Log 1.1、作用&#xff1a; 1.2、开启关闭&#xff1a; 1.3、使用 2、二进制日志 Binary Log & Binary Log Index 2.1、作用&#xff1a; 2.2、开启关闭&#xff1a; 2.3、Binlog还有一些附加选项参数 &#xff08;1&#x…

verilog编程之乘法器的实现

知识储备 首先来回顾一下乘法是如何在计算机中实现的。 假设现在有两个32位带符号定点整数x和y&#xff0c;我们现在要让x和y相乘&#xff0c;然后把乘积存放在z中&#xff0c;大家知道&#xff0c;两个32位数相乘&#xff0c;结果不会超过64位&#xff0c;因此z的长度应该为64…

大数据开发之离线数仓项目(3数仓数据同步策略)(可面试使用)

第 1 章&#xff1a;实时数仓同步数据 实时数仓由flink源源不断从kafka当中读数据计算&#xff0c;所以不需要手动同步数据到实时数仓。 第 2 章&#xff1a;离线数仓同步数据 2.1 用户行为数据同步 2.1.1 数据通道 用户行为数据由flume从kafka直接同步到hdfs&#xff0c;…

通俗易懂理解通道注意力机制(CAM)与空间注意力机制(SAM)

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 一、参考资料 通道注意力&#xff0c;空间注意力&#xff0c;像素注意力 通道注意力机制和空间注意力机制 视觉 注意力机制——通道注意力、空间注意力、自注意力…

go语言WebSocket编程

1. webSocket介绍 WebSocket是一种在单个TCP连接上进行全双工通信的协议WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创…

Linux:进程信号的概念与产生原理

文章目录 信号的概念实践信号关于前台和后台进程的操作 操作系统与外设信号的产生signal系统调用 前面的篇章结束了信号量的话题&#xff0c;那么接下来引入的是信号的话题&#xff0c;信号和信号量之间没有任何关系&#xff0c;只是名字比较像 信号的概念 在生活中存在各种各…

Java学习day24:线程的同步和锁(例题+知识点详解)

声明&#xff1a;该专栏本人重新过一遍java知识点时候的笔记汇总&#xff0c;主要是每天的知识点题解&#xff0c;算是让自己巩固复习&#xff0c;也希望能给初学的朋友们一点帮助&#xff0c;大佬们不喜勿喷(抱拳了老铁&#xff01;) 往期回顾 Java学习day23&#xff1a;线程构…

Matlab图像模拟加噪——高斯噪声、椒盐噪声、泊松噪声、乘性噪声、均匀噪声、指数噪声

1.高斯噪声 (1)通过均值和方差来产生 Jimnoise(I, gaussian, 0, 0.01);%高斯噪声&#xff0c;均值为0&#xff0c;方差为0.01(2)通过位置信息来产生 Iim2double(I); Vzeros(size(I)); %建立矩阵V for i1:size(V, 1)V(i,:)0.02*i/size(V,1); end Jimnoise(I, localvar, V); …

Linux安装aria2出现No package aria2 available.的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

9.回文数

回文数 将整型转换为字符型反转前一半是否等于后一半将数字本身反转输入一个整数 x,如果 x是一个回文整数,返回 true;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,而 123 不是。 将整型转换为字符型 反转…