2.3、Bean的管理

news2024/11/24 23:06:49

一、Bean的装配(IOC应用实现)

        创建应用组件之间的协作的行为通常称为装配(wiring)。Spring IOC通过应用上下文(ApplicationContext)装载Bean的定义并把他们组装起来。

        Spring应用上下文(ApplicationContext)全权负责对象的创建和组装。

        ApplicationContext是Spring IoC容器实现的代表,它负责实例化,配置和组装Bean。容器通过读取配置元数据获取有关实例化、配置和组装哪些对象的说明 。配置元数据可以使用XML、Java注解或Java代码来呈现。它允许你处理应用程序的对象与其他对象之间的互相依赖关系。

二、Bean三种装配(实例化)方式

  • 构造方法
  • 静态工厂
  • 实例工厂
// 三种方式 Bean 的实例化,返回的是一个BeanWrapper,半成品
// 实例工厂,静态工厂,构造方法

// 1、工厂实例化
//        1.1、实例工厂方式实例化 return
//        1.2、静态工厂方式实例化 return
// 2、有参构造器实例化(有@Autowired或无@Autowired)
// 3、无参构造实例化

三、搭建spring项目-jar包

如果只是使用spring的基本功能,只需要四个jar包

  • spring-beans
  • spring-core
  • spring-context
  • spring-expression(spel表达式)

用maven搭建spring工程,只需要一个context包就够了,maven帮我们做了上述几个jar包的继承

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

四、Spring进行Bean的装配代码行为实现:

我们可以通过下面三种代码行为实现

  1. 显示的xml配置文件方式(使用xml配置文件的方式定义Bean)
  2. 隐示的自动化装配机制(使用Spring自动化注解方式定义Bean)
    @Compont(@serivce @controller @repository) @Autowride,Spring 2.5 支持基于注解的元数据配置. SSM框架开发中的使用
  3. 显示的java注解方式(使用Java注解方式定义Bean)

从 Spring 3.0开始, 由Spring JavaConfig项目提供的功能已经成为Spring核心框架的一部分。因此,你可以使用Java配置来代替XML配置定义外部bean

从spring4.0开始支持springboot1.0之后 springboot完全采用javaConfig的方式进行开发。

1、代码实现一:显示的xml配置文件方式(XML)

原理:xml+dom4j+反射

(1)、创建spring配置文件

一般建议把文件放到src下面,名称随便写建议 applicationContext.xml。如果是maven工程放在resource下面

<?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:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

(2)、接下来是三种bean装配方式

A:无参构造(常用)

        解析spring配置文件得到对象,这个过程不需要写代码实现,在spring封装对象进行这些操作,这个由ApplicationContext实现

<!-- xml文件配置user对象创建,无参数构造 -->
<bean id="user" class="cn.noargstructure.User" name="设置别名,别名2,使用逗号风的多个别名" scope="singleton" >
    <description>用来描述一个Bean是干的</description>
</bean>
<!--为外部定义的bean起别名 -->
<alias name="user" alias="user6"></alias>
//测试得到配置的user对象
public static void main(String[] args) {
   //1 加载spring配置文件,把文件对象创建
   ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
   //可以加载多个xml
   //ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");
  //2 根据配置文件的id值得到对象
  User user = (User) context.getBean("user");
  System.out.println(user);
}

B:静态工厂(工厂方法设计模式)

<!-- xml配置,使用静态工厂创建对象 -->
<!-- factory-method指定了工厂类的哪个方法创建Bean-->
<bean id="staticFactory" class="cn.staticfactory.StaticFactory" factory-method="getBean1"/>
// Bean类
public class Bean1 {}

//工厂类:
public class Bean1Factory {
    //静态方法直接创建对象
   public static Bean1 getBean1() {
      return new Bean1();
   }
}
@Test
public void testStaticFactory(){
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("static-factory.xml");
    // Bean1 bean = (Bean1) context.getBean("bean1");
    // 报错, Map<String, BeanDefinition> beanDefinitionMap 没有这bean1的
    // 有一个叫 staticFactory
    // StaticFactory staticFactory = (StaticFactory) context.getBean(StaticFactory.class);
    // 报错, 没有实例化staticFactory这个Bean
     Bean1 bean1 = context.getBean(Bean1.class);
     Bean1 bean2 = (Bean1) context.getBean("staticFactory");
     System.out.println(bean1);
     System.out.println(bean2);
     // 一级singletonObjects 里面存的name是staticFactory ,对象是 Bean1
}

C:实例工厂

<!-- xml配置工厂Bean,这个工厂Bean是无参构造的方式由Spring创建 -->
<bean id="instanceFactory" class="cn.instancefactory.InstanceFactory"/>

<!-- 使用工厂对象创建bean2对象 -->
<!-- factory-bean指定实例工厂类 -->
<!-- factory-method指定使用实例工厂的哪个方法创建Bean2 -->
<bean id="bean2" factory-bean="instanceFactory" factory-method="getBean2"/>
public class Bean2 {} 
 // 实例工厂
public class InstanceFactory {
   public Bean2 getBean2() {
      return new Bean2();
   }
}
//实例工厂
@Test
public void testInstanceFactory(){
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("instance-factory.xml");
    // 实例工厂先初始化,然后执行实例工厂的FactoryMethod方式实例化Bean2
    Bean2 bean2 = (Bean2) context.getBean("bean2");
    System.out.println(bean2);
    InstanceFactory instanceFactory = (InstanceFactory) context.getBean("instanceFactory");
    // 一级singletonObjects 里面存的name是 instanceFactory ,对象是 InstanceFactory
   // 一级singletonObjects 里面存的name是 bean2 ,对象是 Bean2
}

D:有参构造 -- 这里只讲用注解,不用xml

会触发参数的getBean()操作

有@Autowired

@Service
public class People1 {
    @Autowired(required = false)
    public People1(People2 people2, People3 people3) {
    }
    @Autowired(required = false)
    public People1(People2 people2) {
    }
}

无@Autowired

@Service
public class Person1 {

    public Person1(Person2 person2, Person3 person3) {
        System.out.println("person 有2参数");
    }
}

注意

1、有@Autowire的有参构造函数

        1.1、 可以没有无参构造方法

        1.2、required= true,只能有一个有参数构造

        1.3、required= false,可以有多个有参数构造,按顺序取了第一个

2、无@Autowire的有参构造函数

        1.1、有参数构造函数只有一个没问题

        1.2、如果有多个有参数构造函数,必须加无参构造,等于还是无参初始化

        3、1和2混合,2直接被忽略类

2、代码实现二:隐示的自动化装配机制(注解+xml)

使用Spring的注解扫描机制来实现自动化装配,底层是使用spring的aop实现的

注意:使用需要添加spring-aop.jar包,但是maven引入spring-context已经包含了spring-aop。

只演示无参数构造(实际上我们基本上都用无参构造)

1. applicationContext.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.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">    
    <!-- 方式一:开启注解的扫描,指定扫描路径,到配置的包里面扫描类、方法、属性上面是否有注解-->
    <context:component-scan base-package="cn.ioc.xml.noargstructure"></context:component-scan>
    <!-- 方式二: 这个开启注解扫描,只会扫描属性上面注解-->
    <!-- <context:annotation-config></context:annotation-config> -->
</beans>

2.在Bean类上添加注解@Component

@Component(value="userDao")
public class UserDaoImpl implements UserDao {
    @Override
    public void sayHello() {
        System.out.println("Hello Spring Annotation...");
    }
}

3.编写测试类

public class TestIoc {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-anno.xml");
        //getBean 取的是实现类,不是接口。实现类默认Bean ID是类名第一个字母小写,或者有value配置
        UserDao userDao = (UserDao) context.getBean("userDao");
        userDao.sayHello();
    }
}

除了@Component外,Spring提供了3个基本功能和@Component等效的注解,注意不要标记到接口上,标记在类上

  • @Controller 用于对Controller实现类进行标注
  • @Service 用于对Service实现类进行标注
  • @Repository 用于对DAO实现类进行标注
  • @Component

添加value是给bean赋值一个唯一Bean Id,和xml配置装配bean的id一样。可以省略,默认名字是类名第一个字母小写。

上面的xml的bean配置和注解@Component还可以混合使用,底层都是IOC

3、代码实现三:显示的JavaConfig注解方式(基于java的容器配置)(JavaConfig+Spring注解(spring boot))

知识点链接:

基本概念: @Bean 和 @Configuration

  •  @Configuration 注解

绑定Java与XML配置

使用@Configuration+@ComponentScan实现无xml方式的装配,即@Configuration标注的配置类取代了XML配置文件

  • @Configuration相当于之前的applicationComtext.xml配置文件的<beans></beans>
  • @ComponentScan相当于当于<context:component-scan base-package="cn.service"></context:component-scan>开启注解扫描,默认扫描配置文件所在的包及其子包
//配置类
@Configuration // 就相当于创建了一个xml 文件 <beans></beans>
//@ComponentScan("cn.service") //指定路径 //<context:component-scan base-package="cn.service" >
@ComponentScan //默认扫描当前包所在的路径
public class SpringConfig {}

 然后使用@Service @Component @Controller @Repository装Bean

public interface UserService {
    void method();
}

@Service
public class UserServiceImpl implements UserService {
    @Override
    public void method() {
        System.out.println("configuration create UserServiceImpl");
    }
}
//spring集成测试使用 @RunWith @ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {IocConfig.class})//加载配置类
public class Test1_Ioc {
    // 注入 ApplicationContext对象,或者直接注入UserService对象
    @Autowired
    ApplicationContext applicationContext;

    @Test
    public void test() {
        UserService bean = applicationContext.getBean(UserService.class);
        bean.method();
    }
}

五、Spring创建第三方bean对象---@Bean

1、注解方式:

  •  @Bean 注解

@Bean是一个方法级别的注解,它与XML中的 元素类似。

注解支持 提供的一些属性,例如 * init-method * destroy-method * autowiring * name

开发者可以在@Configuration类或@Component类中使用@Bean注解。

底层:@Bean是通过实例工厂的方式实现的

BeanDefinition

// beanName就是方法的名字

// BeanDefinition没有class

// BeanDefinition FactoryBeanName 是配置类的名字

// BeanDefinition FactoryMethodName 是配置类的@Bean方法的名字

@Bean的使用

对于第三方的组件类,我们就不能使用自动化装配方案,我们可以使用xml或javaConfig,推荐使用JavaConfig

@Bean可理解为xml里面的标签,如下在配置类添加@Bean注解配置就是装配成功了,此对象就交给spring管理了

/**
     *  可以将一个类的实例(可以干预Bean实例化过程),注册为一个Bean
     *  会自动将返回值作为Bean的类型    将方法名作为bean的名字
     *  @Bean(name = "dd") 设置bean的名字及别名(替换)
     *  @Bean(initMethod = "",destroyMethod = "") =  <bean class="xx" id="xx" init-method="initByConfig" destroy-method="destroyByConfig"></bean>
     */
@Configuration
@ComponentScan
public class BeanConfig {
    @Bean
    public Apple apple(){
        return new Apple();
    }
public class Apple {
    public void say() {
        System.out.println("我是一个苹果");
    }
}
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {BeanConfig.class})
public class Test2_Bean {
    @Autowired
    private Apple apple;
    
    @Test
    public void test01() {
        apple.say();
    }
} 
  • 怎么去自动依赖外部Bean:直接在方法里面写上需要依赖的参数即可,不需要写@Autowired
  • 怎么去自动依赖配置类内部Bean:直接调用方法即可
    • 注入内部bean依赖
@Configuration
@ComponentScan
public class BeanConfig {
    @Bean
    public Person person(){
        System.out.println(man().hi());
        return new Person("张三");
    }

    @Bean
    public Man man(){
        return new Man();
    }
}

public class Man {
    public String hi(){
        return "你好";
    }
}

public class Person {
    private String name;

    public String getName() {
        return name;
    }

    public Person(String name) {
        this.name = name;
    }

    public void sayHello(String hi) {
        System.out.println(hi + " ,我是" + getName() );
    }
}

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {BeanConfig.class})
public class Test2_Bean {
    @Autowired
    private Person person;

    @Test
    public void test02(){
        person.sayHello("你好");
    }
}
  • Bean之间的依赖 -注入外部Bean - @Import

我们可以使用方法参数来实现该依赖关系,如以下示例所示:

@Configuration
@ComponentScan // 开启注解扫描,要扫@Service标注的Banana
@Import(BeanConfig.class) //引入BeanConfig配置类,Apple在BeanConfig配置
public class Bean2Config {
    @Bean
    public Monkey monkey(Banana banana, Apple apple) {
        return new Monkey(banana.banana(),apple.apple());
    }
}
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {Bean2Config.class})
public class Test2_Bean {
    @Autowired
    private Monkey monkey;

    @Test
    public void test03(){
        monkey.eat();
    }
}
  • 接收生命周期回调 initMetohd和destroyMethod

相当于在xml的配置的init-method和destrouy-method

//init-method="initByConfig" destroy-method="destroyByConfig"
@Bean(initMethod = "initByConfig",destroyMethod = "destroyByConfig")
public PayService getPayService(){
    return new PayServiceImpl();
}

public class PayServiceImpl implements PayService {
    @Override
    public void print() {
        System.out.println("@Bean create PayServiceImpl");
    }

    @Override
    public void initByConfig() {
        System.out.println("PayService-初始化");
    }

    @Override
    public void destroyByConfig() {
        System.out.println("PayService-销毁");
    }
  • 指定 Bean 的作用域 @Scope
    @Configuration
    public class MyConfiguration {
        @Bean
        @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
        public Encryptor encryptor() {
            // ...
        }
    }
  • 自定义Bean的名字
//默认情况下,配置类使用@Bean方法的名称作为结果bean的名称。 
//但是,可以使用name属性覆盖此功能,如以下示例所示:
@Configuration
public class AppConfig {

    @Bean(name = "myThing")
    //多个别名:@Bean(name = { "dataSource", "subsystemA-dataSource", "subsystemB-dataSource" })
    public Thing thing() {
        return new Thing();
    }
}

2、xml方式

在Spring中,很多对象都是单实例的,在日常的开发中,我们经常需要使用某些外部的单实例对象,例如数据库连接池,下面我们来讲解下如何在spring中创建第三方bean实例。

1、导入数据库连接池的pom文件

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid</artifactId>
   <version>1.1.21</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.47</version>
</dependency>

2、编写配置文件

ioc.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.xsd">
​
   <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
       <property name="username" value="root"></property>
       <property name="password" value="123456"></property>
       <property name="url" value="jdbc:mysql://localhost:3306/demo"></property>
       <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
   </bean>
</beans>

3、编写测试文件

​public class MyTest {
   public static void main(String[] args) throws SQLException {
       ApplicationContext context = new ClassPathXmlApplicationContext("ioc3.xml");
       DruidDataSource dataSource = context.getBean("dataSource", DruidDataSource.class);
       System.out.println(dataSource);
       System.out.println(dataSource.getConnection());
  }
}

3、FactoryBean

public class Bnana {
}
@Service
public class BananaBean implements FactoryBean {
    @Override
    public Banana getObject() {
        return new Banana();
    }

    @Override
    public Class<?> getObjectType() {
        return Banana.class;
    }
}
@Service
public class Fruit {
    @Autowired
    private Bnana Bnana;
}

4、导入ImportSelector实现类,可以注册多个bean @Import({MyImportSelector.class})

六、Spring Bean 管理的方式注解和xml的比较

七、jdk9以上就废弃了@PostConstruct,如果想继续使用@PostConstruct有两种方法:

1、引入java注解包,

2、现Spring 提供的  InitializingBean和 DisposableBean接口的效果和使用@PostConstruct和@PreDestroy 注解的效果一样。(推荐)

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

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

相关文章

yum安装LNMP

目录 前言 一、yum安装要用在线yum源 二、安装Nginx 1、搭建Nginx环境 2、安装yum 3、查看Nginx是否安装成功 4、设置开机自启 三、安装MySQL 1、除系统中所有以"mariadb"开头的软件包 2、安装MySQL 3、设置开机自启 4、查看MySQL初始密码 5、修改MySQL密码…

第 107 场LeetCode双周赛

A 最大字符串配对数目 显然各字符串对 间匹配的先后顺序不影响最大匹配数目, 可以从后往前遍历数组, 判断前面是否有和当前末尾构成匹配的. class Solution { public:int maximumNumberOfStringPairs(vector<string> &words) {int res 0; while (words.size…

Python基础五

目录 一、Ptyhon数据类型--元组 1.元组的注意事项 2.元组的下标 3.访问元组元素 4.拼接元组 5.删除元组 6.元组运算符 二、Python内置函数--元组相关 一、Ptyhon数据类型--元组 Python 的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改&#xff0c;也不能…

chatgpt赋能python:Python编写预警系统——保障企业安全的得力工具

Python编写预警系统——保障企业安全的得力工具 随着互联网应用的发展&#xff0c;企业所要面对的风险和威胁也与日俱增&#xff0c;预警系统的作用在保障企业安全中越来越显著。Python编写预警系统&#xff0c;成为了许多企业和团队的首选&#xff0c;具有方便快捷、灵活多样…

【软考网络管理员】2023年软考网管初级常见知识考点(13)-ARP、ICMP、IPv6协议详解

#涉及知识点 ARP协议详解、ICMP协议详解、IPv6协议等软考内容详解 软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多考点汇总可以去他主页查看 文章目录 前言一、…

浅析AI深度学习计算机视觉技术在智能监控领域的场景应用

计算机视觉技术是一种模拟人类视觉功能的技术&#xff0c;通过数字图像处理、模式识别、机器学习等方法&#xff0c;自动分析和理解图像和视频中的信息&#xff0c;从而实现图像和视频的自动理解、识别、分类、检测和跟踪等任务。 计算机视觉技术的使用场景非常广泛&#xff0…

第十四章 Vision Transformer网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

Presto 之Cross Join消除的实现

一. 前言 Cross Join是指无条件的join。因为Cross Join的代价为笛卡尔乘积&#xff0c;代价很大&#xff0c;因此在Presto的执行优化中&#xff0c;会尽量消除掉Cross Join。Presto Cross Join的消除原理主要是尽可能通过对Join表的重新排序实现将Cross Join转换为Inner Join。…

Python基础六

目录 一、Python数据类型--字典 1.访问字典里的值 2.修改字典 3.删除字典元素 4.字典键的特性 二、Python内置函数--字典相关 一、Python数据类型--字典 字典是另一种可变容器模型&#xff0c;且可存储任意类型对象。 字典的每个键值 key>value 对用冒号 : 分割&#…

Tesla EDI 项目数据库方案开源介绍

近期为了帮助广大用户更好地使用 EDI 系统&#xff0c;我们根据以往的项目实施经验&#xff0c;将成熟的 EDI 项目进行开源。用户安装好知行之桥EDI系统之后&#xff0c;只需要下载我们整理好的示例代码&#xff0c;并放置在知行之桥指定的工作区中&#xff0c;即可开始使用。 …

Centos下 ffmpeg Unknown encoder ‘libx264‘终极解决方法

目录 背景 原因分析 解决问题 1. 确认提前安装了X264以及相关依赖。

数据结构的三要素

1 三要素之逻辑结构&#xff1a;数据元素之间的逻辑关系 集合&#xff1a;各个元素同属同一集合&#xff0c;别无其他关系&#xff0c;比如全世界500强公司 线性结构&#xff1a;数据元素是一对一的关系&#xff0c;除了第一个元素&#xff0c;其他元素都有唯一前驱&#xff…

设计模式学习之工厂方法模式

设计模式系列往期文章 设计模式学习之策略模式设计模式学习之策略模式在前端的应用设计模式学习之简单工厂模式 在上一篇文章中我们学习了简单工厂模式——这是工厂模式中最简单的一种模式&#xff0c;通过工厂类提供的方法创建类&#xff08;可以类比为产品&#xff09;&…

【区块链 | GameFi】 - 传统游戏进军链游GameFi的探索之路

撰文:W Labs Kluxury,Cplus 【原文链接】 本文要点: 一,什么游戏类型最适合改为链游? 除了链游特有的质押挖矿型和纯 NFT 型,其余的类型都和传统游戏类型高度重合。所以不存在绝对的什么类型可以链改而什么类型不能链改的结论。 开发者立场上看,符合如下几个特性的游…

机器学习之LDA算法

目录 LDA算法 LDA目标 LDA原理推导 LDA除法模型 LDA减法模型 LDA除法正则模型 LDA减法正则模型 证明&#xff1a;StSwSb LDA算法流程 LDA优点 LDA缺点 基于LDA的人脸识别 LDA算法 线性判别分析&#xff08;linear discriminant analysis&#xff0c;LDA&#xff0…

chatgpt赋能python:Python编码转换:理解不同的编码方式

Python编码转换&#xff1a;理解不同的编码方式 Python是一种功能强大的编程语言&#xff0c;它广泛用于各种领域&#xff0c;包括Web开发、数据分析、人工智能等等。与其他编程语言类似&#xff0c;Python也需要进行编码转换以处理不同的字符集和文本编码。 本文将介绍Pytho…

Spark Local环境搭建及测试

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 篇一&#xff1a;Linux系统下配置java环境 篇二&#xff1a;hadoop伪分布式搭建&#xff08;超详细&#xff09; 篇三&#xff1a;hadoop完全分布式集群搭建&#xff08;超详细&#xf…

TypeScript ~ TS 面向对象编程 ⑧

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

6. Redis缓存设计与性能优化

分布式缓存技术Redis 1. 多级缓存架构2. 缓存设计2.1 缓存穿透2.2 缓存失效(击穿)2.3 缓存雪崩2.4 热点缓存key重建优化2.5 缓存与数据库双写不一致 3. 开发规范与性能优化3.1 键值设计3.1.1 key名设计3.1.2 value设计 3.2 命令使用3.3 三、客户端使用 4. 系统内核参数优化 本文…

3-2 Named tensors

这里有一张图像img_t 彩色图像可以看作一个矩阵&#xff0c;只是矩阵中的每一个点不是一个值&#xff0c;而是包含3个值的数组&#xff0c;这3个值就是RGB值 我们给它随机化为一个形状为 [3, 5, 5] 的三维张量img_t img_t torch.randn(3, 5, 5) # shape [channels, rows, co…