Spring、MySQL、日期、BigDecimal、集合、反射、序列化中的坑与使用指南

news2025/1/12 18:47:23

文章目录

  • MySQL中的坑
    • MySQL断开连接
    • Mysql表字段设置为not null
    • 如何解决网络瓶颈
    • 核心流程的性能查看
  • Spring中的坑与使用
    • 注意springboot的配置文件先后顺序
    • 定时任务不进行
    • lombok的不适用场景
    • Spring的Bean默认名称生成规则
    • new出来的对象不被Spring所管理
    • SpringBean相关的注解
    • Spring出现循环依赖
    • Bean的生命周期使用
    • SpringBoot测试
      • pom文件
      • 代码
    • @Transactional的使用
  • 集合、接口中的坑
    • 对象一定要初始化!
    • 避免空指针
    • for循环
    • 要好好判等!
    • 抽象类与接口
  • BigDecimal等大数
    • 浮点数的计算,使用字符串初始化!!
    • 比较浮点数相等compareTo不用equals
    • 数值溢出问题
    • 精度问题
    • 除法除不尽抛异常
    • long类型数字加上L,float加上F
  • 日期
    • 日期计算LocalDateTime
    • SimpleDateFormat的使用 以及线程不安全
    • 时间格式转换
  • 反射、序列化
    • 反射
    • Serializable
    • 深拷贝

MySQL中的坑

MySQL断开连接

默认8小时–>没请求,断开连接

修改配置,避免断开连接
sql方式

interactive_timeout  wait_timeout
set global 

配置文件方式
80小时没请求就断开

[mysqld]
interactive_timeout =288000
wait_timeout=288000

Mysql表字段设置为not null

如何解决网络瓶颈

  1. 扩容
  2. 分散
  3. 压缩

核心流程的性能查看

在代码里加入一个日志打印,悄悄的把每个步骤的耗时打印出来,自己看一看,然后看看核心流程的时间耗时多长,有没有优化的空间

Spring中的坑与使用

注意springboot的配置文件先后顺序

定时任务不进行

线程数默认为1

在这里插入图片描述

java代码方式

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@Configuration
public class ScheduleConfig {
    @Bean
    public TaskScheduler getTaskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(5);
        //taskScheduler.getActiveCount();
        return taskScheduler;
    }
}

lombok的不适用场景

  1. 单字母驼峰
  2. 有子类继承
  3. 尽量手动生成!!

Spring的Bean默认名称生成规则

Spring默认包扫描机制:SpringApplication—>所在包及其子包下的所有目录
@ComponentScan

@ComponentScan(value = {"com.example"})

默认:首字母小写,其他不变
开头第一个字母大写,第二个字母也大写,则不变,即名称为原类名

new出来的对象不被Spring所管理

需要成为Spring容器中的实例,才可以@Autowired

SpringBean相关的注解

@Autowired:默认按类型注入
@Resource:默认byName
@Primary:存在多个相同的Bean,则@Primary用于定义首选项

Spring出现循环依赖

  • 单例模式下
  1. 构造器循环依赖没办法解决
  2. 属性注入
@Autowired
private UserService userService;
  1. set 方式
  • 原型模式下无法解决
    每次都是new出来的,无法缓存对象

Bean的生命周期使用

  1. 实现InitializingBean

该Bean完成实例化后,对该Bean的操作

  1. 实现BeanPostProcessor

对所有的Bean的postProcessBeforeInitializationpostProcessAfterInitialization进行操作

  1. 实现BeanFactoryPostProcessor

spring容器创建后,beanFactory代指spring容器


import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;


@Component
public class TestBean implements InitializingBean {

    @Override
    // 当前Bean初始化后,还没有注入属性,只会调用一次  3
    public void afterPropertiesSet() throws Exception {
        System.out.println("TestBean------>afterPropertiesSet");
    }
}

@Component
class PostProcessor implements BeanPostProcessor {
    @Override
    //在Bean初始化前   2
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (!(bean instanceof TestBean)) return bean;

        System.out.println("TestBean------>postProcessBeforeInitialization");
        return bean;
    }

    @Override
    //完成Bean的初始化,并且已经注入属性  4
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (!(bean instanceof TestBean)) return bean;
        System.out.println("TestBean------>postProcessAfterInitialization");
        return bean;
    }

}

@Component
class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    //在BeanPostProcessor之前执行 1
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
            throws BeansException {
        BeanDefinition testBean = beanFactory.getBeanDefinition("testBean");
        // 设置怎样定义bean
        testBean.setScope(BeanDefinition.SCOPE_SINGLETON);
        System.out.println("TestBean------>TestBeanFactoryPostProcessor");
    }
}


在这里插入图片描述

SpringBoot测试

pom文件

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <version>2.7.3</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13</version>
    <scope>test</scope>
</dependency>

代码

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
@RunWith(SpringRunner.class)
class DemoApplicationTests {

    @Test
    public static void test(String name) {
        System.out.println(name);
    }

}

@Transactional的使用

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.3.22</version>
</dependency>
import org.springframework.transaction.annotation.Transactional;
@Transactional
  1. @Transactional所在的方法必须为public
  2. 所在的类必须被spring容器管理!!@Component
  3. 数据库必须支持事务,如InnoDB 支持事务,MyISAM不支持!
  4. 默认情况下, @Transactional 注解 只对抛出的 RuntimeException 异常有效
  5. 指定异常时的事务回滚,使用如下配置
// Exception.class 是所有异常的父类
@Transactional(rollbackFor={RuntimeException.class, Exception.class})
  1. @Transactional 必须加在指定类或方法上,而不是接口上
  2. 没有事务的方法调用本类中另一个@Transactional的方法

此时事务不生效

import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Component
public class TestBean {
    public void test() {
        testTransactional();
    }
    
    @Transactional
    public void testTransactional() {}
    
}

解决方法

启动类加@EnableAspectJAutoProxy

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;


@SpringBootApplication
@EnableAspectJAutoProxy //必须加注解
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

修改后代码


import org.springframework.aop.framework.AopContext;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Component
public class TestBean {
    public void test() {
  		//事务想要生效,还得利用代理来生效!!!
		//获取代理对象(proxy)
		// 启动类加上 @EnableAspectJAutoProxy
        TestBean proxy = (TestBean) AopContext.currentProxy();
        proxy.testTransactional();
    }

    @Transactional
    public void testTransactional() {

    }


}

  1. 出现异常手动回滚
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;


@Component
public class TestBean {
    @Transactional
    public void testTransactional(User user) {
        try {
            save(user);
        } catch (Exception ex) {
            ex.printStackTrace();
            // 手动标记回滚
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }

    private void save(User user) {
    }

}


集合、接口中的坑

对象一定要初始化!

User user=null;

避免空指针

  1. 方法的返回值为空
  2. 方法、属性的调用者为空
  3. 对象未初始化
  4. 数组、集合未初始化
  5. 自动拆箱导致的空指针
  6. 方法传入的参数为空要判断!!
  public static void main(String[] args) {
        List<User> userList = null;
        testFor(userList);
    }

    public static void testFor(List<User> users) {
        if (users == null) return;
        for (User user : users) {

        }
    }
  1. 操作引用类型的属性时,一定要记得判空!
if(user==null) {
	return xxx;
}
if(user!=null){
	//业务代码
}

for循环

  1. 使用 原始 for循环
for (int i = 0; i < 100; i++) {  }
  1. 使用增强for循环
//注意判空
for (User user : users) { }

要好好判等!

  1. 基本数据类型 直接用==比较
  2. 引用数据类型 用equals判断时,要重写equals方法

抽象类与接口

  1. 抽象类是模板不能被实例化
  2. 抽象类中不能有static和final!
  3. 接口中的默认方法不需要实现,可以由实现类直接调用
  4. 接口中只能是常量,抽象类可以 有普通变量
  5. 类可以 实现多个接口,只能 继承一个抽象类
  6. 接口 还可以继承多个接口!
  7. 接口中可以有默认方法和静态方法
  8. 抽象类使用extends,接口用implements

BigDecimal等大数

浮点数的计算,使用字符串初始化!!

使用 BigDecimal 表示和计算浮点数,且务必使用字符串的构造方法来初始化 BigDecimal

//加
System.out.println(new BigDecimal("0.1").add(new BigDecimal("0.2")));
//减
System.out.println(new BigDecimal("1.0").subtract(new BigDecimal("0.8")));
//乘
System.out.println(new BigDecimal("4.015").multiply(new BigDecimal("100")));
//除
System.out.println(new BigDecimal("123.3").divide(new BigDecimal("100")));

//BigDecimal.valueOf() 初始化也可以!
System.out.println(BigDecimal.valueOf(1.0).subtract(BigDecimal.valueOf(0.8)));
//0.2

在这里插入图片描述

比较浮点数相等compareTo不用equals

//Returns:
//-1, 0, or 1 as this BigDecimal is numerically less than, equal to, or greater than val.
System.out.println(new BigDecimal("1.0").compareTo(new BigDecimal("1"))==0);
//true

System.out.println(new BigDecimal("1.0").equals(new BigDecimal("1")))
//结果:false

数值溢出问题

//long的最大值
System.out.println(Long.MAX_VALUE);
// +1 之后溢出,成为long的最小值-9223372036854775808
System.out.println(Long.MAX_VALUE+1==Long.MIN_VALUE);
//long的最大值+1, 使用 BigInteger 防止溢出!!
System.out.println(new BigInteger(String.valueOf(Long.MAX_VALUE)).add(BigInteger.valueOf(1)));

在这里插入图片描述

精度问题

	// scale 需要与小数位匹配
	BigDecimal bigDecimal = new BigDecimal("12.222");
	// 若设置的精度 比 以前的高,会自动补0
	// BigDecimal res = bigDecimal.setScale(12);
	//ROUND_HALF_UP 为四舍五入
	BigDecimal res = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
	System.out.println(res);

除法除不尽抛异常

        //除不尽 会抛异常
//        System.out.println(new BigDecimal("2").divide(new BigDecimal("3")));
        System.out.println(
                new BigDecimal("2.0")
                        .divide(
                                new BigDecimal("3"), 2, BigDecimal.ROUND_HALF_UP
                        ));

在这里插入图片描述

long类型数字加上L,float加上F

日期

日期计算LocalDateTime

代码

  //时间格式化器
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        //获取 当前时间
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime);
        System.out.println(formatter.format(localDateTime));

        //指定 时间
        LocalDateTime _1970 = LocalDateTime.of(1970, 1, 1, 0, 0, 0);
        System.out.println(_1970);



        //时间格式化器LocalDateTime---->String,调用format方法
        String _1970_str = formatter.format(_1970);
        System.out.println(_1970_str);

        // 获取该月的第几天
        int dayOfMonth = localDateTime.getDayOfMonth();
        System.out.println(dayOfMonth);

        // 将字符串解析为 LocalDateTime对象
        LocalDateTime _2010 = LocalDateTime.parse("2010-01-01 00:00:00", formatter);
        System.out.println(_2010);

        //1970年1月1日 +10日
        LocalDateTime _1970_plus10days = _1970.plusDays(10);
        System.out.println(_1970_plus10days);

        //1970年1月1日 -10日
        LocalDateTime _1970_minus10days = _1970.minusDays(10);
        System.out.println(_1970_minus10days);

        //修改1970年1月1日的DayOfMonth,即为1970年1月20日
        LocalDateTime _1970_setDayofMonth_10 = _1970.withDayOfMonth(20);
        System.out.println(_1970_setDayofMonth_10);

        //LocalDateTime转为LocalDate--->只有年月日
        // LocalTime--->只有时分秒
        LocalDate localDate = localDateTime.toLocalDate();
        System.out.println(localDate);

        //1970-1-1 00:00:00
        _1970 = LocalDateTime.of(1970, 1, 1, 0, 0, 0, 0);

        // 1970年到 现在的时间间隔
        // 年,一共多少个月,与天数,天数 仅仅在31天
        Period _1970_now_period = Period.between(_1970.toLocalDate(), localDateTime.toLocalDate());
        System.out.println(_1970_now_period.toTotalMonths());
        System.out.println(_1970_now_period.getDays()); //22-1
        System.out.println(_1970_now_period.getYears());

        //获取两个时间的间隔,总的天数,
        Duration between = Duration.between(_1970, LocalDateTime.now());
        System.out.println(between.toHours());
        System.out.println(between.toDays());
        System.out.println(between.toMillis() - 28800000L);

        System.out.println(System.currentTimeMillis());

        //isAfter(xx)在xx之后
        //isBefore(xx)在xx之前
        System.out.println(localDateTime.isAfter(_1970));
        System.out.println(localDateTime.isBefore(_1970));

SimpleDateFormat的使用 以及线程不安全

  1. 变为局部变量
  2. ThreadLocal
		//new 出来一个 格式化器
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        // 当前时间转为字母串
        String now = format.format(new Date());
        System.out.println(now);

        // 将字符串转为时间
        String date = "2022-12-30";
        try {
            Date parseDate = format.parse(date);
            System.out.println(parseDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        // 时间转为 时间戳
        long time = format.parse(date).getTime();
        System.out.println(time);

        System.out.println(System.currentTimeMillis());

时间格式转换

pom

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.7</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

DateConverter


import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import java.text.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;

@Component
public class DateConverter extends SimpleDateFormat implements Converter<String, Date> {
    public static final List<String> FORMARTS = new ArrayList<>();

    static {
        FORMARTS.add("yyyy-MM");
        FORMARTS.add("yyyy-MM-dd");
        FORMARTS.add("yyyy-MM-dd HH:mm");
        FORMARTS.add("yyyy-MM-dd HH:mm:ss");
    }

    @Override
    public Date convert(String source) {
        String value = source.trim();
        if ("".equals(value)) {
            return null;
        }
        if (source.matches("^\\d{4}-\\d{1,2}$")) {
            return parseDate(source, FORMARTS.get(0));
        } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {
            return parseDate(source, FORMARTS.get(1));
        } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {
            return parseDate(source, FORMARTS.get(2));
        } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
            return parseDate(source, FORMARTS.get(3));
        } else if (isTimestamp(source)) {//long 时间戳转换
            return parseDate(source, FORMARTS.get(3));
        } else {
            throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
        }
    }

    /**
     * 格式化日期
     *
     * @param dateStr String 字符型日期
     * @param format  String 格式
     * @return Date 日期
     */
    public Date parseDate(String dateStr, String format) {
        Date date = null;
        //long 时间戳转换
        if (isTimestamp(dateStr)) {
            long time = Long.parseLong(dateStr);
            date = new Date(time);
        }
        try {
            DateFormat dateFormat = new SimpleDateFormat(format);
            date = dateFormat.parse(dateStr);
        } catch (Exception e) {
        }
        return date;
    }

    public static boolean isNumeric(String str) {
        Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
        return pattern.matcher(str).matches();
    }

    public static boolean isTimestamp(String str) {
        return str != null && str.length() == 13 && isNumeric(str);
    }

    @Override
    public Date parse(String source) throws ParseException {
        Date convert = this.convert(source);
        return convert;
    }

    //设置所有接口返回的时间为毫秒级的时间戳
    @Override
    public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos) {
        StringBuffer stringBuffer = new StringBuffer("" + date.getTime());
        return stringBuffer;
//        return super.format(date, toAppendTo, pos);
    }

}


DateConverterConfig

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

@Configuration
public class DateConverterConfig {
    @Autowired
    private DateConverter dateConverter;

    @Bean
    @Primary
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
        objectMapper.setDateFormat(dateConverter);
        return objectMapper;
    }
}

支持这四种格式 + 13位时间戳

在这里插入图片描述
返回的时间为毫秒级的时间戳

反射、序列化

反射

  1. 方法是基本类型时,反射 获取 Method的参数类型也必须一致,不能是 其包装类!!
  2. 如果 调用的方法 属于当前对象的父类,那么getDeclaredMethod获取 不到Method

Serializable

  1. 类中 存在引用对象,引用对象也实现序列化,该类 才可实现序列化
  2. 子类实现Serializable接口,父类存在 无参构造方法,子类可以序列化

深拷贝

涉及到的 所有对象都必须实现Serializable接口

	 @Override
    protected User clone() throws CloneNotSupportedException {
        User user = null;
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            //ObjectOutputStream是包装流
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            //写入到 baos流中
            oos.writeObject(this);
            //将流序列化成对象
            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            User o = (User) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        return user;
    }

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

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

相关文章

Java 类和对象 详解+通俗易懂

文章目录类和对象1. 面对对象的初步认识1.1 什么是面向过程&#xff1f;什么又是面向对象&#xff1f;1.2 对象、成员变量和成员方法的关系和理解2. 类的定义和使用2.1 简单认识类2.2 类的定义格式2.3 小试身手3. 类的实例化3.1 什么是实例化3.2 类和对象的说明4. this 引用4.1…

k8s上部署seata-server集群并注册到nacos上

部署前准备 第一步&#xff1a; 创建seata-server需要的表,有现成的阿里云RDS&#xff0c;就直接在RDS上创建数据库了&#xff0c;方便后面统一管理。 具体的 SQL 参考script/server/db &#xff0c;这里使用的是 MySQL 的脚本&#xff0c;数据库名称为 seata&#xff0c;还需…

对外 API 接口,请把握这3 条原则,16 个小点

对外API接口设计 安全性 1、创建appid,appkey和appsecret 2、Token&#xff1a;令牌&#xff08;过期失效&#xff09; 3、Post请求 4、客户端IP白名单 &#xff08;可选&#xff09; 5、单个接口针对IP限流&#xff08;令牌桶限流&#xff0c;漏桶限流&#xff0c;计数器…

git如何回滚,返回到之前的记录

文章目录1.建立一个reset的测试文件&#xff0c;并连续提交。2.进行回滚测试。2.1测试,回滚到第二次提交2.1.1首先使用git log命令查看commit记录2.1.2查看结果.2.1.3回滚结果提交到远程2.2.你发现自己回滚的多了3.1撤销测试3.1建立文件&#xff0c;多次填写内容上传到git3.2撤…

顺序栈和链栈的定义和使用C语言实现(附有完整代码)

栈的基本内容&#xff1a; 无论是我们接下来要讲的栈还是后面要讲到的队列&#xff0c;他们虽然在名字上不同于我们之前的顺序表或者单链表&#xff0c;但是它们本质也是线性表&#xff0c;只是在基本操作上没有表那么“自由”。比如&#xff1a;栈只能从栈顶进行插入和删除&a…

【Linux】Linux文件权限的理解

&#x1f4ac;推荐一款模拟面试、刷题神器 、从基础到大厂面试题&#xff1a;&#x1f449;点击跳转刷题网站进行注册学习 目录 一、Shell是什么&#xff1f; 1、Shell承担用户和内核间的翻译工作 2、拒绝用户非法请求&#xff0c;保护内核 3、派生子进程执行用户指令 二…

SpringCloud

SpringCloud 三 本章知识点 3.1 项目架构演变 3.1.1 单体应用架构 部署到一个war里 部署到一个web容器里&#xff08;如tomcat&#xff09; 公用一个DB 优点: 容易测试 容易部署缺点&#xff1a; 开发效率低 代码维护难 部署不灵活&#xff08;如构建时间特别长&#xff0…

人工智能轨道交通行业周刊-第19期(2022.10.17-10.23)

本期关键词&#xff1a;首都智慧地铁、AI四小龙、文本生成视频、低光照目标检测、天窗、电务人员 1 整理涉及公众号名单 1.1 行业类 RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟V…

四非到保研厦大,我们还有多少路要走----技术人的保研之路

前言&#xff1a; “Hello&#xff0c;大家好我叫是Dream呀&#xff01;”在1024程序员节到来之际&#xff0c;我想和大家一起分享一下技术人生的故事----我的学长2022年从四非保研至厦大的经验和经历&#xff0c;希望大家可以耐心看完&#xff0c;收获技术力量&#xff0c;更加…

Java面试题

1、JDK 、JRE和JVM 的区别&#xff1f; JDK&#xff0c;java development kit java开发工具包&#xff0c;为java程序提供开发和运行环境JRE&#xff0c; java runtime environment java运行环境&#xff0c;为java程序提供必须的运行环境JVM&#xff0c; java virtual mach…

RayVentory以改进IT的分析,RayVentory原始数据之间轻松切换

使用KeyCloak进行SSO(单点登录)-使用单点登录解决方案&#xff0c;并直接与KeyClok交互。 特定于公司的数据丰富—使用产品所有者、价格或许可证信息等信息轻松丰富您的数据&#xff0c;以获得所需数据的综合视图。 用于更深入数据管理的新连接器-添加了许多新连接器&#xff0…

Vue3中 响应式 API ( readonly、shallowReadonly、toRaw、markRaw ) 详解

传送门&#xff1a;Vue3中 响应式 API ( reactive、ref、toRef、toRefs ) 详解 传送门&#xff1a;Vue3中 响应式 API&#xff08; shallowReactive、shallowRef、triggerRef 、customRef &#xff09;详解 1. readonly 函数 接受一个对象 (不论是响应式还是普通的) 或是一个…

深度学习visio作图技巧

目录 1.不显示跨线 2.调节连接线拐弯 3.方框与连接线反应 4.设计一个卷积块/特征图 5.设计一个特征图方块 1.不显示跨线 不显示跨线&#xff1a;设计→连接线&#xff0c;取消显示 跨线的勾选 2.调节连接线拐弯 连接线拐弯&#xff1a;按住shift拖动线条即可控制连接线拐…

高数(下) 第十二章:无穷级数

文章目录Ch12. 无穷级数(一) 常数项级数正项级数交错级数任意项级数4个特殊的常数项级数收敛级数的性质&#xff08;针对任意项级数&#xff09;常数项级数的审敛法1.正项级数审敛法(判别法)(1)比较判别法(2)比较审敛法极限形式(3)比值法(4)根值法(5)收敛的充要条件(6)绝对收敛…

Spring Boot 篇四: Spring Data JPA使用SQL Server

本文目录SQL Server Express的安装或直接DockerSQL Server JDBC DriverTCP/IP 链接端口Integrated SecuritySSL总结本篇介绍篇一至篇三中用到的JPA链接SQL Server的具体情况以及实战过程中可能遇到的问题。 SQL Server Express的安装或直接Docker 具体的下载和安装教程&#…

sanic:通过dockerfile部署

简介&#xff1a;长期以来&#xff0c;环境一直是部署的难题。如果您的项目中有冲突的配置&#xff0c;您将不得不花费大量时间来解决它们。幸运的是&#xff0c;虚拟化为我们提供了一个很好的解决思路。Docker 就是其中之一。 历史攻略&#xff1a; sanic框架&#xff1a;简…

内网渗透体系学习1

工作组 工作组(Work Group)是计算机网络的一个概念&#xff0c;也是最常见和最普通的资源管理 模式&#xff0c;就是将不同的计算机按照功能或部门分别置于不同的组。通过创建不同的 工作组&#xff0c;不同的计算机可以按照功能或部门归属到不同的组内&#xff0c;整个组织的网…

XSCTF联合招新赛-热身赛(部分WP)

由于没有多少时间答题,抽空在划水的时候做了一两道题目.比赛已经结束了24小时了。特把写的WP分享一下,欢迎各位大佬进行指点。 文章目录warm_up头头是道B45364EZphpeasy_sqlbaigeiRSAimage1image2image3image42^11warm_up 只有虔诚的嘉心糖才能成功拿到flag 地址&#xff1a;4…

5G核心网技术基础自学系列 | 语音业务

书籍来源&#xff1a;《5G核心网 赋能数字化时代》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G核心网技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 3.9.1 5G语音概述 除了用于机器之…

libusb系列-003-Linux下libusb源码编译

libusb系列-003-Linux下libusb源码编译 文章目录libusb系列-003-Linux下libusb源码编译摘要源码下载及解压下载源码解压下载的源码压缩包打开终端准备编译环境安装make dh-autoreconf安装 libudev-dev编译错误的教程增加执行bootstrap.sh指令再编译make安装库确认下关键字&…