Java实操避坑指南四、spring中的坑

news2025/1/12 22:50:39

文章目录

    • 1. 项目搭建过程
      • 1. pom 依赖
      • 2. 在没有配置数据库相关时不要引入依赖包,如spring-boot-starter-data-jpa
    • 2. spring bean 默认生成策略的正确使用
      • 1. 代码示例
      • 2. 单元测试
      • 3. 工具类 [参考](#test2)
      • 4. 报错信息
      • 5. 分析
      • 6. 使用说明
    • 2. 使用了@Autowired 注解,任然是空指针
      • 1. 不理解Spring的自动装配规则,错误的是用new是很常见的
      • 2. 没有理解spring 的扫描机制
    • 3. 不使用自动注入还会获取上下文么?
      • 1. 应用上下文的理解
      • 2. Spring 核心是容器,但容器不是唯一
        • 1. 不常用的容器实现 -- BeanFactory
        • 2. 高级实现,继承BeanFactory派生的应用上下文 -- ApplicationContext
        • 3. 获取应用上下文(ApplicationContext)的四种方式
          • 1. ApplicationContextInitializer: 容器创建之后的回调
          • 2. ApplicationListener : 观察者模式的典型应用
          • 3. 获取应用上下文 ApplicationContextAware : Spring 的Aware接口
    • 4. 多线程下Spring Bean 的数据不符合预期怎么办
      • 1. 单例
      • 2. coding
      • 3. spring 单利Bean 的 特点
        • 1. 优点
        • 2. 劣势
        • 3. 默认单例的理由
    • 5. 经常报存在多个可用Bean 异常
      • 1. 与Spring bean 相关的注解
        • 1. @Autowired
        • 2. @Qualifiler
        • 3. @Resource
        • 4. @Primary

1. 项目搭建过程

1. pom 依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>learning</artifactId>
        <groupId>com.maidou</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-escape</artifactId>

    <name>spring-escape</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
    </properties>

    <!-- 依赖声明 -->
    <dependencyManagement>
        <dependencies>
            <!-- SpringBoot的依赖配置-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.6.4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.6.4</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.6.4</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.8.1</version>
        </dependency>
    </dependencies>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.22.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>3.0.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
                <plugin>
                    <artifactId>maven-site-plugin</artifactId>
                    <version>3.7.1</version>
                </plugin>
                <plugin>
                    <artifactId>maven-project-info-reports-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

2. 在没有配置数据库相关时不要引入依赖包,如spring-boot-starter-data-jpa

2. spring bean 默认生成策略的正确使用

1. 代码示例

package com.maidou.spring.escape.service;

import org.springframework.stereotype.Service;


@Service
public class ORderService {


    public void getOrder() {

        System.out.println("this is order");
    }
}

2. 单元测试

package com.maidou.spring.escape.service;

import com.maidou.spring.escape.utils.ApplicationUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import static org.junit.Assert.*;

@SpringBootTest
@RunWith(SpringRunner.class)
public class ORderServiceTest {

    @Test
    public void getOrder() {

        ORderService oRderService = (ORderService)ApplicationUtils.getBean("oRderService");

        oRderService.getOrder();
    }
}

3. 工具类 参考

package com.maidou.spring.escape.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * <h1>应用上下文工具类</h1>
 * */
@Slf4j
@Component
public class ApplicationUtils implements ApplicationContextAware {

    private static ApplicationContext applicationContext = null;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        if (ApplicationUtils.applicationContext == null) {
            ApplicationUtils.applicationContext = applicationContext;
        }
    }

    public static ApplicationContext getApplicationContext() {
        return ApplicationUtils.applicationContext;
    }

    /**
     * <h2>通过 name 获取 Bean</h2>
     * */
    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    /**
     * <h2>通过 class 获取 Bean</h2>
     * */
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    /**
     * <h2>通过 name + class 获取 Bean</h2>
     * */
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}

4. 报错信息

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'oRderService' available

	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:874)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1344)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:309)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)

5. 分析

AnnotationBeanNameGenerator -> generateBeanName  -> Introspector.decapitalize(shortClassName)
    public static String decapitalize(String name) {
        if (name == null || name.length() == 0) {
            return name;
        }
        // 第一个字母和第二个字母都是大写的话本名输出
        if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
                        Character.isUpperCase(name.charAt(0))){
            return name;
        }
        char chars[] = name.toCharArray();
        chars[0] = Character.toLowerCase(chars[0]);
        return new String(chars);
    }

6. 使用说明

  1. 避免首字母和第二个字母都是大写,否则全名输出 ORderService
  2. 注解的时候主动指定名称 @Service(“oRderService”)
  3. 通过类型的方式获取对象信息

2. 使用了@Autowired 注解,任然是空指针

1. 不理解Spring的自动装配规则,错误的是用new是很常见的

  1. 属性对象注入了,但是,当前类没有被标记为new

  2. 当前类标记为spring bean,且属性对象也注入了,但是,确实用了new去过去了对象

解决方式 : 使用bean 的整个过程中,都应该被Spring容器所管理

2. 没有理解spring 的扫描机制

  1. 创建外部类

    import org.springframework.stereotype.Service;
    
    @Service
    public class Outer {
    
        public void test() {
    
            System.out.println("outer test");
        }
    }
    
  2. 单元测试

      @Test
        public void testOuter() {
            assert ApplicationUtils.getApplicationContext().containsBean("outer");
    
            ((Outer)ApplicationUtils.getBean("outer")).test();
        }
    
  3. 错误

    java.lang.AssertionError
    	at com.maidou.spring.escape.service.ORderServiceTest.testOuter(ORderServiceTest.java:26)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
    	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
    	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    	at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
    	at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
    	at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    	at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    
    
  4. 解决方式 启动类增加扫描包信息

    @ComponentScan(value = {"com.maidou.spring.escape","com.maidou.spring.outer"})
    
  5. @ComponentScan 参数说明

    1. vaule
    2. includeFilters
    3. excludeFilters
    4. lazyInit

3. 不使用自动注入还会获取上下文么?

1. 应用上下文的理解

Spring的核心是管理对象,且并不只是帮我们创建对象,他负责了对象整个生命的管理,创建、装配、销毁

他是IOC容器

应用上下文可以认为是Spring容器的一种实现,也就是用于操作容器类对象

把需要管理的对象放入容器中,取得容器中的Bean

2. Spring 核心是容器,但容器不是唯一

1. 不常用的容器实现 – BeanFactory

  1. 最简单的容器
  2. 提供基本的DI功能

2. 高级实现,继承BeanFactory派生的应用上下文 – ApplicationContext

  1. 解析配置文件
  2. 注册管理Bean

3. 获取应用上下文(ApplicationContext)的四种方式

1. ApplicationContextInitializer: 容器创建之后的回调
   定义在org.springframwork.context包下,两步实现
package com.maidou.spring.escape.application_context;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * <h1>保存应用上下文</h1>
 * */
@Slf4j
public class ApplicationContextStore  {

    private static ApplicationContext applicationContext = null;

    public static void setApplicationContext(ApplicationContext applicationContext) {
        log.info("coming in applicationContextStore");
        if (ApplicationContextStore.applicationContext == null) {
            ApplicationContextStore.applicationContext = applicationContext;
        }
    }

    public static ApplicationContext getApplicationContext() {
        return ApplicationContextStore.applicationContext;
    }
}

获取应用上下文

package com.maidou.spring.escape.application_context;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;

/**
 * @Author maicheng
 * @Description : 第一种方式获取应用上下文
 * @Date 13:13 2022/10/22
 **/
@Slf4j
public class UserInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        assert ApplicationContextStore.getApplicationContext() == null;
        ApplicationContextStore.setApplicationContext(applicationContext);
        assert ApplicationContextStore.getApplicationContext() != null;
        log.info("get UserInitializer");
    }
}

注册到启动类上

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

        SpringApplication  application = new SpringApplication(App.class);
        application.addInitializers(new UserInitializer());
        application.run(args);
    }
2. ApplicationListener : 观察者模式的典型应用
  1. 观察者的典型应用(内置事件)

    ApplicationContexntEvent

    1. ContextRefreshedEvent
    2. ContextStartedEvent
    3. ContextStoppedEvent
    4. ContextClosedEvent
  2. coding

    package com.maidou.spring.escape.application_context;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.event.ContextRefreshedEvent;
    import org.springframework.stereotype.Component;
    
    /**
     * @Author maicheng
     * @Description
     * @Date 13:28 2022/10/22
     **/
    @Slf4j
    @Component
    public class UserListener implements ApplicationListener<ContextRefreshedEvent> {
        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
            assert ApplicationContextStore.getApplicationContext() == null;
            ApplicationContextStore.setApplicationContext(event.getApplicationContext());
            assert ApplicationContextStore.getApplicationContext() != null;
            log.info("get UserListener");
        }
    }
    
  3. 注释掉 注册的UserInitializer

3. 获取应用上下文 ApplicationContextAware : Spring 的Aware接口
  1. BeanNameAware
  2. BeanFactoryAware
  3. ApplicationContextAware
  4. ResourseLoaderAware

coding

package com.maidou.spring.escape.application_context;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @Author maicheng
 * @Description :第三种应用上下文的方式
 * @Date 13:44 2022/10/22
 **/
@Component
@Slf4j
public class UserAware implements ApplicationContextAware {
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        assert ApplicationContextStore.getApplicationContext() == null;
        ApplicationContextStore.setApplicationContext(applicationContext);
        assert ApplicationContextStore.getApplicationContext() != null;
        log.info("get UserAware");
    }
}

启动类原始启动 参考

4. 多线程下Spring Bean 的数据不符合预期怎么办

1. 单例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SUY7FZiU-1666420944363)(C:\Users\maido\AppData\Roaming\Typora\typora-user-images\image-20221022135911320.png)]

2. coding

package com.maidou.spring.escape.singleton_;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
public class DefaultSingleton {

    private List<String> list = null;

    @PostConstruct
    public void init() {
        log.info("Coming  in DefaultSingleton");
        this.list = new ArrayList<>(100);
    }

    public void add(String result) {
        list.add(result);
    }

    public int getSize() {
        return list.size();
    }

    public List<String> getList() {
        return this.list;
    }
}

测试

package com.maidou.spring.escape.singleton_;

import com.maidou.spring.escape.utils.ApplicationUtils;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import static org.junit.Assert.*;

@SpringBootTest
@RunWith(SpringRunner.class)
@Slf4j
public class DefaultSingletonTest {

    @Test
    public void init() {

        DefaultSingleton bean = ApplicationUtils.getBean(DefaultSingleton.class);
        DefaultSingleton bean1 = ApplicationUtils.getBean(DefaultSingleton.class);

        assert bean.hashCode() == bean1.hashCode();

        bean.add("11111");
        bean.add("222222");
        log.info("bean info : {}", bean.getList());
        bean1.add("33333");
        log.info("bean info : {}", bean.getList());
    }
}

映射成多个对象 改变scope 模式

@Scope(BeanDefinition.SCOPE_PROTOTYPE)

3. spring 单利Bean 的 特点

1. 优点

  1. 减少新生成实例的消耗
  2. 减少JVM垃圾回收
  3. 可以快速获取到Bean

2. 劣势

线程不安全

3. 默认单例的理由

  1. 少创建实例
  2. 垃圾回收便捷
  3. 使用缓存快速获取

5. 经常报存在多个可用Bean 异常

1. 与Spring bean 相关的注解

1. @Autowired

属于Spring 框架,默认使用类型(byType)进行注入

2. @Qualifiler

结合@Autowired一起使用,自动注入策略由byType变成byName

3. @Resource

JAVAEE 自带的注解,默认按byName自动注入

4. @Primary

存在多个类型的相同类型的Bean,则 @Primary用于定义首选项

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

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

相关文章

【5G RAN】5G gNB间的N2/NGAP切换(handover)那点事儿

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

@Import注解详解

Import这个注解非常重要&#xff0c;而且在springboot项目当中随处可见&#xff0c;就拿springboot启动类来说&#xff0c;我们经常会遇到一些Enable相关的注解&#xff0c;例如开启异步EnableAsync、开启缓存支持EnableCaching、开启定时任务EnableScheduling等等… 目录一、I…

Oracle通过DBLINK访问达梦数据库

环境需求 需要安装配置以下相关软件&#xff1a; 1、Oracle Gateways 2、ODBC数据源&#xff08;gateway机器&#xff09; 3、达梦数据库软件&#xff08;gateway机器&#xff09; 安装配置 Windows环境 安装达梦数据库软件 安装步骤省略&#xff0c;可以参考DM 数据库…

【嵌入式Linux开发一路清障-连载02】Ubuntu22.04安装Shutter进行截图和标注

Ubuntu22.04安装Shutter进行截图和标注障碍 05&#xff0d;Ubuntu22.04中不会给截图做标注&#xff0c;写Bolg举步维艰命令行方式安装Shuttershutter中的常用命令为截取活动窗口设置快捷键安装gnome-web-photo截取长图--失败--未完待续小结下节预告障碍 05&#xff0d;Ubuntu22…

一起来部署项目-采购一台云服务器

前言 不会运维的程序员不是一个好程序员&#xff0c;你是这样认为吗&#xff1f;不&#xff0c;不重要&#xff0c;关键是很多小企业是让后端程序员去干运维的&#xff0c;省钱~~~o(╥﹏╥)o。特别是在YQ严重的当下&#xff0c;所以为了提高自己的竞争力&#xff0c;从今天起&…

万字爽文一篇带你掌握Java8新特性

陈老老老板说明&#xff1a;新的专栏&#xff0c;本专栏专门讲Java8新特性&#xff0c;把平时遇到的问题与Java8的写法进行总结&#xff0c;需要注意的地方都标红了&#xff0c;一起加油。本文是介绍Java8新特性与常用方法&#xff08;此篇只做大体介绍了解&#xff0c;之后会把…

Java8中LocalDate详解Date线程不安全的原因

LocalDate 分类分工 java.time.LocalDate ->只对年月日做出处理 java.time.LocalTime ->只对时分秒纳秒做出处理 java.time.LocalDateTime ->同时可以处理年月日和时分秒优点 除了使用起来更加简单和灵活&#xff0c;主要是传统的时期处理类Date、Calendar不是多线…

刷爆leetcode第十二期 0026 数组中数字出现的次数

编号0026 数组中数字出现的次数 一个整型数组 nums 里除两个数字之外&#xff0c;其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)&#xff0c;空间复杂度是O(1)。 题目示例如下 这里其实是一道我一个月之前做的题目 在学弟的博客里刚好看…

【数据结构与算法】Java实现七大排序算法汇总

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【数据结构与算法】 ✈️✈️本篇内容: Java实现七大排序算法汇总&#xff01; &#x1f680;&#x1f680;由于本篇博客涉及代码较多&#xff0c;博主把代码都提…

刷爆leetcode第十一期 0023~0025

刷爆leetcode第十一期 编号0023 相同的树编号0024 对称二叉树编号0025 另一个树的子树编号0023 相同的树 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是…

多旋翼无人机仿真 rotors_simulator:用键盘控制无人机飞行

多旋翼无人机仿真 rotors_simulator&#xff1a;用键盘控制无人机飞行前言书接上文接口测试键盘指令发布指令转换与发布修改 rotors_simulator 的控制接口节点测试前言 RotorS 是一个MAV gazebo 仿真系统。 提供了几种多旋翼仿真模型&#xff0c;例如 AscTec HummingbirdAsc…

PHP反序列化

序列化与反序列化 序列化 反序列是指把对象转换为字符串的过程&#xff0c;便于在内存、文件、数据库中保存、传输&#xff0c;PHP中使用serialize函数进行序列化。 <?phpclass Person{public $name"php";protected $id;private $age;}$a new Person();$a_se…

全排列笔记

14天阅读挑战赛 全排列 题目 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解答 方法一&#xff1a;回溯 思路 从高中的数学知识我们可以知道 从[1,2,3…

如何在Linux上优雅地写代码-Linux生存指南

初入Linux&#xff0c;发现老是要面对一个命令行&#xff0c;大黑框&#xff0c;看不懂各种手册&#xff0c;写代码也是用vi/vim&#xff0c;难受的捉急。其实Linux下的各种工具&#xff0c;强大得超出你的想象&#xff0c;如果你初入Linux&#xff0c;那么你急需阅读这篇文章&…

操作系统的主要功能

目录 一. 处理机管理功能 1.1 进程控制 1.2 进程同步 1.3 进程通信 1.4 进程调度 二. 存储器管理功能 2.1 内存分配 2.2 内存保护 2.3 地址映射 2.4 内存扩充 三. 设备管理功能 3.1 缓冲管理 3.2 设备分配 3.3 设备处理 3.4 设备独立性和虚拟设备 四…

关于Python爬虫兼职,这里有一条高效路径

前言 昨天&#xff0c;一位00后前来报喜&#xff0c;也表达感谢。 他说&#xff0c;当初刚毕业啥也不会也找不到工作&#xff0c;最后听了我的&#xff0c;边学爬虫边做兼职项目&#xff0c;积极主动求职投简历&#xff0c;既可以兼职获得收益&#xff0c;也能积累项目经验谋求…

Linux:以K、M、G查看文件大小;

简介&#xff1a;灵活多变的查看文件的大小 历史攻略&#xff1a; Linux&#xff1a;sudo免密 python&#xff1a;执行dos命令、Linux命令 案例源码&#xff1a; # 以适当方式显示文件大小&#xff1a; ls -lh# 以byte显示文件大小&#xff1a; ls -l# 以M显示文件大小&am…

NR PUSCH(五) DMRS

微信同步更新欢迎关注同名modem协议笔记 PUSCH DMRS和PDSCH DMRS内容基本一样&#xff0c;但也有不同的地方&#xff0c;例如PUSCH 可能需要Transform precoding&#xff0c;port 对应0~11(DMRS configured type2)等等。先简单看看Transformprecoding的相关内容&#xff0c;Tr…

Excel数据分析实战之开宗明义: Excel与数据分析实战

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

军用大数据 - Spark机器学习

文章目录第1关&#xff1a;Iris 分类任务描述相关知识1&#xff1a;观察数据集2&#xff1a;RFormula 特征提取3&#xff1a;pandas 的 concat 函数编程要求代码实现————————————————————————————————————————第2关&#xff1a;图片识…