Spring-IOC容器进行对象管理

2023-05-16


目录


IOC概念

IOC思想

Spring管理对象

集成依赖

spring的配置文件(Applicationcontext.xml)

创建实体类User

Spring对Bean的实例化方式

基于配置形式

1.通过无参构造函数实例化

2.通过静态工厂方式实例化

3.通过普通工厂方式实例化Bean

基于注解形式

Spring中依赖注入方式

基于xml配置实现依赖注入

1.有参构造函数

2.setter方式注入

基于注解形式注入依赖


IOC概念

IOC(Inversion Of Control) 控制反转,spring中提供了IOC容器,对象的创建交给外部容器完成,这个就是控制反转,spring中使用控制反转来实现对象在不同程序中的使用,容器存在的必要性就是管理对象。

通过购买图书的场景来分析使用java实例,使用相关对象是需要new创建并持有,缺点:

  1. 实例化一个组件比较困难,例如:bookservice和userservice要创建DataSource实例,实际上需要读取配置,即config,通过config实例才创建出DataSourceservice,没有必要bookservice和UserService分别创建DataSourceservice,可以共享ataSourceservice,谁负责来创建DataSourceservice实例,也不好处理。
  2. 很多组件需要销毁来释放资源,例如datasouce,如果采用共享,如何确保使用方能正确的销毁。
  3. 随着映入到的业务组件越来越多,对组件的共享管理也就越来越复杂。

可以提供容器,来管理所有的组件(对象),所有的对象的创建,销毁也好都交给容器,谁需要使用对象,在容器中获取该对象的使用权,哪一个对象需要,就将使用的对象注入到该对象中,对于使用方而言,只需要关注使用即可,对象的生命周期的管理就交给IOC容器进行管理,IOC容器负责实例化所有的组件,需要进行依赖的对象都交给容器管理。

 

IOC思想

对象的创建交给外部容器完成,这个就是控制反转,spring中使用控制反转来实现对象在不同程序中的使用,控制反转解决对象处理的问题,将对象交给容器进行创建。

依赖注入(DI):dendendency injection

对象与对象之间的依赖问题即依赖注入 AOP->DI

Spring使用依赖注入来实现对象之间的依赖关系

在对象创建之后,对象的关系处理就是依赖注入

无论对象的创建,处理对象之间的依赖关系,对象创建的时间还有对象创建的数量,都只需在spring的IOC容器上配置对象的信息即可

IOC最简单的方式就是采用XML方式来进行管理:

<beans> 
  数据源交给容器管理
  <bean id="datasource" class="DataSourceService" >
  
    <bean id="userservice" class="UserService">
       <property name="datasource" ref="datasource"/>
    </bean> 
    
    ...
</beans>

在BuyService中使用获取用户信息,通过容器:context 提供的方式来获取用户的实例context.getName("userservice"),就会在容器中找id=“userservice”,进而获取该对象实例进行使用。

Spring IOC容器中接口的继承关系,ApplicationContext是BeanFactory子接口实现之一,

BeanFactory是IOC容器定义的最底层的接口。

ApplicationContext是高级实现之一,对BeanFactory的接口做了很多的扩展,大部分情况ApplicationContext使用。

ApplicationContext接口常见的实现类:

  • ClassPathXmlApplicationContext(读取classpath中的资源
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationcontext.xml");
  • FileSystemXmlApplicationContext(读取系统指定的资源文件)
FileSystemXmlApplicationContext applicationContext1 = new FileSystemXmlApplicationContext("d://test.xml");
  •  XmlWebApplicationContext(读取web环境下的资源文件)
 XmlWebApplicationContext applicationcontext = new XmlWebApplicationContext();

Spring管理对象

集成依赖

添加依赖的时候要注意版本问题,我的IDEA为2020.2,maven为3.6.3,因此spring的依赖添加的是5.2.8版本 

<?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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.example</groupId>
  <artifactId>springTest</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>springTest</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>

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

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.12</version>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <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>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <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>

spring的配置文件(Applicationcontext.xml)

需要容器管理的对象在该xml文件中进行配置。

声明如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
</beans>   

创建实体类User

public class User {
    private Integer id;
    private String name;
}

使用bean标签类管理对象 id:属性标识对象,不可重复,class属性代表要管理的对象的全路径

     <bean id="user" class="org.example.bean.User"/>

通过容器获取对象

        //获取IOC容器,通过读取classpath路径下的spring的配置文件
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationcontext.xml");
        //在IOC容器获取需要的对象实例
        User user = (User) applicationContext.getBean("user");
        System.out.println(user);

原理:获取User对象时,new User() ,将对象的全路径配置在容器中,容器创建对象通过->反射 ->IOC容器底层拿到类的全路径,然后可以通过反射的技术来创建实例。

Spring对Bean的实例化方式

基于配置形式

1.通过无参构造函数实例化

<!--通过无参构造来实例化Bean-->
    <bean id="user" class="org.example.bean.User" scope="singleton"/>

spring容器对上面的类的实例化采用的是无参构造函数来实例化bean

注:如果不指定无参构造函数,会生成一个默认的无参构造函数,如果指定了有参构造函数,(就不会生成默认的无参构造函数),就必须显性的写明一个无参构造函数,否则会报错

2.通过静态工厂方式实例化

首先创建静态工厂类来获取User对象

public class staticFactory {
    public static User getUser(){
        return new User();
    }
}

spring容器管理配置如下:

<!--通过静态工厂类获取User对象-->
   <bean id="user1" class="org.example.factory.staticFactory" factory-method="getUser"></bean>

静态工厂方式获取对象是 class属性工厂类的全路径,factory-method属性指在工厂类中指定的方法来获取需要的对象

获取结果:

3.通过普通工厂方式实例化Bean

创建一个普通工厂来管理user

/**
 * 普通工厂
 */
public class commonFactory {

    public User getUser(){
        return new User();
    }
}

spring容器配置如下:

    <!--通过普通工厂类获取User对象-->
    <!--先获取工厂实例-->
    <bean id="factory" class="org.example.factory.commonFactory"/>
    <!--指定工厂类的方法-->
    <bean id="user2"  factory-bean="factory" factory-method="getUser"/>

首先需要获取工厂实例,通过普通工厂实例获取user对象时,factory-bean属性指的是容器管理的工厂对象,factory-method属性指的是工厂中获取user对象的方法

获取结果:

基于注解形式

基于注解形式比xml方式更加简单,开发更快。

创建了一个新的配置文件spring-config.xml,在配置文件中引入新的约束,且开启注解扫描

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <!--开启扫描注解:指定的包路径下的类,会扫描的到类的方法,属性上-->
    <context:component-scan base-package="org.example.bean"/>

    <!--只扫描类中属性的注解(不建议使用)-->
    <!--<context:annotation-config></context:annotation-config>-->

</beans>

只需在需要管理的类上添加注解即可

@Component("user")
//注解中user=XML配置形式中bean  id属性
public class User {
    private Integer id;
    private String name;
}

这里使用的注解@Component

@Component:通用注解

@Repository:对DAO层实现类进行标注

@Service:对Service层业务逻辑层进行标注

@Controller:对Controller的实现类进行标注

四个注解可以通用,功能一样,可以互换,使用不同注解主要是区分被注解的类处在不同的业务层,使逻辑更加清晰。

 

Spring中依赖注入方式

bean的实例化说明的是IOC的问题,创建对象之后对象中的属性如何赋值问题,即依赖注入问题(DI),主要有两种依赖注入方式:

  • xml配置方式进行依赖注入
  • 注解形式进行依赖注入

基于xml配置实现依赖注入

1.有参构造函数

该种注入方式要求对应的实体类中必须提供有参构造函数,如果没有构造函数,在配置文件中就会报错,无法通过编译。

public class User {
    private Integer id;
    private String name;

    /**
     * 有参构造函数
     */
    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

spring容器的配置如下:

    <!--依赖注入:有参构造函数-->
    <bean id="user3" class="org.example.bean.User">
        <!--
        注入属性
        name属性:给定类的属性名称
        value属性:对指定属性名称赋值 ,直接获取的是String类型的值
        ref属性:对指定属性进行赋值 指定的是一个容器管理的对象
        -->
        <constructor-arg name="id" value="1"></constructor-arg>
        <constructor-arg name="name" value="tom"></constructor-arg>
    </bean>

通过有参构造函数完成依赖注入时,使用constructor-arg标签进行属性赋值,为方便查看,在实体类中改写toString函数进行打印

 

2.setter方式注入

该方式需要为User类的属性设置setter方法

public class User {
    private Integer id;
    private String name;

    public User() {
    }
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

容器中的配置信息如下:

    <!--依赖注入:setter方式-->
    <bean id="user4" class="org.example.bean.User">
        <property name="id" value="2"></property>
        <property name="name" value="jack"></property>
    </bean>

setter方式的依赖注入:使用property标签进行赋值

赋值类型除了常见的String,Integer这种,还可以赋值给自定义类型,自定义类型无论是set方法还是有参构造均可,对自定义类型赋值时使用ref。

    <bean id="user3" class="org.example.bean.User">
        <constructor-arg name="book" ref="book"/>
    </bean>

注入集合类型:数组、Set、List、Map的个形式集合都可以注入,处理集合存在以下标签:

image.png

以map类型为例,进行介绍

package org.example.bean;

import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * Description :
 * Created by Resumebb
 * Date :2021/4/2
 */

@Component("user")
public class User {
    private Integer id;
    private String name;
    private Map<Integer, String> map;
    public User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
    public User(){}

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
//


    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", map=" + map +
                '}';
    }

    public Map<Integer, String> getMap() {
        return map;
    }

    public void setMap(Map<Integer, String> map) {
        this.map = map;
    }
}

spring容器中的配置:

    <bean id="user5" class="org.example.bean.User">
        <property name="id" value="3"></property>
        <property name="name" value="rose"></property>
        <property name="map">
            <map>
                <entry key="1" value="a"></entry>
                <entry key="2" value="b"></entry>
                <entry key="3" value="c"></entry>
            </map>
        </property>
    </bean>

 

基于注解形式注入依赖

@Value("3")//注入普通类型属性
@Resource //注入对象类型
@Autowired //注入对象类型,默认是按照类型注解

依赖的注入都是在类的属性上。

Resource与Autowired注解区别

Spring中,@Resource和@Autowired都是做bean的注入时使用。使用过程中,有时候@Resource 和 @Autowired可以替换使用;有时,则不可以。

  •   共同点

    @Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。

  •    不同点

 @Resource是Java自己的注解,@Resource有两个属性是比较重要的,分是name和type;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

@Autowired是spring的注解,是spring2.5版本引入的,Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰。

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring-IOC容器进行对象管理 的相关文章

  • 视觉SLAM学习--基础篇(SLAM框架及相机模型)

    一 例子 如上图的小萝卜机器人 xff0c 要使其具有自主运动能力至少需要两个条件 xff1a 1 我在什么地方 xff1f 定位 2 周围环境是什么样 xff1f 建图 因此它既需要知道自身的状态 位置 xff0c 也要了解所在的环境 地
  • Linux各类软件安装配置问题记录

    1 Ubuntu侧边栏和顶部栏消失不见 解决方法 xff1a 鼠标右键或者快捷键打开终端输入命令 dconf reset f org compiz 输入命令 setsid unity 一般到这一步侧边栏就会出现了 xff0c 如果没有出现就
  • 代码模拟确定有限自动机(DFA)执行过程

    一个确定有限自动机 xff08 DFA xff09 M是一个五元组 xff1a M 61 xff08 K xff0c xff0c f xff0c S xff0c Z xff09 其中 K是一个有穷集 xff0c 它的每个元素称为一个状态 x
  • 视觉SLAM-Eigen学习实践

    1 Eigen库介绍 Eigen 是一个 C 43 43 开源线性代数库 它提供了快速的有关矩阵的线性代数运算 xff0c 还包括解方程等功能 可以通过sudo apt install libeigen3 dev命令进行安装 xff0c 也
  • 苹果手机存储空间(或称为内存)满了导致黑屏转圈白苹果

    没刷机 xff0c 啥也没干 xff0c 发现把SIM卡拔了再开机就好了 xff0c 然后赶紧去卸载一些软件腾出空间
  • Arrays的toString方法和deepToString方法比较

    因为打印二维数组时用错了方法 xff0c 一般是用Arrays deppToString或者遍历使用toString xff0c 我直接用Arrays toString去打印了二维数组 xff0c 没有打印出正常二维数组的内容 xff0c
  • JavaSE-类与对象+单例模式

    1 类与对象的引用 概念 xff1a 如果一个变量的类型是类类型 xff0c 而非基本类型 xff0c 那么该变量又叫做引用 new testClass 该操作表示创建了一个testClass对象 xff0c 但没有办法访问这个对象 tes
  • JavaSE-类与对象-ATM自主操作系统实现

    学完类与对象的练习小作业 xff0c 主要有三个类 xff1a 银行卡类包含银行卡的相关信息如卡号 xff0c 密码 xff0c 姓名 xff0c 余额 xff1b 银行类中主要定义了一个银行卡数组 xff0c 用来存储当前用户的银行卡信息
  • JavaSE-基于回溯法用类+栈实现迷宫问题

    目录 1 问题描述 2 自定义类栈 3 结点类 4 操作类 5 函数讲解 6 测试类及结果 1 问题描述 输入迷宫大小 xff0c 以及路径 xff0c 0表示可走路径 xff0c 1表示死路 xff0c 从输入矩阵的左上角起点到右下角终口
  • Leetcode-234,844,19

    234 回文链表 请判断一个链表是否为回文链表 示例 1 输入 1 gt 2 输出 false 示例 2 输入 1 gt 2 gt 2 gt 1 输出 true 思路 xff1a 本想将链表逆置然后进行比较 xff0c 后来想了想用栈去做更
  • JavaSE-回溯+自定义类栈实现Puzzle问题

    Puzzle问题描述 如图有一个一维数组 xff0c 上面的数字表示可以移动的步数 xff0c 每个结点都有左右两个方向可以移动 xff0c 例如第一个结点4 xff0c 它只能往右移动4格到3的位置 xff0c 而3左右都可以移动 xff
  • JavaSE-泛型类、接口、方法、擦除机制

    1 泛型定义 泛型是JavaSE 1 5的新特性 xff0c 本质是参数化类型 xff0c 也就是所操作的数据类型被指定为一个参数 xff0c 将类型由原来的具体的参数类型化 xff0c 类似于方法中的变量参数 xff0c 此时类型也定义成
  • JavaSE-十分钟写个五子棋

    1 设计说明 1 1 简介 其实很久之前就写过五子棋 xff0c 当时拿AWT写的界面 xff0c 后面通过socket通信实现了联机对战操作 xff0c 当时写五子棋写的可费劲了 xff0c 现在又要写一次五子棋 xff0c 不过是简单版
  • JavaSE-类加载过程及反射

    目录 一 类加载过程 1 装载阶段 1 1执行过程 1 2 类加载器 1 3 双亲委派模型 1 4 类加载时机 2 链接阶段 2 1验证阶段 2 2准备阶段 2 3解析阶段 3 初始化阶段 二 反射 1 定义 2 用途 3 步骤 4 代码实
  • STM32F407-基于AD7606进行多路数据采集

    1 原理图 2 管脚定义 2 1 OS2 OS1 OS0 查阅数据手册 这三个管脚组合控制过采样模式 000 表示无过采样 xff0c 最大 200Ksps 采样速率 001 表示 2 倍过采样 xff0c 也就是硬件内部采集 2 个样本求
  • caffeine 与 reactor mono 一起使用产生的缓存错误问题

    现象 与reactor mono一起使用 xff0c 发现get key时 xff0c 返回的一直都是抛出的错误信息 xff0c 没有预期中的如果cache loader 返回null 或 错误时 xff0c caffeine自动剔除key
  • EBYTE E103-W02 WIFI模块配置总结(TCP+UDP+HTTP+云透传)

    目录 1 硬件配置 1 1 原理图 1 2 管脚配置 2 AT指令集 3 AP模式配置 3 1AP介绍 3 2 AP配置TCP通信 3 3 AP配置UDP通信 4 STA模式配置 4 1STA介绍 4 2配置过程 4 3网页配置 5 基于亿
  • JavaSE-自定义单链表

    目录 1 自定义链表实现 2 基础操作 2 1 链表打印操作 2 2 链表逆序打印 2 3 链表逆置 3 进阶操作 3 1查找倒数第K个结点 3 2 不允许遍历链表 xff0c 在pos结点之前插入 3 3两个链表相交 xff0c 输出相交
  • SRGAN实现超分辨率图像重建之模型复现

    1 论文介绍 1 1简介 论文名称 Photo Realistic Single Image Super Resolution Using a Generative Adversarial Ledig C Theis L Huszar F
  • JavaSE-自定义队列+两栈实现队列+两队列实现栈

    1 顺序队列实现 与栈一样 xff0c 队列也是一种操作受限制的线性表 xff0c 但与栈不同的是 xff0c 栈是后进先出 xff0c 队列的特点是先进先出 实现与栈类似 xff0c 队列有一个队头指针和一个队尾指针 xff0c 入队的时

随机推荐

  • JavaSE-八大经典排序算法及优化算法思路与实现

    目录 1 冒泡排序 1 1算法思想 1 2 算法实现 1 3 算法优化 1 4 算法分析 2 简单选择排序 2 1 算法思想 2 2 算法实现 2 3 算法优化 2 4 算法分析 3 直接插入排序 3 1 算法思想 3 2 算法实现 3 3
  • 快速超分辨率重建卷积网络-FSRCNN

    1 网路结构图 2 改进点 SRCNN缺点 xff1a SRCNN将LR送入网络前进行了双三次插值上采样 xff0c 产生于真实图像大小一致的图像 xff0c 会增加计算复杂度 xff0c 因为插值后图像更大 xff0c 输入网络后各个卷积
  • PriorityQueue(优先级队列)的解读与底层实现

    目录 1 什么是优先级队列 xff1f 2 优先级队列的特性 3 如何使用优先级队列 4 JDK源码分析 4 1类的继承关系 4 2类的属性 4 3常用的方法 5 自定义优先级队列实现 5 1 优先级队列类定义 5 2 add 方法 5 3
  • HashMap的使用与底层结构剖析

    目录 一 基础概念 二 先使用再了解 三 底层结构 1 HashMap结构 xff08 JDK1 8以前 xff09 2 HashMap结构 xff08 JDK1 8以后 xff09 四 HashMap实现 1 成员变量 2 put实现 3
  • 线程基础与使用测试

    目录 一 进程和线程 二 线程的创建 1 继承Thread类 xff0c 重写run 方法 2 实现Runnable接口 xff0c 重写run方法 3 匿名线程 xff0c 匿名内部类 4 实现Callable接口 xff0c 重写cal
  • 线程生命周期及常用方法的使用

    一 守护线程 守护线程是什么 xff1f 守护线程是一类比较特殊的线程 xff0c 一般用于处理后台的工作 xff0c 比如JDK的垃圾回收线程 守护线程的作用 xff1f JVM xff08 Java Virtual Machine xf
  • git合并被fork的仓库的远程分支

    如果你 fork 了一个仓库并在自己的 forked 仓库中进行了更改 xff0c 而原始仓库也有一些更新 xff0c 此时想将原始仓库的更新合并到你的 forked 仓库 xff0c 可以按照以下步骤 xff1a 1 将原始仓库添加为远程
  • Linux-基础知识及常见操作命令汇总

    目录 1 终端操作 2 命令手册 3 关机重启 4 runlevel 5 目录结构 6 文件属性 7 Linux文件属主和属组 8 目录常用命令 9 VIM命令 10 进程管理命令 1 进程状态 2 ps命令 3 pstree命令 jobs
  • 关键字synchronized与volatile详解

    在多线程并发编程中synchronized和volatile都扮演着重要的角色 xff0c synchronized一直是元老级角色 xff0c 很多人都会称呼它为重量级锁 但是 xff0c 随着Java SE 1 6对synchroniz
  • 迁移学习与Transformer架构

    迁移学习 迁移学习干什么的 xff1f 迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务 Eg xff1a 学习识别苹果可能有助于识别梨 xff0c 学习骑自行车可能有助于学习骑摩托车 xff0c 学习打羽毛球可能有助于学习打网
  • 生产者消费者模型分析与实现

    生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题 生产者和消费者彼此之间不直接通讯 xff0c 而通过阻塞队列来进行通讯 xff0c 所以生产者生产完数据之后不用等待消费者处理 xff0c 直接扔给阻塞队列 xff0c 消费
  • ConcurrentHashMap优点与源码剖析

    哈希表是中非常高效 xff0c 复杂度为O 1 的数据结构 xff0c 在Java开发中 xff0c 我们最常见到最频繁使用的就是HashMap和HashTable xff0c 但是在线程竞争激烈的并发场景中使用都不够合理 HashMap
  • IO-字节流

    文件 amp File类的使用 1 文件的概念 文件可以分为文本文件 二进制文件 2 IO流的概念 流是有顺序 有起点和终点的集合 xff0c 是对数据传输的总称 流的本质就是用来对数据进行操作 IO是我们实现的目的 xff0c 实现这个目
  • STM32F407的TCP编程出现客户端无法连接上服务器,DHCP获取IP失败,服务器重启客户端无法自动重连问题解决方案

    单写一篇文章记录这些问题 xff0c 因为有的问题实在是困扰了我太久太久了 xff0c 终于解决了 xff01 xff01 xff01 1 STM32F407的TCP编程 xff0c TCP SERVER测试完全正常 xff0c TCP C
  • SQL练习汇总(查询“01“课程比“02“课程成绩高的学生的信息及课程分)

    1 学生表 Student SID Sname Sage Ssex SID 学生编号 Sname 学生姓名 Sage 年龄 Ssex 学生性别 编号 姓名 年龄 性别 1 赵雷 20 男 2 钱电 20 男 3 孙风 21 男 4 吴兰 1
  • JDBC编程,SQL注入与连接池

    JDBC概念 JDBC Java Data Base Conection 是java中提供的一套标准的应用编程接口 xff0c 用来连接Java编程语言和数据库 JDBC常用组件 xff1a DriverManger xff1a 数据库驱动
  • Pytorch搭建基于SRCNN图像超分辨率重建模型及论文总结

    SRCNN xff08 Super Resolution Convolutional Neural Network xff09 论文出处 xff1a Learning a Deep Convolutional Network for Ima
  • 技术领域的面试总结

    在当今互联网中 xff0c 虽然互联网行业从业者众多 xff0c 不断崛起的互联网公司也会很多 xff0c 仍然是很多同学想要进入的企业 那么本篇文章将会为大家很直白的讲解面试流程以及侧重点 仔细阅读本篇文章 xff0c 绝对会有所收获 x
  • Mybatis基于XML与基于注解实现CRUD

    数据库 实体类Student package com pojo Description Created by Resumebb Date 2021 3 26 public class Student 和数据库中的STudent表对应 pri
  • Spring-IOC容器进行对象管理

    目录 IOC概念 IOC思想 Spring管理对象 集成依赖 spring的配置文件 xff08 Applicationcontext xml xff09 创建实体类User Spring对Bean的实例化方式 基于配置形式 1 通过无参构