【Spring】——4、使用@Scope注解设置组件的作用域

news2024/11/18 23:34:51

在这里插入图片描述

📫作者简介:zhz小白
公众号:小白的Java进阶之路
专业技能:
1、Java基础,并精通多线程的开发,熟悉JVM原理
2、熟悉Java基础,并精通多线程的开发,熟悉JVM原理,具备⼀定的线上调优经验
3、熟悉MySQL数据库调优,索引原理等,⽇志原理等,并且有出过⼀篇专栏
4、了解计算机⽹络,对TCP协议,滑动窗⼝原理等有⼀定了解
5、熟悉Spring,Spring MVC,Mybatis,阅读过部分Spring源码
6、熟悉SpringCloud Alibaba体系,阅读过Nacos,Sentinel,Seata,Dubbo,Feign,Gateway核⼼源码与设计,⼆次开发能⼒
7、熟悉消息队列(Kafka,RocketMQ)的原理与设计
8、熟悉分库分表ShardingSphere,具有真实⽣产的数据迁移经验
9、熟悉分布式缓存中间件Redis,对其的核⼼数据结构,部署架构,⾼并发问题解决⽅案有⼀定的积累
10、熟悉常⽤设计模式,并运⽤于实践⼯作中
11、了解ElasticSearch,对其核⼼的原理有⼀定的了解
12、了解K8s,Jekins,GitLab
13、了解VUE,GO
14、⽬前有正在利⽤闲暇时间做互游游戏,开发、运维、运营、推销等

本人著作git项目:https://gitee.com/zhouzhz/star-jersey-platform,有兴趣的可以私聊博主一起编写,或者给颗star
领域:对支付(FMS,FUND,PAY),订单(OMS),出行行业等有相关的开发领域
🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~

文章目录

  • @Scope注解概述
    • 第一个实现类:ConfigurableBeanFactory
    • 第二个实现类:WebApplicationContext
    • @Scope注解取值如下
  • 单实例bean作用域
  • 多实例bean作用域
  • 单实例bean作用域如何创建对象?
  • 多实例bean作用域如何创建对象?
  • 单实例bean注意的事项
  • 多实例bean注意的事项
  • 自定义Scope的实现
    • 如何实现自定义Scope呢?
      • 1、实现Scope接口
      • 2、将自定义Scope注册到容器中
      • 3、使用自定义的作用域
    • 一个自定义Scope实现案例

@Scope注解概述

@Scope注解能够设置组件的作用域,我们先来看看@Scope注解类的源码,如下所示。

/*
 * Copyright 2002-2018 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.context.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.core.annotation.AliasFor;

/**
 * When used as a type-level annotation in conjunction with
 * {@link org.springframework.stereotype.Component @Component},
 * {@code @Scope} indicates the name of a scope to use for instances of
 * the annotated type.
 *
 * <p>When used as a method-level annotation in conjunction with
 * {@link Bean @Bean}, {@code @Scope} indicates the name of a scope to use
 * for the instance returned from the method.
 *
 * <p><b>NOTE:</b> {@code @Scope} annotations are only introspected on the
 * concrete bean class (for annotated components) or the factory method
 * (for {@code @Bean} methods). In contrast to XML bean definitions,
 * there is no notion of bean definition inheritance, and inheritance
 * hierarchies at the class level are irrelevant for metadata purposes.
 *
 * <p>In this context, <em>scope</em> means the lifecycle of an instance,
 * such as {@code singleton}, {@code prototype}, and so forth. Scopes
 * provided out of the box in Spring may be referred to using the
 * {@code SCOPE_*} constants available in the {@link ConfigurableBeanFactory}
 * and {@code WebApplicationContext} interfaces.
 *
 * <p>To register additional custom scopes, see
 * {@link org.springframework.beans.factory.config.CustomScopeConfigurer
 * CustomScopeConfigurer}.
 *
 * @author Mark Fisher
 * @author Chris Beams
 * @author Sam Brannen
 * @since 2.5
 * @see org.springframework.stereotype.Component
 * @see org.springframework.context.annotation.Bean
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Scope {

	/**
	 * Alias for {@link #scopeName}.
	 * @see #scopeName
	 */
	@AliasFor("scopeName")
	String value() default "";

	/**
	 * Specifies the name of the scope to use for the annotated component/bean.
	 * <p>Defaults to an empty string ({@code ""}) which implies
	 * {@link ConfigurableBeanFactory#SCOPE_SINGLETON SCOPE_SINGLETON}.
	 * @since 4.2
	 * @see ConfigurableBeanFactory#SCOPE_PROTOTYPE
	 * @see ConfigurableBeanFactory#SCOPE_SINGLETON
	 * @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
	 * @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
	 * @see #value
	 */
	@AliasFor("value")
	String scopeName() default "";

	/**
	 * Specifies whether a component should be configured as a scoped proxy
	 * and if so, whether the proxy should be interface-based or subclass-based.
	 * <p>Defaults to {@link ScopedProxyMode#DEFAULT}, which typically indicates
	 * that no scoped proxy should be created unless a different default
	 * has been configured at the component-scan instruction level.
	 * <p>Analogous to {@code <aop:scoped-proxy/>} support in Spring XML.
	 * @see ScopedProxyMode
	 */
	ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;

}

从@Scope注解类的源码中可以看出,在@Scope注解中可以设置如下值:

  • ConfigurableBeanFactory#SCOPE_PROTOTYPE
  • ConfigurableBeanFactory#SCOPE_SINGLETON
  • org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
  • org.springframework.web.context.WebApplicationContext#SCOPE_SESSION

我们可以看到@Scope注解的注释中有一句话,表明它是有两个实现类的,所以我们直接上实现类中看。
在这里插入图片描述

第一个实现类:ConfigurableBeanFactory

在这里插入图片描述

我们可以发现SCOPE_SINGLETON就是singleton,而SCOPE_PROTOTYPE就是prototype。

第二个实现类:WebApplicationContext

在这里插入图片描述

我们可以发现SCOPE_REQUEST的值就是request,SCOPE_SESSION的值就是session。
request和session作用域是需要Web环境来支持的,这两个值基本上使用不到。当我们使用Web容器来运行Spring应用时,如果需要将组件的实例对象的作用域设置为request和session,那么我们通常会使用

request.setAttribute(“key”, object);
session.setAttribute(“key”, object);

这两种形式来将对象实例设置到request和session中,而不会使用@Scope注解来进行设置。

@Scope注解取值如下

在这里插入图片描述

单实例bean作用域

我们在MainConfig中添加一个Bean对象,放入spring容器中,如下:

package com.zhz.config;

import com.zhz.bean.Person;
import com.zhz.filter.MyTypeFilter;
import org.springframework.context.annotation.*;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;

/**
 * @author zhouhengzhe
 * @description: todo
 * @date 2022/11/4 10:27
 * @since v1
 */

@Configuration
public class MainConfig {

    /**
     * @Bean注解是给IOC容器中注册一个bean,类型自然就是返回值的类型,id默认是用方法名作为id
     */
    @Bean(name = "person")
    public Person person1() {
        return new Person("zhz", 20);
    }
}

然后我们在IOCTest中,执行如下代码:

package com.zhz.test;

import com.zhz.bean.Person;
import com.zhz.config.MainConfig;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author zhouhengzhe
 * @description: todo
 * @date 2022/11/4 10:58
 * @since v1
 */
public class IOCTest {

    @SuppressWarnings("resource")
    @Test
    public void test() {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        Person person = applicationContext.getBean(Person.class);
        Person person1 = applicationContext.getBean(Person.class);
        System.out.println(person == person1);
    }
}

我们可以发现他们是同一个对象,因此可知Spring容器默认是单例Bean,所以只要启动之后,Spring就会把实例对象加载到Bean当中,然后接下来的每一次去获取实例对象,都会是同一个引用地址返回。
在这里插入图片描述

结论:对象在Spring容器中默认是单实例的,Spring容器在启动时就会将实例对象加载到Spring容器中,之后,每次从Spring容器中获取实例对象,都是直接将对象返回,而不必再创建新的实例对象了

多实例bean作用域

我们在MainConfig中添加一个Bean对象,放入spring容器中,并且添加**@Scope(“prototype”)到Bean对象中,**代码如下:

package com.zhz.config;

import com.zhz.bean.Person;
import com.zhz.filter.MyTypeFilter;
import org.springframework.context.annotation.*;

/**
 * @author zhouhengzhe
 * @description: todo
 * @date 2022/11/4 10:27
 * @since v1
 */

@Configuration
public class MainConfig {

    /**
     * @Bean注解是给IOC容器中注册一个bean,类型自然就是返回值的类型,id默认是用方法名作为id
     */
    @Scope("prototype")
    @Bean(name = "person")
    public Person person1() {
        return new Person("zhz", 20);
    }
}

然后我们运行测试类IOCTest,代码如下:

package com.zhz.test;

import com.zhz.bean.Person;
import com.zhz.config.MainConfig;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author zhouhengzhe
 * @description: todo
 * @date 2022/11/4 10:58
 * @since v1
 */
public class IOCTest {

    @SuppressWarnings("resource")
    @Test
    public void test() {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        Person person = applicationContext.getBean(Person.class);
        Person person1 = applicationContext.getBean(Person.class);
        System.out.println(person == person1);
    }
}

演示效果如下:
在这里插入图片描述

总结:从以上输出结果中也可以看出,此时,输出的person对象和person2对象已经不是同一个对象了。说明他是一个原型实例

单实例bean作用域如何创建对象?

我们思考一下单例bean是什么时候创建的呢?
我们来做个实现,首先我们再MainConfig中创建一个对象,如下:

@Bean(name = "person")
    public Person person1() {
        System.out.println("单例bean创建");
        return new Person("zhz", 20);
    }

然后我们写一个测试用例,如下:

  @Test
    public void test() {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
    }

运行结果:
在这里插入图片描述
因此我们可以知道Spring容器在创建的时候,就将@Scope注解标注为singleton的组件进行了实例化,并加载到了Spring容器中,以后每次从容器中获取组件实例对象时,都是直接返回相应的对象,而不必再创建新的对象了。

多实例bean作用域如何创建对象?

我们也根据上面的测试案例去测一遍多例Bean是怎么创建对象的,测试代码如下:

@Scope("prototype")
    @Bean(name = "person")
    public Person person1() {
    System.out.println("单例bean创建");
    return new Person("zhz", 20);
}

测试用例1:

  @Test
    public void test() {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
    }

运行结果:
在这里插入图片描述

测试用例2:

@Test
    public void test() {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        Person person = applicationContext.getBean(Person.class);
        Person person1 = applicationContext.getBean(Person.class);
        System.out.println(person == person1);
    }

在这里插入图片描述

由测试用例1和测试用例2我们可以发现当对象是多实例时,每次从Spring容器中获取对象时,都会创建新的实例对象,并且每个实例对象都不相等

单实例bean注意的事项

单实例bean是整个应用所共享的,所以需要考虑到线程安全问题,之前在玩SpringMVC的时候,SpringMVC中的Controller默认是单例的,有些开发者在Controller中创建了一些变量,那么这些变量实际上就变成共享的了,Controller又可能会被很多线程同时访问,这些线程并发去修改Controller中的共享变量,此时很有可能会出现数据错乱的问题,所以使用的时候需要特别注意。

多实例bean注意的事项

多实例bean每次获取的时候都会重新创建,如果这个bean比较复杂,创建时间比较长,那么就会影响系统的性能,因此这个地方需要注意点。

自定义Scope的实现

如果Spring内置的几种scope都无法满足我们的需求时,我们可以自定义bean的作用域。

如何实现自定义Scope呢?

1、实现Scope接口

public interface Scope {

    /**
	 * 返回当前作用域中name对应的bean对象
	 * @param name 需要检索的bean对象的名称
	 * @param objectFactory 如果name对应的bean对象在当前作用域中没有找到,那么可以调用这个objectFactory来创建这个对象
	 */
	Object get(String name, ObjectFactory<?> objectFactory);

    /**
	 * 将name对应的bean对象从当前作用域中移除
	 */
	@Nullable
	Object remove(String name);

    /**
	 * 用于注册销毁回调,若想要销毁相应的对象,则由Spring容器注册相应的销毁回调,而由自定义作用域选择是不是要销毁相应的对象
	 */
	void registerDestructionCallback(String name, Runnable callback);
	/**
	 * 用于解析相应的上下文数据,比如request作用域将返回request中的属性
	 */
	@Nullable
	Object resolveContextualObject(String key);

    /**
    * 作用域的会话标识,比如session作用域的会话标识是sessionId
    */
	@Nullable
	String getConversationId();

}

2、将自定义Scope注册到容器中

需要调用org.springframework.beans.factory.config.ConfigurableBeanFactory#registerScope这个方法,咱们看一下这个方法的声明。
在这里插入图片描述

3、使用自定义的作用域

在定义bean的时候,指定bean的scope属性为自定义的作用域名称。

一个自定义Scope实现案例

  • 我们来实现一个线程级别的bean作用域,同一个线程中同名的bean是同一个实例,不同的线程中的bean是不同的实例。
  • 要求bean在线程中是共享的,所以我们可以通过ThreadLocal来实现,ThreadLocal可以实现线程中数据的共享。

我们在com.zhz.scope包下新建一个ThreadScope类。

package com.zhz.scope;

import com.alibaba.ttl.TransmittableThreadLocal;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.config.Scope;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * @author zhouhengzhe
 * @description: 自定义本地线程级别的bean作用域,不同的线程中的bean是不同的实例,同一个线程中同名的bean是同一个实例
 * @date 2022/11/5 23:46
 * @since v1
 */
public class ThreadScope implements Scope {

    public static final String THREAD_SCOPE = "thread";

    private ThreadLocal<Map<String, Object>> beanMap = new TransmittableThreadLocal<>();


    /**
     * 返回当前作用域中name对应的bean对象
     *
     * @param name:需要检索的bean对象的名称
     * @param objectFactory:如果name对应的bean对象在当前作用域中没有找到,那么可以调用这个objectFactory来创建这个bean对象
     */
    @Override
    public Object get(String name, ObjectFactory<?> objectFactory) {
        Map<String, Object> map = beanMap.get();
        Object bean=null;
        if (Objects.isNull(map)) {
            map = new HashMap<>(16);
            bean = objectFactory.getObject();
            map.put(name, bean);
            beanMap.set(map);
        }
        bean = map.get(name);
        return bean;
    }

    /**
     * 将name对应的bean对象从当前作用域中移除
     */
    @Override
    public Object remove(String name) {
        return this.beanMap.get().remove(name);
    }

    /**
     * 用于注册销毁回调,若想要销毁相应的对象,则由Spring容器注册相应的销毁回调,而由自定义作用域选择是不是要销毁相应的对象
     * bean作用域范围结束的时候调用的方法,用于bean的清理
     */
    @Override
    public void registerDestructionCallback(String name, Runnable callback) {
        System.out.println("name");
    }

    /**
     * 用于解析相应的上下文数据,比如request作用域将返回request中的属性
     */
    @Override
    public Object resolveContextualObject(String key) {
        return null;
    }

    /**
     * 作用域的会话标识,比如session作用域的会话标识是sessionId
     */
    @Override
    public String getConversationId() {
        return Thread.currentThread().getName();
    }
}

我们在com.zhz.config包下创建一个配置类,例如MainConfig,并使用@Scope(“thread”)注解标注Person对象的作用域为Thread范围:

 @Scope("thread")
    @Bean(name = "person")
    public Person person1() {
        System.out.println("单例bean创建");
        return new Person("zhz", 20);
    }

测试类:

 @Test
    public void test1() {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        ConfigurableListableBeanFactory beanFactory = applicationContext.getBeanFactory();
        // 向容器中注册自定义的Scope
        beanFactory.registerScope(ThreadScope.THREAD_SCOPE, new ThreadScope());
        for (int i = 0; i < 2; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName() + ","+applicationContext.getBean("person"));
                System.out.println(Thread.currentThread().getName() + ","+applicationContext.getBean("person"));
            }).start();
        }
        try {
            TimeUnit.SECONDS.sleep(1);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

演示效果:
在这里插入图片描述

由上可知:bean在同样的线程中获取到的是同一个bean的实例,不同的线程中bean的实例是不同的。

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

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

相关文章

VCED:学习Jina的简单操作

文章目录VCED:学习Jina的简单操作在pycharm里连接docker环境几个简单的jina demoimagetextvideoVCED:学习Jina的简单操作 在pycharm里连接docker环境 在pycharm里找到docker环境 New一个环境 在docker里进入terminal&#xff0c;找到python 位置 成功得到decker环境 运行jina…

004_步进电机实验

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。本章主要从步进电机的结构、工作原理、电机参数分别介绍&#xff0c;最后通过实验来实现步进电机运动的简单控制。本章所要实现的功能是&#xff1a;通过 ULN2003 驱动模块控制 28BYJ48 步进电机运行方向及速度&…

bugku-web-社工-初步收集

题目首页 社工又有杂项的存在 打开题目 小时候可能特感兴趣的网站 目录扫描一下 dirsearch 得到一个管理员后台登录网站 但是需要密码 再回到起始页面 存在一个下载点 可以操作 下载得到一个压缩包 解压打开 是一个小插件 尝试登录 同时 打开wireshark进行流量截取…

Nacos安装指南

Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos GitHub的Release下载…

Monaco Editor教程(十六):缩略图minimap的配置详解

背景 缩略图 (Minimap) 是一种常见的用于快速预览和探索的工具&#xff0c;可作为导航辅助用户探索大规模图。 在大文件的阅读和编辑中&#xff0c;能够起到很好的导航作用&#xff0c;并且缩略图能够显示文件结构的大致轮廓&#xff0c;使开发人员能够快速知道对应的编辑位置…

WordPress重新安装的几种方法(2022年新版教程)

我们在建网站的过程中&#xff0c;可能出于某些原因会把网站重装&#xff0c;例如网站中病毒了、网站做的不满意&#xff0c;重头开始。本文会给大家分享一下2022年可行的重装WordPress网站方法。 1 重装WordPress的方法 方法一&#xff1a;重置数据库 方法二&#xff1a;宝塔面…

【MySQL】MySQL基础、详细总结

数据库Mysql 内容管理数据库基础什么是DB、DBMS、DBS、DBA&#xff1f;什么是元组、码、候选码、主、外码&#xff08;键&#xff09;、&#xff08;非&#xff09;主属性&#xff1f;主、外码的区别&#xff1f;为什么不推荐使用外码和级联 &#xff1f;【分布式高并发】什么是…

Servlet规范之部署描述符

Deployment Descriptor 文章是对 JSR-000340 JavaTM Servlet 3.1 Final Release的Java™ Servlet规范的翻译&#xff0c;尚未校准 文章目录Deployment Descriptor部署描述符元素部署描述符的处理规则部署描述符部署描述符示意图web-app元素description Elementdisplay-name Ele…

从零开始学前端:json对象,冒泡排序 --- 今天你学习了吗?(JS:Day15)

从零开始学前端&#xff1a;程序猿小白也可以完全掌握&#xff01;—今天你学习了吗&#xff1f;&#xff08;JS&#xff09; 复习&#xff1a;从零开始学前端&#xff1a;字符串、数组的方法 — 今天你学习了吗&#xff1f;&#xff08;JS&#xff1a;Day12/13/14&#xff09…

范式建模维度建模 及结合BW的一些理解

用了几年BW了&#xff0c;时不时会想&#xff0c;BW为什么要这么设计啊&#xff0c;有时候用的可真麻烦&#xff0c;最近研究了下两种常见的建模理论&#xff0c;有了自己的一点感悟&#xff0c;我们从头开始,有很多资料是从大佬那里摘录的&#xff0c;就不一一列举了 一、范式…

DOPA-PEG-azide,Dopamine-PEG-N3,多巴胺PEG叠氮用于点击化学

多巴胺-聚乙二醇-叠氮&#xff08;DOPA-PEG-azide&#xff0c;Dopamine-PEG-N3&#xff09;该试剂具有更好的水溶性&#xff0c;它所属分类为Azide PEG Dopamine PEG。 peg试剂的分子量均可定制&#xff0c;有&#xff1a;2k、5k、3.4k、10k、20k、1k 。其质量控制为95%&#…

基于Matlab模拟用于天气观测的极化雷达回波(附源码)

目录 一、雷达定义 二、天线方向图 四、雷达脉冲合成 五、天气雷达力矩估计 六、仿真结果 6.1反射率 6.2 径向速度 6.3 频谱宽度 6.4 差分反射率 6.5 相关系数 6.6 差分相位 七、总结 八、程序 本示例展示了如何模拟满足天气观测要求的极化多普勒雷达回波。雷达在天…

柯桥增值税留抵如何退税?

今年&#xff0c;国家税务总局出台了“增值税期末留底退税”政策&#xff0c;这无疑对一些现金流缺乏的企业又是一重大利好呀&#xff01; 那么问题来了&#xff0c;咱们会计该如何操作领回这一部分钱呢&#xff1f; 接下来跟着豆哥一块儿操作退税吧~ 政策解读 重点提醒&…

驱动——LED灯循环闪烁

使用结构体形式对寄存器地址进行映射&#xff0c;实现3盏LED灯的循环点亮 1、创建LED灯点亮所需要的GPIO寄存器的结构体&#xff0c;并对寄存器地址进行宏定义 2、①通过ioremap函数将物理地址映射为虚拟地址 void* ioremap(phys_addr_t offset, size_t size) 函数功能&…

Mysql主从复制出现connecting

主从同步时出现Slave_IO_Running&#xff1a;Connecting首先解决Slave_IO_Running和Slave_SQL_Running是no的问题&#xff0c;原因是一台虚拟机是由另一台虚拟机复制过来的&#xff0c;就会导致uuid是一样的&#xff0c;需要先修改server的uuid&#xff0c;具体请查阅相关资料。…

【FME实战教程】001:FME2020中文安装图文教程(附安装包下载)

文章目录1. 安装license2. 安装FME Desktop3. 安装中文语言4. FME软件下载地址1. 安装license 打开软件安装包中的fme-flexnet-win-x64.msi&#xff0c;如下图所示&#xff1a; 点击Next。 点击Next。 单击install。 点击finish&#xff0c;完成。 &#xff08;1&#xff09;修…

pytorch入门教程(小土堆

pytorch入门教程、一些基础函数的概念&#xff08;参考代码&#xff09;&#xff0c;主要是带着读了一遍pytorch官方文档、另外推荐一个网站 www.paperswithcode.com&#xff0c;感觉很厉害的样子。 P5. PyTorch加载数据初认识_哔哩哔哩_bilibili import torch torch.cuda.is_a…

年产10000吨即食型大头菜工厂设计

目 录 摘 要 I ABSTRACT II 第1章 绪论 1 1.1即食大头菜发展现状及市场前景 1 1.1.1世界即食大头菜发展的特点与趋势 1 1.1.2我国即食大头菜发展现状 1 1.1.3即食大头菜的生产现状及前景展望 2 1.2专家点评 3 第2章 厂址选择 5 2.1厂址选择依据及范围 5 2.1.1选址依据 5 2.1.2选…

3.46 OrCAD软件怎么输出物料清单BOM表格?

笔者电子信息专业硕士毕业&#xff0c;获得过多次电子设计大赛、大学生智能车、数学建模国奖&#xff0c;现就职于南京某半导体芯片公司&#xff0c;从事硬件研发&#xff0c;电路设计研究。对于学电子的小伙伴&#xff0c;深知入门的不易&#xff0c;特开次博客交流分享经验&a…

asp.net+sqlserver笔记本电脑售后服务管理系统C#

研究内容与章节安排 全文的结构如下&#xff1a; 第一章&#xff1a;引言。论述课题提出的背景、对目前笔记本电脑售后服务系统的国内外发展水平进行了分析研究&#xff0c;通过比对&#xff0c;提出笔记本电脑售后服务系统的涵义及其优越性。 第二章&#xff1a;笔记本电脑售后…