(八)Spring之IOC控制反转、DI依赖注入介绍和使用(详解)

文章目录

  • 前言
  • Spring
  • Spring IOC 简介
    • Bean
    • IOC 概述
    • IOC 本质理解
  • Spring IOC 应用
    • IOC xml装配
    • IOC 依赖注入
    • IOC Bean的作用域
  • IoC 自动装配
    • Bean 的自动装配
    • 注解实现自动装配
  • IoC 使用注解开发
  • 模拟实现Spring IoC

前言

“Spring”在不同的上下文中表示不同的事物。它可以用来引用 Spring Framework 项目本身,而这一切都是从那里开始的。随着时间的流逝,其他 Spring 项目已经构建在 Spring Framework 之上。通常,当人们说“Spring”时,它们表示整个项目系列。

Spring 框架分为多个模块。应用程序可以选择所需的模块。核心容器的模块是核心,包括配置模型和依赖项注入机制。除此之外,Spring 框架为不同的应用程序体系结构提供了基础支持,包括消息传递,事务性数据和持久性以及 Web。它还包括基于 Servlet 的 Spring MVC Web 框架,以及并行的 Spring WebFlux 反应式 Web 框架。

——摘自Spring Framework 中文文档:https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/spring-framework-reference/core.html#spring-core

Spring中最重要的是 Spring 框架的控制反转(IoC)容器。对 Spring 框架的 IoC 容器进行彻底处理之后,将全面介绍 Spring 的面向方面编程(AOP)技术。 Spring 框架具有自己的 AOP 框架,该框架在概念上易于理解,并且成功解决了 Java 企业编程中 AOP 要求的 80%的难题。

Spring

Spring是 Java EE 编程领域的一个轻量级开源框架,该框架由一个叫 Rod Johnson 的程序员在 2002 年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架 。
Spring是一个开源容器框架,它集成各类型的工具,通过核心的 Bean factory 实现了底层的类的实例化和生命周期的管理。在整个框架中,各类型的功能被抽象成一个个的 Bean,这样就可以实现各种功能的管理,包括动态加载和切面编程。

Spring IOC 简介

Bean

在 Spring 中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。bean是一个由 Spring IoC 容器实例化、组装和管理的对象。

简单来说,它在 Spring 中定义为“普通、简单的类对象”

IOC 概述

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

IOC 本质理解

IOC 控制反转实现了根本性的变化,我们以前是在 Dao 层程序控制调用什么,后续还会增加许多业务,但都是基于接口实现的,然后就需要在接口层去设配接口后续的对象。

  • 以前,程序是主动创建对象,控制权在程序员手上;
  • 使用自动注入后,程序不再具有主动性,变成被动的接受对象。

控制反转 loC(Inversion of Control),是一种设计思想,DI (依赖注入)是实现 loC 的一种方法,也有人认为 DI 只是 loC 的另一种说法。没有 loC 的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。

采用XML方式配置 Bean 的时候,Bean 的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean 的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在 Spring 中实现控制反转的是 loC 容器,其实现方法是依赖注入(Dependency Injection,Dl)。

Spring IOC 应用

在 Spring 中有三种装配方式:

  • 在 xml 中显示配置;
  • 在 java 中显示配置;
  • 注解的方式:隐式的自动装配 Bean;

IOC xml装配

  • IOC 程序试验(Hello)

    • 在 Maven 项目下,在 pom.xml 中导入maven依赖:

      	<dependencies>
              <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-webmvc</artifactId>
                  <version>5.3.20</version>
              </dependency>
          </dependencies>
      
    • 创建 pojo 包,新建实体类 Hello

      public class Hello {
          private String str;
      
          ……getter、setter(set方法必须存在)
      
          @Override
          public String toString() {
              return "Hello{" +
                      "str='" + str + '\'' +
                      '}';
          }
      }
      
    • 在 resources 下新建 ApplicationContext.xml(官方名字),这里为了理解 IOC 本质,暂时将名字设为 beans.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
              https://www.springframework.org/schema/beans/spring-beans.xsd">
          <!--使用Spring来创建对象,这些对象都称为 Bean
              类型 变量名 = new 类型();
              Hello hello = new Hello();
              Spring xml配置文件中:
              id :变量名
              class :所要new的对象
          -->
          <beans>
              <bean id="Hello" class="com.hb.pojo.Hello">
                  <property name="str" value="HB"></property>
                  <!--
      			
      			-->
              </bean>
          </beans>
      </beans>
      
    • 创建测试类:

      public class HelloTest {
          public static void main(String[] args) {/**
              *提供给ApplicationContext构造函数的位置路径是资源字符串
              *这些资源字符串使容器可以从各种外部资源(例如本地文件系统,Java CLASSPATH等)加载配置元数据。
              */
              //这句话是使用xml文件配置的固定语句,用来获取 Spring 的上下文对象
              ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
      
              Hello hello = (Hello) context.getBean("Hello");
              System.out.println(hello.toString());
          }
      }
      
    • 运行结果为:

      Hello{str='HB'}
      

      这个过程并没有 new 对象,对象是由Spring容器创建的,这就是控制反转;

    • 总结:

      控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的。

      反转:程序本身不创建对象,而变成被动的接收对象。

      依赖注入:就是利用set方法来进行注入的。

      IOC是一种编程思想,由主动的编程变成被动的接收,可以通过newClassPathXmlApplicationContext去浏览一下底层源码,可以发现Spring帮我们实现了很多东西。

      那么从现在开始,我们如果要实现不同的操作,只需要在 xml 配置文件中进行修改,所谓的 loC,就是对象由 Spring 来创建,管理和装配。

  • IOC 创建对象方式

    • 默认的创建方式:使用无参构造创建对象;

    • 在使用有参构造创建对象:

      • 第一种:通过下标赋值

        <bean id="user" class="com.hb.pojo.User">
            <constructor-arg index="0" value="HB"/>
            <constructor-arg index="1" value="42"/>
        </bean>
        
      • 第二种:通过类型赋值

        <!--通过类型创建,不推荐使用-->
        <bean id="user" class="com.hb.pojo.User">
            <constructor-arg type="java.lang.String" value="黄博"/>
        </bean>
        
      • 第三种:通过参数名来设置

        <!--直接通过name赋值-->
        <bean id="user" class="com.hb.pojo.User">
            <constructor-arg name="name" value="黄博"/>
        </bean>
        
        <!--ref参数引用其他的id-->
        <beans>
            <bean id="beanOne" class="x.y.ThingOne">
                <constructor-arg ref="beanTwo"/>
                <constructor-arg ref="beanThree"/>
            </bean>
        
            <bean id="beanTwo" class="x.y.ThingTwo"/>
        
            <bean id="beanThree" class="x.y.ThingThree"/>
        </beans>
        
  • IoC 配置说明

    • 别名:

      <!--添加了别名,也可以使用别名获取到这个对象-->
      <alias name="user" alias="hb"></alias>
      
    • Bean 的配置:

      <!--
      id:bean的唯一标识符 => 对象名
      class:bean 对象所对应的全限定名(包名+类名)
      name:也是别名,同时可以起多个
      …………等等
      -->
      <bean id="user" class="com.hb.pojo.User" name="u1,u2">
      	<property name="name" value="hb"></property>
      </bean>
      
    • import:

      用于团队开发,将多个配置文件ApplicationContext.xml导入合并为一个。

      <import resource="ApplicationContext1.xml"></import>
      <import resource="ApplicationContext2.xml"></import>
      <import resource="ApplicationContext3.xml"></import>
      

      使用的是时候,直接使用总配置。

IOC 依赖注入

  • 依赖注入:set 注入

    • 依赖:bean 对象的创建依赖于容器;
    • 注入:bean 对象中的所有属性,由容器来注入(完成初始化);
  • 映射键或值的值或设定值可以是以下任何元素:

    bean | ref | idref | list | set | map | props | value | null
    
  • 试验所有注入:

    • 复杂类型创建:

      package com.hb.pojo;
      
      public class Address {
          private String address;
      
      	…………一系列getter、setter、toString方法
      }
      
      
    • 真实测试对象:

      package com.hb.pojo;
      
      import java.util.*;
      
      public class University {
          private String name;
          private Address address;
          private String[] colleges;
          private List<String> majors;
          private Map<String,String> classes;
          private Set<String> student;
          private Properties info;
          private String doctoralProgram;
      
      	…………一系列getter、setter
         	
      	@Override
          public String toString() {
              return "name = " + name + '\n' +
                      "address = " + address + '\n' +
                      "colleges = " + Arrays.toString(colleges) + '\n' +
                      "majors = " + majors + '\n' +
                      "classes = " + classes + '\n' +
                      "student = " + student + '\n' +
                      "info = " + info + '\n' +
                      "doctoralProgram = " + doctoralProgram;
          }
      }
      
    • 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"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
              https://www.springframework.org/schema/beans/spring-beans.xsd">
      
          <bean id="add" class="com.hb.pojo.Address">
              <property name="address" value="陕西省西安市"></property>
          </bean>
      
          <bean id="university" class="com.hb.pojo.University">
              <!--常用!第1种,普通值注入,value-->
              <property name="name" value="西安邮电大学"></property>
              <!--常用!第2种,Bean注入,ref-->
              <property name="address" ref="add"></property>
              <!--第3种,数组注入-->
              <property name="colleges">
                  <array>
                      <value>通院</value>
                      <value>计院</value>
                  </array>
              </property>
              <!--第4种,List注入-->
              <property name="majors">
                  <list>
                      <value>通工</value>
                      <value>物联网</value>
                  </list>
              </property>
              <!--第5种,map注入-->
              <property name="classes">
                  <map>
                      <entry key="1" value="通工1班"></entry>
                  </map>
              </property>
              <!--第6种,set注入-->
              <property name="student">
                  <set>
                      <value>张三</value>
                  </set>
              </property>
              <!--第7种,NULL注入-->
              <property name="doctoralProgram">
                  <null/>
              </property>
              <!--第8种,Properties注入-->
              <property name="info">
                  <props>
                      <prop key="编号">11664</prop>
                  </props>
              </property>
          </bean>
      </beans>
      
    • 测试类:

      public class Test {
          public static void main(String[] args) {
              ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
              University university = (University) context.getBean("university");
              System.out.println(university.toString());
          }
      }
      
    • 测试结果:

  • p 命名和 c 命名空间注入:

    • p 命名空间注入——对应 Set 方式注入

      p 名称空间允许您使用bean元素的属性(而不是嵌套的<property/>元素)来描述协作 bean 的属性值,或者两者兼而有之。

      Spring 支持具有命名空间的可扩展配置格式,命名空间基于 XMLSchema 定义。而 bean 配置格式是在 XMLSchema 文档中定义的。但是,p 名称空间没有在 XSD 文件中定义,只存在于 Spring 的核心中。

      示例:

      <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
              https://www.springframework.org/schema/beans/spring-beans.xsd">
              
              <!--p命名空间注入,可以直接注入属性的值:property-->
              <bean id="user" class="com.hb.pojo.User" p:name="HB" p:age="21"></bean>
      </beans>
      
    • c 命名空间注入——对应构造器注入

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

      <!--必须有有参构造方法-->
      <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/beans
              https://www.springframework.org/schema/beans/spring-beans.xsd">
      
              <!--c命名空间注入,通过构造器注入:constructor-arg-->
              <bean id="user" class="com.hb.pojo.User" c:name="HB" c:age="21"></bean>
      </beans>
      

    注意:p 命名和 c 命名空间注入不能直接使用,需要导入约束(xmlns:p="http://www.springframework.org/schema/p");

IOC Bean的作用域

作用域描述
singleton在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值。
prototype每次从容器中调用Bean时,都返回一个新的实例。
request每次HTTP请求都会创建一个新的Bean,该作用域仅适用于 web 的 Spring WebApplicationContext 环境。
session将单个bean定义范围界定为HTTP会话的生命周期。仅在web感知的Spring ApplicationContext的上下文中有效.
application限定一个Bean的作用域为ServletContext的生命周期。该作用域仅适用于web的Spring WebApplicationContext环境。
websocket将单个bean定义范围界定为WebSocket的生命周期。仅在web感知的Spring ApplicationContext的上下文中有效。
  • 单例模式(Spring 默认机制)

    如果 bean 的作用域的属性被声明为 singleton ,那么 Spring Ioc 容器只会创建一个共享的 bean 实例。对于所有的 bean 请求,只要 id 与该 bean 定义的相匹配,那么 Spring 在每次需要时都返回同一个 bean 实例。

    <bean id="user" class="com.hb.pojo.User" scope="singleton">
    	<property name="name" value="hb"></property>
    </bean>
    
  • 原型模式:每次从容器中 get 的时候,都会产生一个新对象

    当一个 bean 的作用域为 prototype,表示一个 bean 定义对应多个对象实例。声明为 prototype 作用域的 bean 会导致在每次对该 bean 请求时都会创建一个新的 bean 实例,每次获得的对象都是不同的。

    <bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
    
  • 其余的request,sessionapplication这三个作用域都是基于 web 的 Spring Web ApplicationContext实现的,只有在 web 环境下中会使用到。

IoC 自动装配

Bean 的自动装配

  • 自动装配是 Spring 满足 Bean 依赖的一种方式;
  • Spring 会在上下文中自动寻找,并自动给 Bean 装配属性;

byName 自动装配:

	<!--byName:会自动在上下文中查找,和自己对象set方法后面的值对应的 beanid;-->
	<bean id="user" class="com.hb.pojo.User" autowire="byName">
        <property name="name" value="hb"></property>
    </bean>

注意:需要保证所有的 bean 的 id 唯一,并且这个 bean 需要和自动注入的属性的 set 方法的值一致;

byType 自动装配:

	<!--byType:会自动在上下文中查找,和自己对象属性类型相同的 bean;-->
	<bean id="user" class="com.hb.pojo.User" autowire="byType">
        <property name="name" value="hb"></property>
    </bean>

注意:需要保证所有的 bean 的 class 唯一,并且这个 bean 需要和自动注入的属性类型一致;

注解实现自动装配

使用注解前需要:

1、导入约束:context 约束。

2、配置注解的支持:<context:annotation-config/>

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>
</beans>
  • @Autowired 注解(最常用)

    @Autowired 注解直接在属性上使用即可,通过 byType 的方式实现,例如:

    public class User {
        @Autowired
        private String name;
        @Autowired
        private int age;
    
    	…………一系列getter、setter、toString方法
    }
    

    拓展:

    @Autowired(required = false):如果显示定义了 Autowired 的 required 的属性为 false ,说明这个对象可以为 null,否则不允许为空。

    @Nullable:字段标记了这个注解,说明这个字段可以为 null;

  • @Qualifier(value=“xxx”)

    @Qualifier(value=“xxx”):用于指定唯一的 Bean 对象注入。

    如果 @Autowired 自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候,我们可以使用@Qualifier(value=“xxx”) 来配合 @Autowired。

    public class User {
        @Autowired
        @Qualifier(value="xxx")
        private String name;
        @Autowired
        @Qualifier(value="xxx")
        private int age;
    
    	…………一系列getter、setter、toString方法
    }
    
  • @Resource注解

    public class User {
    	@Resource
        private String name;
    	@Resource
        private int age;
    
    	…………一系列getter、setter、toString方法
    }
    

    @Resource 默认通过byName的方式实现,如果找不到名字,则通过byType的方式实现,如果两个都找不到,就报错。

IoC 使用注解开发

首先,需要导入 context 约束,来增加注解的支持:

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.hb.pojo"/>
    <context:annotation-config/>
</beans>
  • @Component

    @Component 组件,放在类上,说明这个类被 Spring 管理了,就是Bean,例如:

    //@Component:组件,等价于<bean id="user" class="com.hb.pojo.User"/>
    @Component
    public class User {
        public String name = "HB";
    }
    
  • @Value(“xxx”)

    @Component
    public class User {
        //等价于<property name="name" value="HB"></property>
        @Value("HB")
        public String name;
    }
    
  • 衍生的注解

    @Component有几个衍生的注解,在 web 开发中,会按照 mvc 三层架构分层;

    • dao【@Repository】
    • service【@Service】
    • controller【@Controller】

    这四个注解功能都是一样的,都是代表将某个类注册到 Spring 中,装配 Bean;

  • 作用域

    @Scope(“prototype”):表示 Bean 的作用域。

总结:

xml 与注解:

  • xml :更加万能,适用于任何场合,维护简单方便;
  • 注解:不是自己的类用不了,维护相对复杂;

xml 与注解结合使用,xml 用来管理 bean,注解只需完成属性的注入,卫门在使用的过程中直须注意让注解生效,开启注解的支持。

模拟实现Spring IoC

请见HB个人博客:模拟实现 Spring IOC(https://blog.csdn.net/SwaggerHB/article/details/131015009)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core

1. 入口文件 一个应用程序总有一个入口文件&#xff0c;是应用启动代码开始执行的地方&#xff0c;这里往往也会涉及到应用的各种配置。当我们接触到一个新框架的时候&#xff0c;可以从入口文件入手&#xff0c;了解入口文件&#xff0c;能够帮助我们更好地理解应用的相关配置…

用户验证FTP实验

用户FTP实验 目录 匿名用户验证&#xff1a; 本地用户验证&#xff1a; 本地用户访问控制&#xff1a; 匿名用户验证&#xff1a; 例&#xff1a;&#xff08;前提配置&#xff0c;防火墙关闭&#xff0c;yum安装&#xff0c;同模式vmware11&#xff09; 现有一台计算机huy…

什么是项目可交付成果?定义、示例及管理工具

项目产生可交付成果&#xff0c;这只是项目活动的结果。项目可交付成果可大可小&#xff0c;其数量也因项目而异。它们是由项目管理团队和利益相关者在项目规划阶段商定的。 换句话说&#xff0c;任何类型的项目都有投入和产出。投入是你投入到项目中的东西&#xff0c;如数据…

什么?电路板上还要喷漆?

什么是三防漆&#xff1f; 三防漆是一种特殊配方的涂料&#xff0c;用于保护线路板及其相关设备免受环境的侵蚀。三防漆具有良好的耐高低温性能&#xff1b;其固化后成一层透明保护膜&#xff0c;具有优越的绝缘、防潮、防漏电、防震、防尘、防腐蚀、防老化、耐电晕等性能。 在…

访客管理系统:Lobby Track Crack

Lobbytrack桌面 for 微软视窗 一个强大的、功能齐全的现场访客管理系统解决方案。在本地管理您的数据&#xff0c;网络工作站一起配置访客管理流程的各个方面。 扩展您的系统将本地 Web 模块 添加到您的 Lobbytrack 桌面系统&#xff0c;并允许您的员工使用本地 Intranet 上的 …

FrameLayout+LinearLayout实现首页底部菜单

1.布局样式 2.main.xml代码 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_par…

Verilog基础之一、触发器实现

目录 一、触发器简介 1.1 触发器作用 1.2 触发器信号 1.3 使用规范 1.4 Vivado综合触发器 二、代码实现 三、综合结果 一、触发器简介 1.1 触发器作用 触发器是工程中基础的单元结构也是相当重要的组成&#xff0c;时序电路的实现离不开触发器。触发器是具有存储功能的器件&…

水库大坝安全问题有哪些?

我国现有水库大坝9.8万余座&#xff0c;80%水库大坝修建于上世纪50至70年代&#xff0c;受经济、技术等历史因素的影响&#xff0c;存在坝体结构破损、坝基渗漏、坝体渗漏、坝面变形等严重的安全隐患。 一、水库大坝的安全问题主要包括以下几个方面&#xff1a; 1.坝体结构破损…

为减少来自环境使用的无线传感器网络的传输次数而开发的方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【Qt】delegate的自定义实现函数createEditor进不去【2023.05.07】

摘要 妈卖批&#xff0c;因为这个函数进不去&#xff0c;emo了一下午。实际上就是因为函数声明和定义的地方漏了个const关键字。 1.正确✔&#xff1a; QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) cons…

Android以aar包形式引入hunter-timing,Java(4)

Android以aar包形式引入hunter-timing&#xff0c;Java&#xff08;4&#xff09; &#xff08;1&#xff09;参照这篇文章&#xff1a; https://zhangphil.blog.csdn.net/article/details/130603231https://zhangphil.blog.csdn.net/article/details/130603231 生成.aar文件…

Android SharedPreferences转为MMKV

开篇 开局一张图&#xff0c;说明一切问题。 MMKV优势 可以看出MMKV相比SP的优势还是比较大的&#xff0c;除了需要引入库&#xff0c;有一些修改上的成本以外&#xff0c;就没有什么能够阻挡MMKV了。当然了&#xff0c;MMKV也有着不广为人知的缺点&#xff0c;放在最后。 MM…

C# | 线性回归算法的实现,只需采集少量数据点,即可拟合整个数据集

C#线性回归算法的实现 文章目录 C#线性回归算法的实现前言示例代码实现思路测试结果结束语 前言 什么是线性回归呢&#xff1f; 简单来说&#xff0c;线性回归是一种用于建立两个变量之间线性关系的统计方法。在我们的软件开发中&#xff0c;线性回归可以应用于数据分析、预测和…

计算机组成原理-指令系统-机器级语言表示(汇编)

目录 一、X86汇编语言指令基础 寄存器 常见的算数运算指令​编辑 常见逻辑运算指令 AT&T格式和 Intel格式指令 选择语句的机器级表示 循环语句的机器级表示 二、CISC和RISC 一、X86汇编语言指令基础 寄存器 常见的算数运算指令 常见逻辑运算指令 AT&T格式和 Intel格…

使用Python将《青花瓷》歌词生成词云图

哈喽大家好&#xff0c;因为上次有小伙伴问我&#xff0c;歌曲的歌词和评论怎么生成词云图&#xff0c;想买代码… 当时我就拒绝了&#xff0c;直接免费送给了他。 所以今天来分享给大家 我们以周董的《青花瓷》为例&#xff0c;要对《青花瓷》歌词生成词云图&#xff0c;需…

代码创作世界——pytorch深度学习框架数据类型

代码创作世界——pytorch深度学习框架数据类型 torch中的数据类型张量&#xff08;tensor&#xff09; pytorch中的 在数学中&#xff0c;一个单独的数可以成为标量&#xff0c;一行或者一列数组可以称为向量&#xff0c;一个二维数组称为一个矩阵&#xff0c;矩阵中的每一个元…

市值蒸发21亿港元,王一博还能拉着乐华走多久?

5月22日&#xff0c;#乐华被冻结2390万财产#话题冲上热搜。 近日&#xff0c;头顶“王一博”光环的乐华娱乐集团&#xff08;下称“乐华娱乐”&#xff0c;02306.HK&#xff09;交出了上市后的首份财报。 4月25日&#xff0c;财报公布的首个交易日&#xff0c;其股价下跌2.06…

商代数与积代数

商代数 设 R R R使 A < S , ∗ 1 , ∗ 2 , ⋯ , ∗ n > A \left<S, *_1, *_2,\cdots, *_n\right> A⟨S,∗1​,∗2​,⋯,∗n​⟩上的同余关系&#xff0c;则 R R R使 S S S上的等价关系&#xff0c;因此 R R R可诱导出 S S S的一个划分 S / R { [ a ] R ∣ a ∈…

【Linux】Linux环境基础工具的基本使用及配置(yum、vim)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 Linux软件包管理器 - y…

【深入浅出Spring Security(二)】Spring Security的实现原理

Spring Security的实现原理 一、实现原理二、内置Filter以及默认加载的Filter三、自动配置分析&#xff08;SpringBootWebSecurityConfiguration&#xff09;ConditionalOnMissingBean 四、自己配置SecurityFilterChain 一、实现原理 在 Spring Security 中&#xff0c;认证、…