02、Spring中的Bean实例化、作用域、生命周期及装配方式介绍

news2025/1/17 13:56:38

简介:本笔记主要介绍以下几点
1、Bean的常见属性及其子元素
2、实例化Bean的三种方式
3、Bean的生命周期和作用域
4、Bean的三种装配方式

1、Bean的配置

Spring简单来说就是一个大工厂,这个工厂负责创建和管理Spring容器中的Bean对象,如果要使用,就需要对其进行配置。
Spring支持XML和Properties两种格式的配置文件。(常用的是XML方式,便于管理Bean和Bean之间的关系)。
XML配置方式根元素是<beans> <beans>中包含多个<bean>子元素。

1、<bean>元素的常见属性及子元素

属性或子元素名称解释
id是每一个Bean的唯一标识,Spring容器对Bean的配置,管理都需要靠该属性来完成
nameSpring容器可以通过name属性来对Bean进行管理和配置,此时name可以被配置多个,多个值之间使用逗号隔开
class该属性指定Bean的具体实现类,必须填写全限定类名。
constructor-arg<bean>元素的子元素,可以使用此元素传入构造器的参数进行实例化。该元素的index属性指定构造参数的序号(从0)开始,type属性指定狗仔参数的类型,参数值可以通过ref属性或value直接指定
property<bean>元素的子元素,用于调用bean实例中的setter方法完成属性赋值,从而完成依赖注入。该元素的name指定实例中相应的属性名称,ref或value用于指定参数值
ref<property> <constructor-arg >等元素的属性或子元素,可以用于指定工厂中某个Bean的实例引用
value<property> <constructor-arg >等元素的属性或子元素,可以用于指定一个常量值
list用于封装List或数组类型的依赖注入
set用于封装set类型的依赖注入
map用于封装map类型的依赖注入
entry<map>元素的子元素,用于设置一个键值对,其中key属性标识键值,ref或value表示值。

2、基本使用演示

<?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/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--关联db.properties-->
    <context:property-placeholder location="classpath:db.properties"/>
    
    <!--配置数据库连接池-->
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${password}"/>
    </bean>
    <!--配置StudentDAOImpl-->
    <bean id="studentDAO" class="cn.simplelife.dao.impl.StudentDAOImpl">
        <property name="dataSource" ref="druidDataSource"/>
    </bean>

    <!--配置serviceImpl-->
    <bean id="studentService" class="cn.simplelife.service.impl.StudentServiceImpl">
        <property name="studentDAO" ref="studentDAO"/>
    </bean>
</beans>

【注意】:

  • 如果id和name属性都没有指定,那么spring会默认将class的值当作id使用

2、Bean的实例化

在java中我们需要使用一个对象的时候,就必须先实例化这个对象,Spring中也是如此。Spring中实例化的方式主要有以下三种:
1、构造器实例化
2、静态工厂实例化
3、实例工厂实例化

1、构造器实例化

1、创建一个Cat类

package cn.simplelife.domain;

/**
 * @ClassName Cat
 * @Description
 * @Author simplelife
 * @Date 2022/11/18 9:54
 * @Version 1.0
 */

public class Cat  {
}

2、书写一个配置文件

<?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="cat"  class="cn.simplelife.domain.Cat"/>
</beans>

3、编写测试类

package cn.simplelife.domain;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import static org.junit.Assert.*;

/**
 * @ClassName CatTest
 * @Description
 * @Author simplelife
 * @Date 2022/11/18 9:55
 * @Version 1.0
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:cat.xml")
public class CatTest {

    @Autowired
    private Cat cat;

    @Test
    public void getCat() {
        System.out.println(cat);
    }
}

4、运行截图

在这里插入图片描述

2、静态工厂方式实例化

1、创建一个Duck类

package cn.simplelife.domain;

/**
 * @ClassName Duck
 * @Description
 * @Author simplelife
 * @Date 2022/11/21 17:20
 * @Version 1.0
 */

public class Duck {
}

2、创建一个静态工厂类

package cn.simplelife.domain;

/**
 * @ClassName DuckFactoryBean
 * @Description
 * @Author simplelife
 * @Date 2022/11/21 17:21
 * @Version 1.0
 */

public class DuckFactoryBean {
    public static Duck createDuck() {
        return new Duck();
    }
}

3、书写配置文件

<?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="duck" class="cn.simplelife.domain.DuckFactoryBean" factory-method="createDuck"/>
</beans>

4、编写测试类

package cn.simplelife.domain;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @ClassName DuckFactoryBeanTest
 * @Description
 * @Author simplelife
 * @Date 2022/11/21 17:25
 * @Version 1.0
 */

public class DuckFactoryBeanTest {

    @Test
    public void getDuck(){
        ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath:duck.xml");
        Duck bean = classPathXmlApplicationContext.getBean(Duck.class);
        System.out.println("bean = " + bean);
    }
}

5、运行截图

在这里插入图片描述

3、实例工厂方式实例化

1、创建一个Dog类

package cn.simplelife.domain;

/**
 * @ClassName Dog
 * @Description
 * @Author simplelife
 * @Date 2022/11/18 9:59
 * @Version 1.0
 */

public class Dog {
}

2、创建一个实例工厂用来返回Dog对象

package cn.simplelife.domain;

/**
 * @ClassName DogFactory
 * @Description
 * @Author simplelife
 * @Date 2022/11/18 9:59
 * @Version 1.0
 */

public class DogFactoryBean {
    public Dog createDog() {
        return new Dog();
    }
}

3、书写配置文件

<?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="dogFactoryBean" class="cn.simplelife.domain.DogFactoryBean"/>

    <!--配置dog实例
    factory-bean="dogFactoryBean":使用配置的实例工厂
    factory-method="createDog":使用工厂中的方法创建对象
    -->
    <bean id="dog" factory-bean="dogFactoryBean" factory-method="createDog"/>

</beans>

4、编写测试类

package cn.simplelife.domain;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @ClassName DogTest
 * @Description
 * @Author simplelife
 * @Date 2022/11/18 10:00
 * @Version 1.0
 */

public class DogTest {
    @Test
    public void testGetDog() {
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("classpath:dog.xml");
        Dog bean = applicationContext.getBean(Dog.class);
        System.out.println("bean = " + bean);
    }
}

5、运行截图

在这里插入图片描述

3、Bean的作用域

1、Spring中Bean对象的作用域分类

作用域名称说明
singleton使用该作用域,那么从始至终都只有一个实例对象存在于容器中,也是spring容器的默认的作用域
prototype每次通过Spring容器获取的prototype定义的bean,Spring容器都会创建一个新的bean实例对象,该对象是存放在内存中的,主要是防止在容器中导致过度的垃圾实例对象
request在一次Http请求中,容器会返回该Bean的同一个实例,对不同的Http请求返回不同的bean对象,并且只在该请求中有效
session在一次的http Session中会产生该bean实例,并且只在当前的httpsession中有效
globalSession在一个全局的HTTP Session中有用。仅在使用portlet上下文时有效
application为每个ServletContext创建一个实例对象,仅限在web中使用
websocket为每个websocket创建一个实例。

2、常用作用域——singleton

【特点】:

  • 是Spring容器的默认作用域。
  • 被singleton修饰的实例,无论引用多少次,在容器中只有一个实例对象。
  • 适用于无会话状态的Bean如:(DAO组件,Service组件)

【使用演示】:

  • 配置bean(建议不书写作用域,默认就是单例的)
<bean id="cat"  class="cn.simplelife.domain.Cat" scope="singleton"/>
  • 获取bean
package cn.simplelife.domain;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @ClassName CatTest
 * @Description
 * @Author simplelife
 * @Date 2022/11/18 9:55
 * @Version 1.0
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:cat.xml")
public class CatTest {

    @Autowired
    private Cat cat;
    
    @Autowired
    private Cat cat1;
    @Test
    public void getCat() {
        System.out.println(cat);
        System.out.println(cat1);
    }
}
  • 运行截图
    在这里插入图片描述

3、常用作用域——prototype

【特点】:

  • 对于每个请求该bean的请求都会创建一个新的bean对象
  • 存放位置并不是在Spring容器中,而是在内存中。主要是防止容器中的垃圾对象增多。

【使用演示】:

  • 配置bean
<bean id="cat"  class="cn.simplelife.domain.Cat" scope="prototype"/>
  • 获取bean
package cn.simplelife.domain;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @ClassName CatTest
 * @Description
 * @Author simplelife
 * @Date 2022/11/18 9:55
 * @Version 1.0
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:cat.xml")
public class CatTest {

    @Autowired
    private Cat cat;
    
    @Autowired
    private Cat cat1;
    @Test
    public void getCat() {
        System.out.println(cat);
        System.out.println(cat1);
    }
}
  • 运行截图

4、Spring中Bean的生命周期

Sping容器可以管理singleton的作用域的Bean的生命周期,在此作用域下,Spring能够精确的知道该Bean是何时创建的,何时初始化、何时销毁。
对于prototype的Bean实例,Spring只负责创建,并不会跟踪其生命周期。

1、图示Spring中Bean的生命周期

在这里插入图片描述

2、过程叙述

  1. 根据配置情况调用Bean的构造方法或工厂方法实例化Bean。
  2. 利用依赖注入完成Bean构造方法或工厂方法实例化Bean。
  3. 如果Bean实现了BeanNameAware接口,则Spring调用Bean的setBeanName(String var1)方法传入当前Bean的id值。
  4. 如果Bean实现了BeanFactoryAware接口,则Spring调用setBeanFactory(BeanFactory var1)方法,传入当前实例的引用。
  5. 如果Bean实现了ApplicationContextAware接口,则Spring调用setApplicationContext(ApplicationContext var1)方法,传入当前ApplicationContext实例的引用。
  6. 如果BeanPostProcessor和Bean关联,则Sping会调用postProcessBeforeInitialization()方法对Bean进行加工操作,SpringAOP就是利用它实现的。
  7. 如果Bean实现了InitializingBean接口,则Spring调用afterPropertiesSet()方法。
  8. 如果配置文件中配置了初始化方法,调用该初始化方法。
  9. . 如果BeanPostProcessor和Bean关联,则Sping会调用postProcessAfterInitialization()方法。
  10. 如果该bean是单例的就将bean存放在Spring的缓存池中,如果是多例的就交给调用者。
  11. 如果Bean实现了DisposableBean接口,则Spring会调用destroy()方法将Spring中的bean销毁。如果配置文件提供了销毁方法,调用配置文件中的销毁方法。

5、Bean的装配方式

1、基于XML的装配

Sping在实例化Bean的过程中,Spring首先会调用Bean的默认构造方法来实例化Bean对象,然后通过反射的方式调用Setter方法注入属性值。
因此这种方式注入必须满足两个条件:
1、提供一个无参的构造器。
2、提供setter方法。

  • 代码演示

【书写一个User类】

package cn.simplelife.domain;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import java.util.List;

/**
 * @ClassName User
 * @Description
 * @Author simplelife
 * @Date 2022/11/21 20:52
 * @Version 1.0
 */

@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    private String username;
    private Integer password;
    private List<String> list;
}

【书写配置文件】:

<?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="user" class="cn.simplelife.domain.User">
        <constructor-arg index="0" value="tom"/>
        <constructor-arg index="1" value="123"/>
        <constructor-arg index="2">
            <list>
                <value>eat</value>
                <value>sleep</value>
                <value>play</value>
            </list>
        </constructor-arg>
    </bean>

    <!--使用设置注入-->
    <bean id="user2" class="cn.simplelife.domain.User">
        <property name="username" value="杰瑞"/>
        <property name="password" value="123456"/>
        <property name="list">
            <list>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </list>
        </property>
    </bean>
</beans>

【书写测试类】:

package cn.simplelife.domain;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import static org.junit.Assert.*;

/**
 * @ClassName UserTest
 * @Description
 * @Author simplelife
 * @Date 2022/11/21 20:59
 * @Version 1.0
 */

public class UserTest {

    @Test
    public void getUserBean() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:user.xml");
        User user = applicationContext.getBean("user", User.class);
        System.out.println("user = " + user);
        User user2 = applicationContext.getBean("user2", User.class);
        System.out.println("user2 = " + user2);
    }
}

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

2、基于Annotation的装配

  • @Component该注解是一个泛化的概念,仅仅表示一个组件对象(Bean),可以作用在任何层次上。

  • @Repository该注解用于将数据访问层(Dao层)的类标识为Bean,即注解数据访问层Bean,其功能@Componet相同

  • @Service该注解用于标注一个业务逻辑组件类(Service层),其功能与@Component相同

  • @Controller该注解用于标注一个控制器组件类(SpringMVC的Controller),其功能与@Componet相同

  • @Autowired该注解可以对类成员变量、方法及构造方法进行标注,完成自动装配的功能。通过使用@Autowired来消除setter和getter方法。默认按照Bean的类型进行装配。

  • @Resource该注解与@Autowired的功能一样,区别在于该注解默认是按照名称来装配的,只有当找不到与名称匹配的Bean时才会按照类型来装配注入;而@Autowired默认按照Bean的类型进行装配,如果想按照名称来装配注入,则需要和@Qualifier注解一起使用。
    @Resource注解有两个属性—name和type。name属性指定Bean实例名称,即按照名称来装配注入;type属性指定Bean类型,即按照Bean的类型进行装配。

  • @Qualifier该注解与@Autowired注解配合使用。当@Autowired注解需要按照名称来装配注入时,需要和该注解一起使用,Bean的实例名称由@Qualifier注解的参数指定。

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

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

相关文章

基于深度学习的人脸表情识别的AR川剧变脸(一)

1、摘要 本项目分为两部分&#xff0c;第一个部分是人脸表情识别任务&#xff0c;第二部分是根据表情变化不同AR脸谱效果。 本文将第一部分&#xff0c;如何使用Keras训练一个人脸表情识别的卷积神经网络。 2、数据集处理 数据集我们使用FER2013PLUS人脸表情识别数据集&…

Spring Boot如何进行监控项目/SpringBoot Admin监控程序怎么用/监控程序可以监控到哪些信息

写在前面&#xff1a; 继续记录自己的SpringBoot学习之旅&#xff0c;这次是SpringBoot应用相关知识学习记录。若看不懂则建议先看前几篇博客&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 3.6 监控 3.6.1 意义 监控服务是否宕机监控服务运…

Hive数据定义语言-DDL-入门基础(含四个实践案例)

1. 概述 数据定义语言DDL&#xff0c;是SQL语言集中对数据库内部的对象结构进行创建、删除、修改等的操作语言&#xff0c;这些数据库对象包括database、table、view、index等。DDL核心语法由CREATE、ALTER与DROP三个所组成。DDL并不涉及表内部数据的操作。在某些上下文中&…

Docker ENV 与 ARG 详解

Docker Env 与 ARG 详解 Env 与ARG 差异可以用下面一张图来表示 ENV 使用说明 ENV 变量只能在容器运行时&#xff0c;生效 如果想在执行命令的时候&#xff0c;使用ENV变量需要在shell 模式下采用生效&#xff0c;比如我们运行spring boot 应用, 其中JAVA_OPTS 变量通过doc…

德国跨国汽车巨头大陆集团遭LockBit勒索软件组织攻击

据BleepingCompuer11月3日消息&#xff0c;知名勒索软件组织LockBit宣布他们对德国跨国汽车集团大陆集团&#xff08; Continental&#xff09; 发动了网络攻击。 LockBit声称&#xff0c;他们窃取了大陆集团系统中的一些数据&#xff0c;如果不能在11 月 4 日 15:45:36&#x…

Docker基本管理

一、Docker概述 1.什么是Docker 是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源&#xff1b; 是在Linux容器里运行应用的开源工具&#xff1b; 是一种轻量级的“虚拟机”&#xff1b; Docker的容器技术可以在一台主机上轻松为任何应用创建一个…

GC暂停时间过长——排查分析

告警 本次GC日志分析 2022-11-17T17:58:50.5180800: 1217960.132: [GC (Allocation Failure) 2022-11-17T17:58:50.5180800: 1217960.132: [ParNew: 1382400K->153600K(1382400K), 0. 5626158 secs] 3419277K->2410488K(4040704K), 0.5628652 secs] [Times: user1.07 sy…

vue3【toRef和toRefs--详】

通过下面的代码例子分析这两个作用及其用法&#xff1a; <template><h1>姓名&#xff1a;{{person.name}}</h1><h1>年龄&#xff1a;{{person.age}}</h1><h1>薪资&#xff1a;{{person.job.job1.salary}}w</h1><button click&qu…

springboot+vue网上零食购物商城网站java

零食商店管理系统是基于java编程语言&#xff0c;mysql数据库&#xff0c;springboot框架和idea开发工具开发&#xff0c;本系统主要分为用户和管理员两个角色&#xff0c;用户可以注册登陆查看零食资讯&#xff0c;零食分类&#xff0c;零食详情&#xff0c;收藏零食&#xff…

SwiftUI之iOS16中的三种SF字体的样式和使用

一、前言 在 iOS 16 中&#xff0c;Apple 引入了三种新的宽度样式字体到 SF 字体库&#xff1a;Compressed、Condensed、Expend&#xff0c;展示效果如下&#xff1a; 二、UIFont.Width Apple 引入了新的结构体 UIFont.Width&#xff0c;这代表了一种新的宽度样式。目前已有的…

纯前端 excel 导出

前端 excel 表格导出 我们习惯了后端去处理表格&#xff0c;直接接口返回 &#xff0c;那前端如何轻松的导出表格呢&#xff1f; 文章目录前端 excel 表格导出Ⅰ. 通过 js-xlsx ⭐⭐⭐⭐⭐安装① vue2 中使用② vue3 中使用③ react 中使用Ⅲ. 通过 vue-json-excel ⭐⭐安装使…

语音芯片KT148A的一线串口和KT148A的串口版本以及按键版本有什么区别

目录 一、简介 一线串口版本&#xff1a;应用场景是搭配MCU&#xff0c;KT148A受到MCU的控制&#xff0c;来播放语音 按键版本&#xff1a;KT148A有三个IO口&#xff0c;可以灵活配置为不同的触发播放形式 二、详细描述 2.1 一线串口版本和按键版本的硬件说明 一线串口版…

MeganeX VR原型体验:中心视觉清晰,畸变和IPD等细节待优化

前不久&#xff0c;松下子公司Shiftall在AWE Europe 2022上展示了MeganeX VR头显的新版原型设计&#xff0c;这个新版本采用和此前不同的外观设计&#xff0c;最大的特点是配备定制的SteamVR定位模块&#xff0c;可兼容Index VR手柄。相比于市面上一些主流PC VR头显&#xff0c…

SpringMVC之完成对前端传来的数据进行校验

假设您需要在网页上注册一个账号&#xff0c;其中有一项需要填入您的年龄&#xff0c;如果您不小心填了一个字符串&#xff0c;那么您的这个账号是不可能成功进行注册的&#xff0c;而本篇文章实现的功能就是&#xff0c;在后端将前端串传入的数据进行校验和识别。 第一步&…

yolo数据集的制作教程之海绵宝宝数据集的制作

yolo海绵宝宝数据集的制作 1、视频转图片 新建名为hm的文件目录&#xff0c;用于存放图片 代码如下&#xff1a; import cv2 from datetime import datetime def video_to_frames(path,savepath,m):video_cap cv2.VideoCapture()video_cap.open(path)fps video_cap.get(…

【云原生系列】第三讲:Knative 之 Serving

目录 序言 1. knative 1.1 发展历程 1.2 特点 2.Serving 2.1 基本介绍 2.2 支持类型 2.3 资源类型 2.3.1 service 2.3.2 Route 2.3.3 Configuration 2.3.4 Revision 2.4 Serving管理能力实现方式 2.4.1 四个 kubernetes Service 2.4.2 二个Deployment 2.4.3…

5G无线技术基础自学系列 | 5G下行物理信道和信号

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 5G空中接口下行的物理信道包括PB CH、P…

[附源码]计算机毕业设计JAVA基于web旅游网站的设计与实现

[附源码]计算机毕业设计JAVA基于web旅游网站的设计与实现 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; …

docker打包多架构镜像(manifest)

在docker仓库上&#xff0c;经常能看到这样的镜像 在一个”镜像“中&#xff0c;包含了三个架构的镜像 本质上&#xff0c;外部看到的这个镜像&#xff0c;其实不算是一个镜像&#xff0c;应该称它为镜像清单列表&#xff08;manifest list&#xff09; manifest是一个文件&a…

通过面积证明:两个函数相乘 / 相除的导数为什么长成这样?

参考视频 MIT 微积分课程 两个函数相乘的导数 (f(x)g(x))′f′(x)g(x)g′(x)f(x)(f(x)g(x))^{}f^{}(x)g(x)g^{}(x)f(x)(f(x)g(x))′f′(x)g(x)g′(x)f(x) 这是我们都非常熟悉的公式&#xff0c;熟悉到根本不知道是咋推出来的其实推导这个公式有两种方法&#xff0c;一种就是靠…