文章目录

      • 1.4 `Bean`之间的依赖处理
        • 1.4.1 `Bean`之间的依赖注入
        • 1.4.2 依赖注入的详细配置
        • 1.4.3 使用`depends-on`
        • 1.4.4 设置`Bean`的懒加载
        • 1.4.5 `Autowiring`自动注入的配置
        • 1.4.6 方法注入
          • Lookup Method 注入
        • 参考文献

1.4 Bean之间的依赖处理

​ 典型的企业应用程序不包含单个对象(或Spring术语中的bean)。即使是最简单的应用程序,也有一些对象可以协同工作,以呈现最终用户视为一致的应用程序。下一部分将说明如何从定义多个独立的Bean定义到实现对象协作以实现目标的完全实现的应用程序。

1.4.1 Bean之间的依赖注入

​ 依赖注入(DI)是一个过程,通过该过程,对象仅通过构造函数参数,工厂方法的参数或在构造或创建对象实例后在对象实例上设置的属性来定义其依赖关系(即,与它们一起工作的其他对象)。从工厂方法返回。然后,容器在创建bean时注入那些依赖项。从根本上讲,此过程是通过使用类的直接构造或服务定位器模式来控制bean自身依赖关系的实例化或位置的bean本身的逆过程(因此称为Control Inversion)。

DI存在两个主要变体:基于构造函数的依赖注入和基于Setter的依赖注入

  • 基于构造函数的依赖注入

    ​ 基于构造函数的DI是通过容器调用具有多个参数的构造函数来完成的,每个参数表示一个依赖项。调用带有特定参数的静态工厂方法来构造Bean几乎是等效的,并且本次讨论将构造函数和静态工厂方法的参数视为类似。以下示例显示了只能通过构造函数注入进行依赖项注入的类:

    public class TestBean {private TestBeanA testBeanA;public TestBean(TestBeanA testBeanA) {this.testBeanA = testBeanA;}public TestBeanA getTestBeanA() {return testBeanA;}
    }
    
    • 构造函数参数解析

    ​ 构造函数参数解析匹配通过使用参数的类型进行。如果Bean定义的构造函数参数中不存在潜在的歧义,则在实例化Bean时,在Bean定义中定义构造函数参数的顺序就是将这些参数提供给适当的构造函数的顺序。考虑以下类别:

    public class TestBean {private TestBeanA testBeanA;private TestBeanB testBeanB;public TestBean(TestBeanA testBeanA,TestBeanB testBeanB) {this.testBeanA = testBeanA;this.testBeanB = testBeanB;}// get/set ...
    }
    

    ​ 假设TestBeanATestBeanB类没有通过继承关联,则不存在潜在的歧义。因此,以下配置可以正常运行,并且您无需在<constructor-arg />元素中显式指定构造函数参数索引或类型(也就是说依赖的是引用类型,不是基本数据类型,这里String也划到基本数据类型处理,其实不属于基本数据类型)。

    <?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 https://www.springframework.org/schema/context/spring-context.xsd"><bean id="testBean"        class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBean"><constructor-arg ref="testBeanA"/><constructor-arg ref="testBeanB"/></bean><bean id="testBeanA" class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBeanA"></bean><bean id="testBeanB" class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBeanB"></bean>
    </beans>
    

    ​ 当引用另一个bean时,类型是已知的,并且可以发生匹配(与前面的示例一样)。当使用简单类型(例如<value> true </ value>)时,Spring无法确定值的类型(也就是说域是基本数据类型加String类型),因此在没有帮助的情况下无法按类型进行匹配。考虑以下类别:

    public class TestBean {private int age;private String name;public TestBean(int age, String name) {this.age = age;this.name = name;}// get/set ...
    }
    
    1. 构造函数参数类型匹配

      ​ 在上述情况下,如果通过使用type属性显式指定构造函数参数的类型,则容器可以使用简单类型的类型匹配。如下例所示:

      <?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 https://www.springframework.org/schema/context/spring-context.xsd"><bean id="testBean"      class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBean"><constructor-arg type="int" value="18"/><constructor-arg type="java.lang.String" value="张三"/></bean>
      </beans>
      
    2. 构造函数参数索引匹配

      ​ 您可以使用index属性来显式指定构造函数参数的索引(索引是从0开始的),如以下示例所示:

      <?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 https://www.springframework.org/schema/context/spring-context.xsd"><bean id="testBean"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBean"><constructor-arg index="0" value="18"/><constructor-arg index="1" value="张三"/></bean>
      </beans>
      

      ​ 除了解决多个简单值的歧义性之外,指定索引还可以解决歧义,其中构造函数具有两个相同类型的参数。

    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"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 https://www.springframework.org/schema/context/spring-context.xsd"><bean id="testBean"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBean"><constructor-arg name="age" value="18"/><constructor-arg name="name" value="张三"/></bean>
      </beans>
      

      4.使用@ConstructorProperties JDK注解显式命名构造函数参数与getter方法相对应,配合xml通过构造参数名称进行初始化bean(这个配置如上)。然后,样本类必须如下所示:

      public class TestBean {private int age;private String name;@ConstructorProperties({"age","name"})public TestBean(int age, String name) {this.age = age;this.name = name;}//get/set ...
      }
      
  • 基于Setter的依赖注入

    ​ 通过使用无参数构造函数或无参数静态工厂方法实例化您的bean之后,容器通过在bean上调用setter方法来完成基于setter的DI

    ​ 下面的示例显示只能通过使用纯setter注入来依赖注入的类。

    public class TestBean {private int age;private String name;public TestBean() {}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}
    }
    

    ApplicationContext支持它管理的bean基于构造函数和基于setter的DI。在已经通过构造函数方法注入了某些依赖项之后,它还支持基于setter的DI。您可以以BeanDefinition的形式配置依赖项,并与PropertyEditor实例结合使用,以将属性从一种格式转换为另一种格式。但是,大多数Spring用户并不直接(即以编程方式)使用这些类,而是使用XML bean定义,带注释的组件(即以@ Component,@ Controller等进行注释的类)或@Bean方法来处理这些类。基于Java的@Configuration类。然后将这些源在内部转换为BeanDefinition实例,并用于加载整个Spring IoC容器实例。

    使用构造函数注入依赖或基于setter注入依赖?由于可以混合使用基于构造函数的DI和基于setter的DI,因此将构造函数用于强制性依赖项并将setter方法或配置方法用于可选依赖性是一个很好的经验法则。注意,可以在setter方法上使用@Required批注,以使该属性成为必需的依赖项。但是,最好使用带有参数的程序验证的构造函数注入。Spring团队通常提倡构造函数注入,因为它使您可以将应用程序组件实现为不可变对象,并确保所需的依赖项不为null。此外,注入构造函数的组件始终以完全初始化的状态返回到客户端(调用)代码。附带说明一下,大量的构造函数自变量是一种不好的代码味,这表明该类可能承担了太多的职责,应进行重构以更好地解决关注点分离问题。Setter注入主要应仅用于可以在类中分配合理的默认值的可选依赖项。否则,必须在代码使用依赖项的任何地方执行非空检查。 setter注入的一个好处是,setter方法使该类的对象在以后可以重新配置或重新注入。因此,通过JMX MBean进行管理是用于setter注入的引人注目的用例。使用最适合特定班级的DI风格。有时,在处理您没有源代码的第三方类时,将为您做出选择。例如,如果第三方类未公开任何setter方法,则构造函数注入可能是DI的唯一可用形式。

  • 依赖注入解析过程

    ​ 容器执行bean依赖项解析,如下所示:

    • 使用描述所有bean的配置元数据创建和初始化ApplicationContext。可以通过XML,Java代码或注释指定配置元数据。

    • 对于每个bean,其依赖关系都以属性,构造函数参数或static-factory方法的参数的形式表示(如果使用它而不是普通的构造函数)。实际创建Bean时,会将这些依赖项提供给Bean

    • 每个属性或构造函数参数都是要设置的值的实际定义,或者是对容器中另一个bean的引用。

    • 作为值的每个属性或构造函数参数都将从其指定的格式转换为该属性或构造函数参数的实际类型。默认情况下,Spring可以将以字符串格式提供的值转换为所有内置类型,例如int,long,String,boolean等。

      ​ 在创建容器时,Spring容器会验证每个bean的配置。但是,在实际创建Bean之前,不会设置Bean属性本身。创建容器时,将创建具有单例作用域并设置为预先实例化(默认)的Bean。范围在Bean范围中定义。否则,仅在请求时才创建Bean。创建和分配bean的依赖关系及其依赖关系(依此类推)时,创建bean可能会导致创建一个bean图。请注意,这些依赖项之间的分辨率不匹配可能会在后期出现,即在第一次创建受影响的bean时。

      ​ 循环依赖

      ​ 如果主要使用构造函数注入,则可能会创建无法解决的循环依赖方案。例如:A类通过构造函数注入需要B类的实例,而B类通过构造函数注入需要A类的实例。如果您为将类A和B相互注入而配置了bean,则Spring IoC容器会在运行时检测到此循环引用,并抛出BeanCurrentlyInCreationException。一种可能的解决方案是编辑某些类的源代码,这些类的源代码由设置者而不是构造函数来配置。或者,避免构造函数注入,而仅使用setter注入。换句话说,尽管不建议这样做,但是您可以使用setter注入配置循环依赖关系,与典型情况(没有循环依赖项)不同,bean A和bean B之间的循环依赖关系迫使其中一个bean在完全初始化之前被注入另一个bean(经典的“养鸡和鸡蛋”场景)。

      ​ 通常,您可以信任Spring做正确的事。它在容器加载时检测配置问题,例如对不存在的Bean的引用和循环依赖项。在实际创建Bean时,Spring设置属性并尽可能晚地解决依赖关系。这意味着,如果创建对象或其依赖项之一有问题,则正确加载了Spring的容器以后可以在您请求对象时生成异常-例如,由于缺少或无效,Bean引发异常属性。这可能会延迟某些配置问题的可见性,这就是为什么默认情况下ApplicationContext实现会预先实例化单例bean的原因。在实际需要这些bean之前需要花一些前期时间和内存来创建它们,您会在创建ApplicationContext时发现配置问题,而不是稍后。您仍然可以覆盖此默认行为,以便单例bean延迟初始化,而不是预先实例化。

      ​ 如果不存在循环依赖关系,则在将一个或多个协作Bean注入到从属Bean中时,每个协作Bean都将被完全配置,然后再注入到从属Bean中。这意味着,如果bean A依赖于bean B,则Spring IoC容器会在对bean A调用setter方法之前完全配置beanB。换句话说,bean被实例化(如果不是预先实例化的singleton)。 ),设置其依赖项,并调用相关的生命周期方法(例如已配置的init方法或InitializingBean回调方法)。

1.4.2 依赖注入的详细配置

​ 可以将bean属性和构造函数参数定义为对其他托管bean(协作者)的引用或内联定义的值。 Spring的基于 XML的配置元数据为此目的在其<property /><constructor-arg />元素中支持子元素类型。

  • 直接填写具体值(字符串,数字等)

    <property />元素的value属性将属性或构造函数参数指定为人类可读的字符串表示形式。 Spring的转换服务用于将这些值从字符串转换为属性或参数的实际类型。以下示例显示了设置的各种值:

    <?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 https://www.springframework.org/schema/context/spring-context.xsd"><bean id="testBean"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBean"><property name="name" value="李四"/><property name="age" value="18"/></bean>
    </beans>
    

    以下示例使用p-namespace进行更简洁的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"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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><bean id="testBean"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBean"p:name="李四"p:age="18"><!--<property name="name" value="李四"/>--><!--<property name="age" value="18"/>--></bean>
    </beans>
    

    前面的XML更简洁。但是,除非在创建bean定义时使用支持自动属性完成的IDE(例如IntelliJ IDEAEclipseSpring Tools),否则错字是在运行时而不是设计时发现的。强烈建议您使用此类IDE帮助。

    您还可以配置java.util.Properties实例,如下所示:

    <bean id="mappings"class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"><!-- typed as a java.util.Properties --><property name="properties"><value>jdbc.driver.className=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mydb</value></property>
    </bean>
    

    Spring容器通过使用JavaBeans PropertyEditor机制将<value />元素内的文本转换为java.util.Properties实例。这是一个很好的捷径,并且是Spring团队偏爱使用嵌套的<value />元素而不是value属性样式的几个地方之一。

    • idref元素 使用

      idref元素只是一种防错方法,可以将容器中另一个beanid(字符串值-不是引用)传递给<constructor-arg /><property />元素。以下示例显示了如何使用它:

      <bean id="theTargetBean" class="..."/><bean id="theClientBean" class="..."><property name="targetName"><idref bean="theTargetBean"/></property>
      </bean>
      

      前面的bean定义片段(在运行时)与下面的片段完全等效:

      <bean id="theTargetBean" class="..." /><bean id="client" class="..."><property name="targetName" value="theTargetBean"/>
      </bean>
      

      第一种形式优于第二种形式,因为使用idref标记可使容器在部署时验证所引用的名为bean的实际存在。在第二个变体中,不对传递给客户端bean的targetName属性的值执行验证。拼写错误仅在实际实例化客户端bean时发现(最有可能导致致命的结果)。如果客户端Bean是原型Bean,则可能在部署容器很久之后才发现此错字和所产生的异常。

      在4.0 Bean XSD中不再支持idref元素上的local属性,因为它不再提供常规Bean引用上的值。升级到4.0模式时,将现有的idref local引用更改为idref bean。

      <idref />元素带来价值的一个常见地方(至少在Spring 2.0之前的版本中)是在ProxyFactoryBean bean定义中配置AOP拦截器。在指定拦截器名称时使用<idref />元素可防止您拼写错误的拦截器ID。

  • 对其他Bean的引用ref

    ref元素是或定义元素内的最后一个元素。在这里,您将bean的指定属性的值设置为对容器管理的另一个bean(协作者)的引用。引用的bean是要设置其属性的bean的依赖关系,并且在设置属性之前根据需要对其进行初始化。 (如果协作者是单例bean,则它可能已经由容器初始化了。)所有引用最终都是对另一个对象的引用。作用域和验证取决于您是通过bean还是父属性指定另一个对象的ID或名称。

    通过标记的bean属性指定目标bean是最通用的形式,并且允许创建对同一容器或父容器中任何bean的引用,而不管它是否在同一XML文件中。 bean属性的值可以与目标bean的id属性相同,也可以与目标bean的name属性中的值之一相同。下面的示例演示如何使用ref元素:

    <ref bean="someBean"/>
    

    通过parent属性指定目标Bean将创建对当前容器的父容器中的Bean的引用。父属性的值可以与目标Bean的id属性或目标Bean的名称属性中的值之一相同。目标Bean必须位于当前容器的父容器中。主要在具有容器层次结构并且要使用与父bean名称相同的代理将现有bean包装在父容器中时,才应使用此bean参考变量。以下清单对显示了如何使用parent属性:

    <!-- in the parent context -->
    <bean id="accountService" class="com.something.SimpleAccountService"><!-- insert dependencies as required as here -->
    </bean>
    
    <!-- in the child (descendant) context -->
    <bean id="accountService" <!-- bean name is the same as the parent bean -->class="org.springframework.aop.framework.ProxyFactoryBean"><property name="target"><ref parent="accountService"/> <!-- notice how we refer to the parent bean --></property><!-- insert other configuration and dependencies as required here -->
    </bean>
    

    ref元素的local属性在4.0 Bean XSD中不再受支持,因为它不再提供常规Bean引用上的值。升级到4.0模式时,将现有的reflocal引用更改为ref bean。

  • 内部Bean的参数注入

    <property /><constructor-arg />元素内的<bean />元素定义了一个内部bean,如以下示例所示:

    <bean id="outer" class="..."><!-- instead of using a reference to a target bean, simply define the target bean inline --><property name="target"><bean class="com.example.Person"> <!-- this is the inner bean --><property name="name" value="Fiona Apple"/><property name="age" value="25"/></bean></property>
    </bean>
    

    内部bean定义不需要定义的ID或名称。如果指定,则容器不使用该值作为标识符。容器在创建时也将忽略作用域标志,因为内部Bean始终是匿名的,并且始终与外部Bean一起创建。不可能独立地访问内部bean或将其注入到协作bean中而不是封装到封闭bean中。

    作为一个极端的例子,可以从自定义范围接收破坏回调,例如对于单例bean中包含的请求范围内的bean。内部bean实例的创建与其包含的bean绑定在一起,但是销毁回调使它可以参与请求范围的生命周期。这不是常见的情况。内部bean通常只共享其包含bean的作用域。

  • 注入集合类数据

    <list />,<set />,<map />和<props />元素分别设置Java集合类型的List,Set,Map和Properties的属性和参数。以下示例显示了如何使用它们:

    <bean id="moreComplexObject" class="example.ComplexObject"><!-- results in a setAdminEmails(java.util.Properties) call --><property name="adminEmails"><props><prop key="administrator">administrator@example.org</prop><prop key="support">support@example.org</prop><prop key="development">development@example.org</prop></props></property><!-- results in a setSomeList(java.util.List) call --><property name="someList"><list><value>a list element followed by a reference</value><ref bean="myDataSource" /></list></property><!-- results in a setSomeMap(java.util.Map) call --><property name="someMap"><map><entry key="an entry" value="just some string"/><entry key ="a ref" value-ref="myDataSource"/></map></property><!-- results in a setSomeSet(java.util.Set) call --><property name="someSet"><set><value>just some string</value><ref bean="myDataSource" /></set></property>
    </bean>
    

    映射键或值的值或设置值也可以是以下任意元素:

    bean | ref | idref | list | set | map | props | value | null
    
    • 集合合并

      Spring容器还支持合并集合。应用程序开发人员可以定义父<list />,<map />,<set />或<props />元素,并具有子<list />,<map />,<set />或<props />元素。从父集合继承并覆盖值。也就是说,子集合的值是合并父集合和子集合的元素的结果,子集合的元素会覆盖父集合中指定的值。

      下面的示例演示了集合合并:

      <beans><bean id="parent" abstract="true" class="example.ComplexObject"><property name="adminEmails"><props><prop key="administrator">administrator@example.com</prop><prop key="support">support@example.com</prop></props></property></bean><bean id="child" parent="parent"><property name="adminEmails"><!-- the merge is specified on the child collection definition --><props merge="true"><prop key="sales">sales@example.com</prop><prop key="support">support@example.co.uk</prop></props></property></bean>
      <beans>
      

      注意子bean定义的adminEmails属性的<props />元素上使用merge = true属性。当子bean由容器解析并实例化后,生成的实例具有adminEmails Properties集合,其中包含将孩子的adminEmails集合与父对象的adminEmails集合合并的结果。以下清单显示了结果:

      administrator=administrator@example.com
      sales=sales@example.com
      support=support@example.co.uk
      

      子属性集合的值集继承了父<props />的所有属性元素,而支持值的子值覆盖了父集合中的值。

      此合并行为类似地适用于<list />,<map />和<set />集合类型。在<list />元素的特定情况下,将维护与List集合类型关联的语义(即,值的有序集合的概念)。父级的值先于子级列表的所有值。对于“map”,“Set”和“Properties”集合类型,不存在任何排序。因此,对于容器内部使用的关联Map,Set和Properties实现类型基础的集合类型,没有任何排序语义有效。

    • 集合合并的局限性

      您不能合并不同的集合类型(例如地图和列表)。如果尝试这样做,则会引发适当的Exception。必须在下面的继承的子定义中指定merge属性。在父集合定义上指定merge属性是多余的,不会导致所需的合并。

    • 强类型集合

      随着Java 5中泛型类型的引入,您可以使用强类型集合。也就是说,可以声明一个Collection类型,使其只能包含(例如)String元素。如果使用Spring将强类型的Collection依赖注入到Bean中,则可以利用Spring的类型转换支持,以便在将强类型的Collection实例的元素添加到Bean中之前,先将其转换为适当的类型。采集。以下Java类和bean定义显示了如何执行此操作:

      public class SomeClass {private Map<String, Float> accounts;public void setAccounts(Map<String, Float> accounts) {this.accounts = accounts;}
      }
      
      <beans><bean id="something" class="x.y.SomeClass"><property name="accounts"><map><entry key="one" value="9.99"/><entry key="two" value="2.75"/><entry key="six" value="3.99"/></map></property></bean>
      </beans>
      

      当准备注入某物bean的accounts属性时,可以通过反射获得有关强类型Map <String,Float>的元素类型的泛型信息。因此,Spring的类型转换基础结构将各种值元素识别为Float类型,并将字符串值(9.99、2.75和3.99)转换为实际的Float类型。

  • 注入NULL和空的字符串

    Spring将属性等的空参数视为空String。以下基于XML的配置元数据代码段将email属性设置为空的String值(“”)。

    <bean class="ExampleBean"><property name="email" value=""/>
    </bean>
    

    前面的示例等效于以下Java代码:

    exampleBean.setEmail("");
    

    <null />元素处理空值。以下清单显示了一个示例:

    <bean class="ExampleBean"><property name="email"><null/></property>
    </bean>
    

    The preceding configuration is equivalent to the following Java code:

    exampleBean.setEmail(null);
    
  • 使用P:的命名空间代替properties标签

    通过p-namespace,您可以使用bean元素的属性(而不是嵌套的元素)来描述协作bean的属性值,或同时使用这两者。

    Spring支持带有名称空间的可扩展配置格式,这些名称空间基于XML Schema定义。但是,p命名空间未在XSD文件中定义,仅存在于Spring的核心中。

    以下示例显示了两个XML代码段(第一个使用标准XML格式,第二个使用p-命名空间),它们可以解析为相同的结果:

    <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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean name="classic" class="com.example.ExampleBean"><property name="email" value="someone@somewhere.com"/></bean><bean name="p-namespace" class="com.example.ExampleBean"p:email="someone@somewhere.com"/>
    </beans>
    

    该示例在p命名空间中的bean定义中显示了一个名为email的属性。这告诉Spring包含一个属性声明。如前所述,p名称空间没有架构定义,因此您可以将属性的名称设置为属性名称。

    下一个示例包括另外两个bean定义,它们都引用了另一个bean:

    <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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean name="john-classic" class="com.example.Person"><property name="name" value="John Doe"/><property name="spouse" ref="jane"/></bean><bean name="john-modern"class="com.example.Person"p:name="John Doe"p:spouse-ref="jane"/><bean name="jane" class="com.example.Person"><property name="name" value="Jane Doe"/></bean>
    </beans>
    

    此示例不仅包括使用p-namespace的属性值,而且还使用特殊格式来声明属性引用。第一个bean定义使用<property name =“ spouse” ref =“ jane” />创建从bean john到bean jane的引用,而第二个bean定义使用p:spouse-ref =“ jane”作为属性完全一样的东西。在这种情况下,配偶是属性名称,而-ref部分指示这不是一个直接值,而是对另一个bean的引用。

    p命名空间不如标准XML格式灵活。例如,用于声明属性引用的格式与以Ref结尾的属性发生冲突,而标准XML格式则没有。建议您仔细选择方法,并与团队成员进行交流,以避免同时使用这三种方法生成XML文档。

  • 使用c:的命名空间代替construct-arg标签

    与带有p命名空间的XML快捷方式类似,Spring 3.1中引入的c命名空间允许使用内联属性来配置构造函数参数,而不是嵌套的builder-arg元素。

    以下示例使用c:命名空间执行与基于构造函数的依赖注入相同的操作:

    <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="beanTwo" class="x.y.ThingTwo"/><bean id="beanThree" class="x.y.ThingThree"/><!-- traditional declaration with optional argument names --><bean id="beanOne" class="x.y.ThingOne"><constructor-arg name="thingTwo" ref="beanTwo"/><constructor-arg name="thingThree" ref="beanThree"/><constructor-arg name="email" value="something@somewhere.com"/></bean><!-- c-namespace declaration with argument names --><bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"c:thingThree-ref="beanThree" c:email="something@somewhere.com"/></beans>
    

    c:命名空间使用与p:相同的约定(bean引用为尾随-ref)以按名称设置构造函数参数。同样,即使未在XSD模式中定义它(也存在于Spring内核中),也需要在XML文件中声明它。

    对于极少数情况下无法使用构造函数自变量名称的情况(通常,如果字节码是在没有调试信息的情况下编译的),则可以对参数索引使用后备,如下所示:

    <!-- c-namespace index declaration -->
    <bean id="beanOne" class="x.y.ThingOne" c:_0-ref="beanTwo" c:_1-ref="beanThree"c:_2="something@somewhere.com"/>
    

    由于XML语法的原因,索引符号要求前导_的存在,因为XML属性名称不能以数字开头(即使某些IDE允许)。相应的索引符号也可用于元素,但不常用,因为在那里的普通声明顺序就足够了。

    实际上,构造函数解析机制在匹配参数方面非常有效,因此,除非您确实需要,否则建议在整个配置过程中使用名称表示法。

  • 属性是引用Bean给引用Bean中的属性赋值

    设置bean属性时,可以使用复合属性名称或嵌套属性名称,只要路径中除最终属性名称以外的所有组件都不为空即可。考虑以下bean定义:

    <bean id="something" class="things.ThingOne"><property name="fred.bob.sammy" value="123" />
    </bean>
    

    Something bean具有fred属性,该属性具有bob属性,该属性具有sammy属性,并且最终的sammy属性被设置为123的值。为了使其正常工作,something的fred属性和bob属性构造bean之后,fred不能为null。否则,将引发NullPointerException。

1.4.3 使用depends-on

​ 如果一个bean是另一个bean的依赖项,则通常意味着将一个bean设置为另一个bean的属性。通常,您可以使用基于XML的配置元数据中的元素来完成此操作。但是,有时bean之间的依赖性不太直接。一个示例是何时需要触发类中的静态初始值设定项,例如用于数据库驱动程序注册。依赖属性可以显式地强制初始化一个或多个使用该元素的bean之前的bean。下面的示例使用depends-on属性来表示对单个bean的依赖关系:

<?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"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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><bean id="testBean"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBean"depends-on="testBeanA"><property name="testBeanA" ref="testBeanA"/></bean><bean id="testBeanA"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBeanA"/>
</beans>

​ 要表达对多个bean的依赖关系,请提供一个bean名称列表作为Depends-on属性的值(逗号,空格和分号是有效的分隔符):

<?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"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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><bean id="testBean"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBean"depends-on="testBeanA,testBeanB"><property name="testBeanA" ref="testBeanA"/></bean><bean id="testBeanA"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBeanA"/><bean id="testBeanB"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBeanB"/>
</beans>

​ Depends-on属性既可以指定初始化时间依赖性,也可以仅在单例bean的情况下指定相应的销毁时间依赖性。与给定bean定义依赖关系的从属bean首先被销毁,然后再销毁给定bean本身。因此,依赖也可以控制关闭顺序。

1.4.4 设置Bean的懒加载

​ 默认情况下,作为初始化过程的一部分,ApplicationContext实现会急于创建和配置所有单例bean。通常,这种预初始化是可取的,因为与数小时甚至数天后相比,会立即发现配置或周围环境中的错误。如果您不希望这种行为,则可以通过将bean定义标记为延迟初始化来防止单例bean的预实例化。延迟初始化的bean告诉IoC容器在首次请求时(而不是在启动时)创建一个bean实例。

​ 在XML中,此行为由元素上的lazy-init属性控制,如以下示例所示:

<?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"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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><bean id="testBean"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBean"depends-on="testBeanA"><property name="testBeanA" ref="testBeanA"/></bean><bean id="testBeanA"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBeanA"lazy-init="true"/>
</beans>

​ 当前面的配置被ApplicationContext占用时,在ApplicationContext启动时不会急于预先实例化懒惰的testBean,而是会急切地预先实例化testBeanA。

​ 但是,当延迟初始化的bean是未延迟初始化的单例bean的依赖项时,ApplicationContext会在启动时创建延迟初始化的bean,因为它必须满足单例的依赖关系。延迟初始化的bean被注入到其他未延迟初始化的单例bean中。

​ 您还可以通过使用元素上的default-lazy-init属性在容器级别控制延迟初始化,如以下示例所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true" xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!-- .... -->
</beans>

1.4.5 Autowiring自动注入的配置

​ Spring容器可以自动装配协作bean之间的关系。您可以通过检查ApplicationContext的内容,让Spring为您的bean自动解决协作者(其他bean)。自动装配具有以下优点:

1. 自动装配可以大大减少指定属性或构造函数参数的需要。2. 随着对象的发展,自动装配可以更新配置。例如,如果需要将依赖项添加到类中,则无需修改配置即可自动满足该依赖项。因此,自动装配在开发过程中尤其有用,而不必担心在代码库变得更稳定时切换到显式接线的选择。

使用基于XML的配置元数据时,可以使用元素的autowire属性为bean定义指定自动装配模式。自动装配功能具有四种模式。您可以为每个bean指定自动装配,因此可以选择要自动装配的装配。下表描述了四种自动装配模式:

自动装配模式解释
no(默认)无自动装配。 Bean引用必须由ref元素定义。对于较大的部署,建议不要更改默认设置,因为明确指定协作者可以提供更好的控制和清晰度。在某种程度上,它记录了系统的结构。
byName按属性名称自动布线。 Spring查找与需要自动装配的属性同名的bean。例如,如果一个bean定义被设置为按名称自动装配,并且包含一个master属性(即,它具有setMaster(…)方法),那么Spring将查找一个名为master的bean定义并使用它来设置该属性。
byType如果容器中恰好存在一个属性类型的bean,则使该属性自动连接。如果存在多个,则将引发致命异常,这表明您可能无法对该bean使用byType自动装配。如果没有匹配的bean,则什么也不会发生(未设置该属性)。
constructor与byType类似,但适用于构造函数参数。如果容器中不存在构造函数参数类型的一个bean,则将引发致命错误。

​ 使用byType或构造函数自动装配模式,您可以连接数组和类型化的集合。在这种情况下,将提供容器中与预期类型匹配的所有自动装配候选,以满足相关性。如果期望的键类型为String,则可以自动装配强类型Map实例。自动关联的Map实例的值包括与期望类型匹配的所有bean实例,并且Map实例的键包含相应的bean名称。

  • 自动装配的局限性和缺点

    当在项目中一致使用自动装配时,自动装配效果最佳。如果通常不使用自动装配,则可能使开发人员仅使用自动装配来连接一个或两个bean定义感到困惑。

    考虑自动装配的局限性和缺点:

    1. 属性和构造器参数设置中的显式依赖关系始终会覆盖自动装配。您不能自动连接简单属性,例如基元,字符串和类(以及此类简单属性的数组)。此限制是设计使然。
    2. 自动装配不如显式接线精确。尽管如前所述,Spring还是谨慎避免在可能产生意外结果的歧义情况下进行猜测。 Spring管理的对象之间的关系不再明确记录。
    3. 接线信息可能不适用于可能从Spring容器生成文档的工具。
    4. 容器内的多个bean定义可能与要自动装配的setter方法或构造函数参数指定的类型匹配。对于数组,集合或Map实例,这不一定是问题。但是,对于需要单个值的依赖项,不会任意解决此歧义。如果没有唯一的bean定义可用,则会引发异常。

    在后一种情况下,您有几种选择:

    1. 放弃自动布线,转而使用明确的布线
    2. 通过将其bean的autowire-candidate属性设置为false,避免自动装配bean定义
    3. 通过将其元素的primary属性设置为true,将单个bean定义指定为主要候选对象。
    4. 如基于注释的容器配置中所述,通过基于注释的配置实现更细粒度的控件。
  • 从自动装配中排除Bean

    在每个bean的基础上,您可以从自动装配中排除一个bean。使用Spring的XML格式,将元素的autowire-candidate属性设置为false。容器使该特定的bean定义对自动装配基础结构不可用(包括注释样式配置,如@Autowired)。

    autowire-candidate属性设计为仅影响基于类型的自动装配。它不会影响按名称的显式引用,即使未将指定的Bean标记为自动装配候选,该名称也可得到解析。因此,如果名称匹配,按名称自动装配仍会注入Bean。

    您还可以基于与Bean名称的模式匹配来限制自动装配候选。顶级元素在其default-autowire-candidates属性中接受一个或多个模式。例如,要将自动装配候选状态限制为名称以Repository结尾的任何bean,请提供* Repository值。要提供多种模式,请在以逗号分隔的列表中定义它们。 Bean定义的autowire-candidate属性的显式值true或false始终优先。对于此类bean,模式匹配规则不适用。

    这些技术对于您不希望通过自动装配将其注入其他bean的bean非常有用。这并不意味着排除的bean本身不能使用自动装配进行配置。相反,bean本身不是自动装配其他bean的候选对象。

1.4.6 方法注入

​ 在大多数应用场景中,容器中的大多数bean是单例的。当一个单例Bean需要与另一个单例Bean协作或一个非单例Bean需要与另一个非单例Bean协作时,通常可以通过将一个Bean定义为另一个Bean的属性来处理依赖关系。当bean的生命周期不同时会出现问题。假设单例bean A需要使用非单例(原型)bean B,也许在A的每个方法调用上都使用。容器仅创建一次单例bean A,因此只有一次机会来设置属性。每次需要一个容器时,容器都无法为bean A提供一个新的bean B实例。

​ 解决方案是放弃某些控制反转。您可以通过实现ApplicationContextAware接口,并通过对容器进行getBean(“ B”)调用来使bean A知道该容器,以便每次bean A需要它时都请求一个(通常是新的)bean B实例。以下示例显示了此方法:

public class TestBean implements ApplicationContextAware {private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {this.applicationContext = applicationContext;}public void testMethodIn(){TestBeanA testBeanA = createdTestBeanA();System.out.println(testBeanA.getName());}public TestBeanA createdTestBeanA(){return this.applicationContext.getBean("testBeanA",TestBeanA.class);}
}

前面的内容是不理想的,因为业务代码知道并耦合到Spring框架。方法注入是Spring IoC容器的一项高级功能,使您可以干净地处理此用例。

  • Lookup Method 注入

    查找方法注入是容器重写容器管理的Bean上的方法并返回容器中另一个命名Bean的查找结果的能力。查找通常涉及原型bean,Spring框架通过使用CGLIB库中的字节码生成来动态生成覆盖该方法的子类,从而实现此方法注入。

    • 为了使此动态子类起作用,Spring Bean容器子类的类也不能是final,而要覆盖的方法也不能是final。
    • 对具有抽象方法的类进行单元测试需要您自己对该类进行子类化,并提供该抽象方法的存根实现。
    • 组件扫描也需要具体的方法,这需要具体的类。
    • 另一个关键限制是,查找方法不适用于工厂方法,尤其不适用于配置类中的@Bean方法,因为在这种情况下,容器不负责创建实例,因此无法创建运行时生成的动态子类。

    对于前面的代码片段中的TestBean类,Spring容器动态地覆盖createdTestBeanA()方法的实现。如重做的示例所示,TestBean类没有任何Spring依赖项:

    public abstract class TestBean {public void testMethodIn(){TestBeanA testBeanA = createdTestBeanA();System.out.println(testBeanA.getName());}protected abstract TestBeanA createdTestBeanA();
    }
    

​ 在包含要注入的方法的客户端类(在本例中为TestBean)中,要注入的方法需要以下形式的签名:

<public|protected> [abstract] <return-type> theMethodName(no-arguments);

如果该方法是抽象的,则动态生成的子类将实现该方法。否则,动态生成的子类将覆盖原始类中定义的具体方法。考虑以下示例:

<?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"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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><bean id="testBean"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBean"depends-on="testBeanA" ><lookup-method name="createdTestBeanA" bean="testBeanA"/></bean><bean id="testBeanA"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBeanA"lazy-init="true" scope="prototype"/><bean id="testBeanB"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBeanB"lazy-init="true"/>
</beans>

每当需要新的testBeanA bean实例时,标识为testBean的bean就会调用其自己的createTestBeanA()方法。如果确实需要将testBeanA bean部署为原型,则必须小心。如果是单例,则每次都返回testBeanA bean的相同实例。

另外,在基于注释的组件模型中,您可以通过@Lookup注释声明一个查找方法,如以下示例所示:

public abstract class TestBean {public void testMethodIn(){TestBeanA testBeanA = createdTestBeanA();System.out.println(testBeanA.getName());}@Lookup("testBeanA")protected abstract TestBeanA createdTestBeanA();
}

或者,更惯用的是,您可以依赖于目标bean根据lookup方法的声明的返回类型来解析:

public abstract class TestBean {public void testMethodIn(){TestBeanA testBeanA = createdTestBeanA();System.out.println(testBeanA.getName());}@Lookupprotected abstract TestBeanA createdTestBeanA();
}

请注意,通常应使用具体的存根实现声明此类带注释的查找方法,以使其与Spring的组件扫描规则(默认情况下抽象类会被忽略)兼容。此限制不适用于显式注册或显式导入的Bean类。

  • 任意方法替换

    与查找方法注入相比,方法注入的一种不太有用的形式是能够用另一种方法实现替换托管bean中的任意方法。

    借助基于XML的配置元数据,您可以使用replaced-method元素将现有的方法实现替换为已部署的Bean。考虑以下类,该类具有一个我们要覆盖的名为testMethodIn的方法:

    public class TestBean {public TestBeanA testMethodIn(String string){return null;}public void test(){System.out.println(testMethodIn("abc").getName());}
    }
    

​ 实现org.springframework.beans.factory.support.MethodReplacer接口的类提供了新的方法定义,如以下示例所示:

public class TestBeanA implements MethodReplacer {private String name = "testBeanA";public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic Object reimplement(Object obj, Method method, Object[] args) throws Throwable {String arg = (String) args[0];return this;}
}

用于部署原始类并指定方法覆盖的Bean定义类似于以下示例:

<?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"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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><bean id="testBean"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBean"depends-on="testBeanA" ><replaced-method name="testMethodIn" replacer="testBeanA"/></bean><bean id="testBeanA"class="springioc.coretechnologic.ioc.annotationbasecontainerconfig.TestBeanA"lazy-init="true" scope="prototype"/></beans>

您可以在元素内使用一个或多个元素来指示要覆盖的方法的方法签名。仅当方法重载且类中存在多个变体时,才需要对参数签名。为了方便起见,参数的类型字符串可以是完全限定类型名称的子字符串。例如,以下所有都匹配java.lang.String:

java.lang.String
String
Str

因为参数的数量通常足以区分每个可能的选择,所以通过让您仅键入与参数类型匹配的最短字符串,此快捷方式可以节省很多输入。

参考文献

【https://docs.spring.io/spring-framework/docs/current/reference/html/core.html】【1.4. Dependencies】

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 想要顺利通过阿里云云计算ACP专业认证考试 这些点你需要牢记

    想要顺利通过阿里云云计算ACP专业认证考试 这些点你需要牢记 阿里云云计算ACP专业认证(Alibaba Cloud Certified Professional,ACP)是面向使用阿里云云计算产品的架构、开发、运维类人员的专业技术认证。 阿里云acp考试报名官方网址&#xff1a; 为什么要参加阿里云ACP认证…...

    2024/3/23 1:35:09
  2. C#l零基础学习传智播客(24)P115-P118继承,继承的练习,关键字new隐藏父类的成员,

    P115-09-继承 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _08继承 {class Program{static void Main(string[] args){//Student s new Student();//Driver d new Driver();Student s …...

    2024/3/26 18:12:07
  3. Unity自定义包CustomPackages如何相互引用?

    虽然我很偶然地发现了如何引用&#xff0c;但是我还是相信很多人找不到&#xff0c;所以阳光普照下。 引用之后&#xff0c;引用的GUID是记录在package.asmdef中的 {"name": "unknown.tools.q-hierarchy","references": ["GUID:53cc36eb57…...

    2024/4/23 21:20:55
  4. 项目中如何管理人员?可以遵循这11个原则

    要成功完成一个项目&#xff0c;项目团队应选择和遵循有效的方法。更重要的是&#xff0c;项目团队应留意项目人员管理方面。在项目管理中&#xff0c;对于项目团队和成员的管理和控制至关重要&#xff0c;本文将重点介绍用于项目人员管理的11个原则。 1.为项目工作指定合适的项…...

    2024/4/24 20:59:03
  5. 开发笔记| Systemd实现STM32MP1的多种网络通信管理(上)

    本次例程为米尔原创实操开发笔记&#xff0c;如需转载请提前联系米尔获取转载授权。 systemd-networkd 是一个管理网络服务程序&#xff0c;可以用来管理以太网&#xff0c;WIFI&#xff0c;网桥&#xff0c; EC20 等模块的网络优先级&#xff0c;以及连接情况。配合 systemd-r…...

    2024/4/24 20:59:03
  6. 计算机软件著作权登记哪家比较好?阿里云计算机软件著作权登记好吗?

    计算机软件著作权登记哪家比较好?阿里云计算机软件著作权登记好吗? 最近有很多朋友咨询计算机软件著作权登记哪家比较好?阿里云计算机软件著作权登记好吗?小编赵一八笔记特意整理相关知识&#xff0c;希望能够帮到大家。 阿里云计算机软件著作权登记&#xff0c;无需纸质…...

    2024/4/24 20:59:03
  7. linux_分析系统情况

    简介 如果通过内存 CPU 磁盘 网络 指标分析系统运行情况 什么是QPS/TPS 本节原文地址&#xff1a;https://blog.csdn.net/u010889616/article/details/83245695 QPS&#xff1a;Queries Per Second意思是“每秒查询率”&#xff0c;是一台服务器每秒能够相应的查询次数&#xf…...

    2024/4/24 20:59:02
  8. 为何Filecoin上线之后市场依旧在观望?

    Filecoin在10月15日正式上线之后&#xff0c;价格一度飙升至170美元&#xff0c;而后迅速滑落至20美元上下&#xff0c;直到现在也仅有30多美元&#xff0c;是何原因导致了它一直无人问津却还是服务商们的“香饽饽”呢&#xff1f; 我们可以先了解一下Filecoin的整体逻辑&…...

    2024/4/24 20:58:58
  9. linux_获取分析java内存信息

    JMAP获取java进程的内存镜像 Jmap的安装 jmap是jdk环境中集成的&#xff0c;只要配置了Java环境就可以使用&#xff0c;没有配置环境变量的话 需要指定绝对路径 可以从Oracle官网上找到jdk的安装包下载下来后&#xff0c;直接解压即可 Jmap获取内存镜像 #jps 获取Java进程的…...

    2024/4/24 20:58:57
  10. java8新特性之lambda表达式

    Lambda 允许把函数作为一个方法的参数&#xff08;函数作为参数传递进方法中&#xff09;。使用 Lambda 表达式可以使代码变的更加简洁紧凑。 一、语法 lambda 表达式的语法格式如下&#xff1a; (parameters) -> expression 或 (parameters) ->{ statements; }以下是…...

    2024/4/24 20:59:01
  11. 使用搜索引擎在指定网站内搜索指定内容

    转载于:https://my.oschina.net/ZhenyuanLiu/blog/1819737...

    2024/4/25 8:06:45
  12. 无目标,不管理:管理者如何制定目标?

    还有不到40天&#xff0c;我们即将告别跌宕的2020&#xff0c;迈向新的一年。 岁末年尾&#xff0c;辞旧迎新&#xff0c;你对2021年有怎样的期待&#xff1f; 不论外部环境如何变幻&#xff0c;由衷希望每位关注华章管理 的你&#xff0c;都能“坚守本心”&#xff0c;谋定而…...

    2024/4/8 4:34:43
  13. ML (Chapter 1): 绪论

    本文为《机器学习》(周志华) 的读书笔记 参考 南瓜书 习题 未做 目录基本术语独立同分布 假设归纳偏好基本术语 样本 (sample) / 示例 (instance)&#xff1a;关于一个事件或对象的描述特征 (feature) / 属性 (attribute)&#xff1a;反映事件或对象在某方面的表现或性质的事…...

    2024/3/23 1:35:04
  14. C语言学习【3】——判断与循环

    1.判断 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 false…...

    2024/4/27 9:24:33
  15. element ui中select下拉框动态添加,共用数据实现ID不重复选择

    在业务实现上&#xff0c;碰到了这个问题&#xff0c;数据选择联动&#xff0c;而且选择的id不重复问题困扰好久&#xff0c;好在最后解决了&#xff0c;话不多说上代码&#xff1a; <template> <div> <div>{{selectData}}</div> <div v-for"…...

    2024/4/3 8:23:32
  16. SpringBatch解析-简介以及核心组件介绍(一)

    系列文章目录 SpringBatch解析-简介以及核心组件介绍&#xff08;一&#xff09; 目录 系列文章目录 一、SpringBatch是什么 使用场景&#xff1a; SpringBatch架构 二、SpringBatch原型 三、SpringBatch核心概念介绍 1、*Job 2、*JobInstance 3、*JobParameters 4、…...

    2024/3/23 1:35:00
  17. 开发者故事 | 聚酷智能:用涂鸦智能IoT开发平台,抢滩全国智能市场

    摘要&#xff1a; 聚酷智能利用涂鸦智能 IoT 开发平台打造了多款智能化产品&#xff0c;例如唤醒灯、红外遥控器等 行业&#xff1a; 电工、照明 开发者介绍 深圳市聚酷智能成立于 2018 年&#xff0c;是一家服务范围立足于全中国的物联网创业型公司。聚酷具备完善的设计、…...

    2024/3/29 2:23:41
  18. Spark中Scala、Python和R的Shell操作

    Spark中Scala、Python和R的Shell操作 实验环境 Linux Ubuntu 16.04 前提条件&#xff1a; Java 运行环境部署完成R语言运行环境部署完成Spark Local模式部署完成 上述前提条件&#xff0c;我们已经为你准备就绪了。 实验内容 在上述前提条件下&#xff0c;完成Spark中Scala、…...

    2024/3/23 1:34:56
  19. 原画师一般用什么软件画画?原画师需要用到什么工具?

    游戏行业这几年持续升温&#xff0c;网游火了几年&#xff0c;又轮到手游和页游。但是不管哪个平台的游戏&#xff0c;研发都需要游戏原画环节。现在&#xff0c;游戏原画专业已经超 一 学习原画漫画需要用到的软件主要有以下三款: 过了许多专业成为当下就业最热门的专业之一…...

    2024/4/27 5:58:17
  20. Echars 双击Legend 显示自己隐藏其他Legend

    经过小弟大量翻API 以及百度终于实现了自己想要的结果&#xff0c;因为EcharsAPI上没有双击Legend的事件所以得需要自己构造&#xff0c;其代码以及注释在下面代码&#xff0c;如果想要js包可以上本人的下载上去下载免费 <html><head><meta charset"UTF-8…...

    2024/3/23 1:34:56

最新文章

  1. spring bean生命周期全部过程

    Spring Bean的生命周期包括以下全部过程&#xff1a; 实例化&#xff1a;在Spring容器启动时&#xff0c;根据配置文件或注解等信息创建Bean的实例。属性赋值&#xff1a;如果Bean有属性需要进行初始化&#xff0c;Spring容器会自动为这些属性进行赋值。自定义初始化方法&…...

    2024/5/8 11:38:54
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 【opencv】示例-ela.cpp JPEG图像的错误等级分析(ELA) 通过分析图像压缩后的差异来检测图像是否被篡改过...

    ela_modified.jpg 原始ela_modified压缩后再解压得到compressed_img 差异图像Ela 这段代码的功能是实现JPEG图像的错误等级分析&#xff08;ELA&#xff09;&#xff0c;通过分析图像压缩后的差异来检测图像是否被篡改过。程序会首先读取一张图片&#xff0c;然后对其应用质量…...

    2024/5/3 3:11:36
  4. 【Locust分布式压力测试】

    Locust分布式压力测试 https://docs.locust.io/en/stable/running-distributed.html Distributed load generation A single process running Locust can simulate a reasonably high throughput. For a simple test plan and small payloads it can make more than a thousan…...

    2024/5/7 4:57:37
  5. 解析大语言模型训练三阶段

    大语言模型的训练过程一般包括3个阶段&#xff1a;预训练&#xff08;Pre-training&#xff09;、SFT&#xff08;有监督的微调&#xff0c;Supervised-Finetuning&#xff09;以及RLHF&#xff08;基于人类反馈的强化学习&#xff0c;Reinforcement Learning from Human Feedb…...

    2024/5/5 18:48:29
  6. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/7 19:05:20
  7. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/7 22:31:36
  8. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/8 1:37:40
  9. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/7 14:19:30
  10. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/8 1:37:39
  11. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/7 16:57:02
  12. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/7 14:58:59
  13. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/7 1:54:46
  14. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/7 21:15:55
  15. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/8 1:37:35
  16. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/7 16:05:05
  17. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/7 16:04:58
  18. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/8 1:37:32
  19. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/7 16:05:05
  20. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/8 1:37:31
  21. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/8 1:37:31
  22. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/7 11:08:22
  23. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/8 9:51:44
  24. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/8 1:37:29
  25. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/7 17:09:45
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57