当前位置: 首页 > news >正文

Spring学习20230208-09

IOC底层原理

  1. IOC概念 :面向对象编程中的一种设计原则,用来降低耦合度

    1. 通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象引用传递给他。可以说,依赖被注入到对象中。
    2. 控制反转,把对象创建和对象之间的调用过程,都交给Spring进行管理
    3. 使用IOC的目的:降低耦合度
    4. 1214里面的入门案例就是IOC实现
  2. IOC底层原理

    1. 主要技术:xml解析、工厂模式、反射

    2. class UserDao{add(){......}
      }class UserService(){execute(){UserDao dao = new UserDao();dao.add();}
      }
      

      上述代码存在问题:耦合度太高

    3. 解决方案:目的:耦合度降低到最低限度

      1. 工厂模式:

        class UserFactory{public static UserDao getDao() {return new UserDao();}
        }class UserService(){execute(){UserDao	dao = UserFactory.getDao();dao.add();}
        }
        //	并没有降低到最低限度耦合度
        
      2. IOC原理(xml解析、工厂模式、反射)

        1. 第一步:XML配置文件,配置创建的对象

          <bean id ="dao" class = "com.emnets.UserDao"></bean>
          
        2. 第二步:有service类和dao类,创建工厂类

          class UserFactory{public static UserDao getDao(){//	通过xml解析+反射的方式创建对象String classValue = class属性值;	//	xml解析Class clazz = Class.froName(classValue);	//	反射创建对象 return (UserDao)clazz.newInstance();}
          }
          
        3. 进一步降低了耦合度,例如包名改了,这里只需要修改配置文件的路径即可。

IOC接口:BeanFactory和ApplicationContext

  1. IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
  2. Spring提供IOC容器实现两种方式(两个接口,用于加载配置文件创建对象):
    1. BeanFactory:IOC容器基本实现,是Spring内部使用接口,一般不提供给开发人员使用
    2. ApplicationContext:是BeanFactory接口的子接口,提供更多更强大的功能,提供给开发人员使用
    3. 二者区别:
      1. BeanFactory:加载配置文件时不会创建对象,在获取(使用)对象时才去创建对象
      2. ApplicationContext:加载配置文件时就会把配置文件对象进行创建(服务器启动时就会加载配置文件并创建好对象)
    4. ApplicationContext的实现类:
      1. ClassPathXmlApplicationContext:参数写文件在类内src下的路径
      2. FileSystemXmlApplicationContext:参数写文件在文件系统下的路径

IOC操作:Bean管理

  1. 什么是Bean管理,指的是两个操作
    1. Spring创建对象
    2. Spring注入属性
  2. Bean管理操作有两种方式:
    1. 基于XML实现
    2. 基于注解方式实现

IOC操作:Bean管理(基于XML)

  1. 基于xml方式创建对象

    1. 在apring配置文件中,使用bean标签,添加上对应的属性,就可以实现对象创建
    2. 在bean标签有很多属性,介绍常用属性
      • id:唯一标识
      • class:创建对象类的全路径(包类路径)
      • name:跟id一样,name可以加特殊符号,id不行;name基本不用
    3. 创建对象时,默认执行无参数的构造方法,方法里面必须有无参构造函数否则报错
  2. 基于xml方式注入属性DI:依赖注入,就是注入属性

    1. 第一种方式:set方式

      1. 第一步:创建类,定义属性和对应的set方法

      2. 第二步: 在spring配置文件配置对象创建,配置属性注入

        <bean id="user" class="com.emnets.spring5.testdemo.User"><!--    set方法注入属性:使用property标签注入属性--><!--    name:属性名 ; value:属性值--><property name="username" value="dyg"></property>
        </bean>
        
      3. 注入依赖要在创建对象基础之上完成

    2. 第二种方式:有参构造函数

      1. 第一步:定义属性,创建对应有参构造函数

      2. 第二步:配置文件中进行配置

        <bean id="user" class="com.emnets.spring5.testdemo.User"><!--    set方法注入属性:使用property标签注入属性--><property name="username" value="dyg"/><!--        有参构造注入--><!--    name:属性名   ;index:属性索引   ; value:属性值--><constructor-arg name="username" value="zh"/><constructor-arg index="0" value="zh"/>
        </bean>
        
      3. P.S. 有参构造执行在set之前

    3. p 名称空间注入(了解)

      1. 使用 p 名称空间注入,可以简化基于 xml 配置方式 (本质是对set的简化)

      2. 第一步 添加 p 名称空间在配置文件中

        <beans>标签里面加入:xmlns:p="http://www.springframework.org/schema/p"
        
      3. 第二步 进行属性注入,在 bean 标签里面进行操作

      <!--2 set 方法注入属性-->
      <bean id="book" class="com.atguigu.spring5.Book" p:bname="九阳神功"p:bauthor="无名氏"></bean>
      
  3. xml注入其他类型属性

    1. 字面量(设置的固定值)

      1. null :

        <property name="username"><null></null>
        </property>
        
      2. 属性值保护特殊符号

        <!--        例如包含<>符号-->
        <!--        1.可以使用&l和&gt做转义字符-->
        <!--        2.把特殊符号内容写到CDATA-->
        <property name="username" ><value> <![CDATA[<<dyg>>]]> </value>
        </property>
        
    2. 注入属性-外部bean

      1. 创建两个类service和dao类

      2. service调用dao里面的方法

      3. 在spring配置文件中进行配置

        <bean id = "userService" class="com.emnets.service.UserService">
        <!--    注入userDao对象属性,ref:创建userDao对象bean标签id值 --><property name="userDao" ref="userDaoImpl"></property>
        </bean><bean id = "userDaoImpl" class="com.emnets.dao.userDaoImpl"></bean>
        
    3. 注入属性-内部bean

      1. 一对多关系:部门和员工

      2. 在实体类之间表示一对多的关系;员工使用一个对象类型属性表示

      3. 在spring进行相关配置

        <!--    内部bean操作-->
        <bean id="emp" class="com.emnets.spring5.bean.Emp"><property name="ename" value="lucy"></property><property name="gender" value="girl"></property><!--        设置对象类型属性,可以按照外部bean方式,建一个对象然后引入--><property name="dept"><bean id="dept" class="com.emnets.spring5.bean.Dept"><property name="dname" value="安保部"></property></bean></property>
        </bean>
        
    4. 注入属性-级联赋值

      1. 写法一:

        <!--    内部bean操作-->
        <bean id="emp" class="com.emnets.spring5.bean.Emp"><property name="ename" value="lucy"></property><property name="gender" value="girl"></property><!--    级联赋值    --><property name="dept" ref="dept"></property>
        </bean>
        <bean id="dept" class="com.emnets.spring5.bean.Dept"><property name="dname" value="finance"></property>
        </bean>
        
      2. 写法二:

        <!--    内部bean操作-->
        <bean id="emp" class="com.emnets.spring5.bean.Emp"><property name="ename" value="lucy"></property><property name="gender" value="girl"></property><!--    级联赋值    --><property name="dept" ref="dept"></property><property name="dept.dname" value="technological"></property>
        </bean>
        <bean id="dept" class="com.emnets.spring5.bean.Dept"><property name="dname" value="finance"></property>
        </bean>
        
    5. 注入集合类型属性 数组、list、map、set

      <bean id="stu" class="com.emnets.spring5.collectiontype.Stu"><!--    数组类型注入    --><property name="courses"><array><value>java课程</value><value>数据库</value><value>ai课程</value></array></property><!--     list类型属性注入    --><property name="list"><list><value>张三</value><value>老三</value></list></property><property name="maps"><map><entry key="JAVA" value="java"></entry><entry key="PHP" value="php"></entry></map></property><property name="sets"><set><value>MySQL</value><value>Redis</value></set></property>
      </bean>
      
    6. 在集合里面设置对象类型值

      1. 创建多个对象
      2. 在属性值里面用ref引入对象的id值
      <bean id="stu" class="com.emnets.spring5.collectiontype.Stu"><!--   注入list集合类型,值是对象     --><property name="courseList"><list><ref bean="course1"></ref><ref bean="course2"></ref></list></property>
      </bean><!--  创建多个course对象  -->
      <bean id="course1" class="com.emnets.spring5.collectiontype.Course"><property name="cname" value="Spring5"></property>
      </bean>
      <bean id="course2" class="com.emnets.spring5.collectiontype.Course"><property name="cname" value="Mybatis"></property>
      </bean>
      
    7. 把集合注入部分提取出来

      1. 在spring配置文件中引入名称空间util

        <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"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
        
      2. 使用util标签完成list集合注入提取

         <!--  用于提取的bean不同于普通bean的写法  --><!--  1.提取list集合类型属性注入--><util:list id="bookList"><value>图书1</value><value>图书2</value><value>图书3</value></util:list><!--  2.提取list集合类型属性注入使用--><bean id="book" class="com.emnets.spring5.bean.Book"><!-- <property name="dept" ref="dept"></property>--></bean>
        
  4. FactoryBean

    1. Spring有两种bean,一种普通bean(用户创建),另一种工厂bean(FactoryBean)

    2. 普通bean特点:配置文件中定义bean类型就就是返回类型

    3. 工厂bean特点:配置文件中定义bean类型可以和返回值不一样, 类型取决于实现方法的getObject方法定义的范型

      1. 第一步:创建类,让这个类作为工厂bean,实现接口FactoryBean
      2. 第二步:实现接口方法,在实现的方法中定义返回的bean类型
      public class MyBean implements FactoryBean<Course> {//  定义返回bean@Overridepublic Course getObject() throws Exception {Course course = new Course();course.setCname("adv");return course;}
      }@Test
      public void testBean6(){//  1.加载spring配置文件ApplicationContext context = new ClassPathXmlApplicationContext("bean6.xml");//  2.获取配置文件Course c = context.getBean("MyBean", Course.class);System.out.println(c);
      }
      
  5. Bean的作用域

    1. 含义:spring可以设置创建的bean是单实例还是多实例
    2. 在Spring里面,默认情况下,bean是一个单实例
    3. 在读取同一个bean的配置文件创建出的对象时,如果地址相同则是单实例,不同则为多实例。
    4. 设置单实例还是多实例:bean标签里面有相应的属性进行设置:scope
      1. 默认值:singleton,表示单实例对象
      2. 第二个值:prototype,表示多实例对象
      3. 二者区别:设置singleton时,加载配置文件时Spring就会创建单实例对象 ; 设置prototype时,在调用context.getBean方法时才会去创建多实例对象。
      4. 第三个值:request,此时每次创建对象放到request域对象中
      5. 第四个值:session,此时每次创建对象都会放到session域对象中
  6. bean生命周期

    1. 构造器创建
    2. 为bean的属性设置值,和对其他bean引用(调用bean对象的set方法)
    3. 调用bean初始化方法的方法(需要进行配置初始化)
    4. bean可以使用(对象获取到了)
    5. 当容器关闭时,调用bean销毁方法(需要进行配置销毁)
    public class Orders {//无参数构造public Orders() {System.out.println("第一步 执行无参数构造创建 bean 实例");}private String oname;public void setOname(String oname) {this.oname = oname;System.out.println("第二步 调用 set 方法设置属性值"); }//创建执行的初始化的方法public void initMethod() { System.out.println("第三步 执行初始化的方法");}//创建执行的销毁的方法public void destroyMethod() { System.out.println("第五步 执行销毁的方法");} 
    }
    
    <bean id="orders" class="com.atguigu.spring5.bean.Orders" init-
    method="initMethod" destroy-method="destroyMethod">
    </bean>
    
    @Test
    public void testBean3() { ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");ClassPathXmlApplicationContext context =
    new ClassPathXmlApplicationContext("bean4.xml");Orders orders = context.getBean("orders", Orders.class); System.out.println("第四步 获取创建 bean 实例对象"); System.out.println(orders);//手动让 bean 实例销毁context.close();
    }
    
  7. bean的后置处理器,bean生命周期有七步,在初始化前后会多两步操作

    1. 构造器创建
    2. 为bean的属性设置值,和对其他bean引用(调用bean对象的set方法)
    3. 把bean实例传递bean后置处理器的方法postProcessBeforeInitialization
    4. 调用bean初始化方法的方法(需要进行配置初始化)
    5. 把bean实例传递bean后置处理器的方法postProcessAfterInitialization
    6. bean可以使用(对象获取到了)
    7. 当容器关闭时,调用bean销毁方法(需要进行配置销毁)
  8. 添加后置处理器效果

    1. 创建类,实现接口BeanPostProcessor,创建后置处理器
    2. 在所需要添加配置后置处理器的bean对象的配置文件添加,spring会对整个配置文件的bean都添加处理器
  9. Bean管理xml自动装配

    1. 什么是自动装配:通过value等属性值,注入属性叫做手动装配;根据指定装配规则(属性名称或者属性类型),Spring 自动将匹配的属性值进行注入

    2. 演示自动装配过程

      <!--实现自动装配bean 标签属性 autowire,配置自动装配autowire 属性常用两个值:byName 根据属性名称注入,注入值 bean 的 id 值和类属性名称一样byType 根据属性类型注入,相同类型的bean只能定义一个 -->
      <bean id="emp" class="com.emnets.spring5.autowire.Emp" autowire="byName"><!--        <property name="dept" ref="dept"></property>-->
      </bean>
      <bean id="dept" class="com.emnets.spring5.autowire.Dept"></bean>
      
  10. 外部属性文件

    1. 直接配置数据库信息
    2. 引入外部属性文件配置数据库连接池
      1. 创建外部属性文件,properties 格式文件,写数据库信息
      2. 把外部 properties 属性文件引入到 spring 配置文件中 * 引入 context 名称空间

IOC操作:Bean管理(基于注解)

  1. 注解回顾:

    1. 注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值…)
    2. 使用注解,注解作用在类上面,方法上面,属性上面
    3. 使用注解目的:简化 xml 配置
  2. Spring针对Bean管理创建对象提供注解

    1. @Component 创建普通对象
    2. @Service 一般用在service层
    3. @Controller 用在web层
    4. @Repository 用在dao层
    5. * 上面四个注解功能是一样的,都可以用来创建 bean 实例
  3. 基于注解方式实现创建

    1. 第一步:引入依赖,spring-aop-5.2.6.RELEASE.jar

    2. 第二步:开启组建扫描

      <!--   开启扫描1 如果扫描多个包,多个包使用逗号隔开 2 扫描包上层目录
      --><context:component-scan base-package="com.emnets.spring5"></context:component-scan>
      
    3. 第三步:创建类,在类上添加创建对象的注解

      //在注解里面 value 属性值可以省略不写,相当于bean中的id
      // 默认值是类名称,首字母小写
      // UserService -- userService
      @Component(value = "userService")   //  等价于:<bean id ="userService" class = "package path">
      public class UserService {public void add(){System.out.println("Service add!");}
      }
      
    4. 测试

       @Testpublic void testService(){ApplicationContext context = new ClassPathXmlApplicationContext("bean01.xml");UserService userService = context.getBean("userService", UserService.class);System.out.println(userService);userService.add();}
      
  4. 开启组建扫描细节配置

     <!--  以下两个示例看懂即可  --><!--示例 1use-default-filters="false" 表示现在不使用默认filter,使用自己配置 filter context:include-filter ,设置扫描哪些内容这段配置表示:关闭默认filter,自己设置的filter表示:扫描com.atguigu包下全部的controller
    -->
    <context:component-scan base-package="com.atguigu" use-default-
    filters="false">
    <context:include-filter type="annotation"
    expression="org.springframework.stereotype.Controller"/>
    </context:component-scan><!--示例 2
    下面配置扫描包所有内容 context:exclude-filter: 设置哪些内容不进行扫描
    -->
    <context:component-scan base-package="com.atguigu">
    <context:exclude-filter type="annotation"
    expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    
  5. 属性注入

    1. @AutoWired 根据属性类型进行自动注入

      1. 第一步 把 service 和 dao 对象创建,在 service 和 dao 类添加创建对象注解

      2. 第二步 在 service 注入 dao 对象,在 service 类添加 dao 类型属性,在属性上面使用注解(不需要set方法!)

        //在注解里面 value 属性值可以省略不写,相当于bean中的id
        // 默认值是类名称,首字母小写
        // UserService -- userService
        @Component(value = "userService")   //  等价于:<bean id ="userService" class = "package path">
        public class UserService {//  定义Dao属性,并且不需要set方法!@Autowired		//根据类型进行注入private UserDao userDao;public void add(){System.out.println("Service add!");userDao.add();}
        }
        
    2. @Qualifier 根据属性名称自动注入

      1. 这个注解的使用需要和上面的@AutoWired一起使用
      2. 根据类型名称注入,如果多个实现类继承一个接口,Qualifier的参数value就填对象创建注解里面的id值,例如@Repository (value = ‘userDaoImpl’),如果不填默认类名首字母小写的值
    3. @Resource 可以根据类型也可以根据名称

      1. 无参数使用时,默认根据类型进行注入

      2. 有参数使用时,根据name参数进行名称匹配注入

        //@Resource                        //   根据类型进行注入@Resource(name = "userDaoImpl1")   //   根据名称进行注入private UserDao userDao;
        
      3. Resource是javax包中的,是java的扩展包

    4. 注:以上但是都是用于对象类型注入,不是普通类型

    5. @Value:用于注入普通类型 , 进行赋值使用

      @Value(value = "value annotation")
      private String name;
      
    6. 回顾:做这些配置的时候,全部用注解完成,仅仅写了一行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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context   http://www.springframework.org/schema/context/spring-context.xsd"><!--   开启扫描     1 如果扫描多个包,多个包使用逗号隔开 2 扫描包上层目录 -->
      <context:component-scan base-package="com.emnets.spring5"></context:component-scan>
      </beans>
      
  6. 完全注解开发

    1. 不使用配置文件,将之前那一行配置代码转移到注解中

    2. 第一步:创建配置类,替代xml配置文件

      @Configuration      //  作为配置类,替代配置文件
      @ComponentScan(basePackages = {"com.emnets.spring5"})
      public class SpringConfig {}
      
    3. 第二步:写测试类

      @Test
      public void testService2(){//  加载配置类ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);UserService userService = context.getBean("userService", UserService.class);System.out.println(userService);userService.add();
      }
      

相关文章:

Spring学习20230208-09

IOC底层原理 IOC概念 &#xff1a;面向对象编程中的一种设计原则&#xff0c;用来降低耦合度 通过控制反转&#xff0c;对象在被创建的时候&#xff0c;由一个调控系统内所有对象的外界实体将其所依赖的对象引用传递给他。可以说&#xff0c;依赖被注入到对象中。控制反转&…...

tomcat10部署报错WebStatFilter cannot be cast to jakarta.servlet.Filter

异常信息09-Feb-2023 23:08:49.946 严重 [main] org.apache.catalina.core.StandardContext.filterStart 启动过滤器异常[DruidWebStatFilter]java.lang.ClassCastException: com.alibaba.druid.support.http.WebStatFilter cannot be cast to jakarta.servlet.Filterat org.ap…...

Linux修改文件时间或创建新文件:touch

每个文件在Linux下面都记录了许多的时间参数&#xff0c;其实是三个主要的变动时间 修改时间&#xff08;modification time&#xff0c;mtime&#xff09;&#xff1a;当该文件的【内容数据】变更时&#xff0c;就会更新这个时间&#xff0c;内容数据是指文件的内容&#xff…...

原生微信小程序按需引入vant

vant Vant Weapp - 轻量、可靠的小程序 UI 组件库 1.npm安装 找到项目根目录 安装 # 通过 npm 安装 npm i vant/weapp -S --production# 通过 yarn 安装 yarn add vant/weapp --production# 安装 0.x 版本 npm i vant-weapp -S --production 2 .修改 app.json 将 app.jso…...

高性能IO模型:为什么单线程Redis能那么快?

我们通常说Redis是单线程&#xff0c;主要是指Redis的网络IO和键值对读写是由一个线程来完成的。这也是Redis对外提供键值存储服务的主要流程。 但redis的其他功能&#xff0c;比如持久化、异步删除、集群数据同步等&#xff0c;其实是由额外的线程执行的。 Redis为什么用单线…...

【数据集】中国各类水文专业常用数据集合集

1 水文气象数据 1.1 中国站点尺度天然径流量估算数据集&#xff08;1961&#xff5e;2018年&#xff09; 论文&#xff1a; J2022-High-quality reconstruction of China’s natural streamflow-缪驰远&#xff08;北京师范大学地理科学学部&#xff09; 研究内容&#xff1a…...

落枕、肩颈酸痛,用磁疗就可缓解!

睡觉之前还是好好的&#xff0c;一觉醒来脖子莫名疼痛&#xff0c;转都转不了&#xff0c;有时候连肩膀和上肢都难受&#xff0c;很可能是“落枕”了。 落枕引起的肩颈疼痛与多种因素有关&#xff0c;如颈肩部肌肉的过度使用、不良的睡眠姿势或颈肩部受寒湿空气的侵袭&#xff…...

一文教会你如何选择远程桌面(五大主流远程软件全面讲解)

写在前面 作为程序员的我们&#xff0c;随时随地写代码改代码是我们的日常。刚回到家&#xff0c;就被老板、产品经理cue是常有的事。基于这种情况&#xff0c;一般都会随身携带电脑&#xff0c;随时备战&#xff0c;不过每天背着电脑上下班非常不方便。因此资深程序员的解决方…...

【yolov5】yolov5训练自己的数据集全流程----包含本人设计的快速数据处理脚本

关于yolo应用时能用到的脚本集合&#xff0c;推荐收藏&#xff1a; https://chenlinwei.blog.csdn.net/article/details/127299428 1. 工程化快速yolo训练流程指定版&#xff08;无讲解&#xff09; 1.1 抽样数据集xml转txt输出量化分析 python make_dataset.pymake_dataset…...

leaflet 加载CSV数据,显示图形(代码示例046)

第046个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载CSV文件,将图形显示在地图上。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他来练习 文章目录 示例效果配置方式示例源代码(共74…...

百趣代谢组学资讯:槟榔的基因组为雌雄同株植物的性别决定提供见解

文章标题&#xff1a;The genome of Areca catechu provides insights into sex determination of monoecious plants 发表期刊&#xff1a;New Phytologist 影响因子&#xff1a;10.323 作者单位&#xff1a;海南大学 百趣生物提供服务&#xff1a;植物激素高通量靶标定…...

SSO单点登录 - 多系统,单一位置登录,实现多系统同时登录 学习笔记

(1)单点登录 多系统的前提下&#xff0c;单一位置的登录&#xff0c;会实现多系统同时登录的一种技术。 常出现在互联网应用和企业级平台中 如&#xff1a;京东 单点登录一般是用于互相授信的系统&#xff0c;实现单一位置登录&#xff0c;全系统有效的。 注意&#xff1a…...

图解LeetCode——剑指 Offer 32 - III. 从上到下打印二叉树 III

一、题目 请实现一个函数按照之字形顺序打印二叉树&#xff0c;即&#xff1a;第一行按照从左到右的顺序打印&#xff0c;第二层按照从右到左的顺序打印&#xff0c;第三行再按照从左到右的顺序打印&#xff0c;其他行以此类推。 二、示例 2.1> 示例1 提示&#xff1a; …...

【快排与归并排序算法】

作者&#xff1a;指针不指南吗 专栏&#xff1a;算法篇 &#x1f43e;或许会很慢&#xff0c;但是不可以停下&#x1f43e; 文章目录一、快速排序 ( Quick Sort )二、归并排序 ( Merge Sort )总结一、快速排序 ( Quick Sort ) 1.思路 找出一个分界点&#xff0c;随机的调整区间…...

面试官问我:说说你对JMM内存模型的理解?为什么需要JMM?

点个关注&#xff0c;必回关 随着CPU和内存的发展速度差异的问题&#xff0c;导致CPU的速度远快于内存&#xff0c;所以现在的CPU加入了高速 缓存&#xff0c;高速缓存一般可以分为L1、L2、L3三级缓存。基于上面的例子我们知道了这导致了缓存一致 性的问题&#xff0c;所以加入…...

工程管理系统源码之提高工程项目管理软件的效率

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中&#xff0c;管理不畅以及不良的项目执行&#xff0c;往往会导致项目延期、成本上升、回款拖后&#xff0c;最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统&#xff0c;确保…...

SpringBoot集成xxl-job实现

SpringBoot集成xxl-job实现 一、xxl-job介绍 xxl-job是一个分布式任务调度平台&#xff0c;核心设计目标是开发迅速、学习简单、轻量级、易扩展。源码&#xff1a;下载地址编译环境&#xff1a;Maven3、Jdk1.8、MySQL5.7 二、调度中心 初始化调度数据库&#xff0c;执行指定…...

欧几里得度量和余弦度量的可取消生物识别方案

欧几里得度量和余弦度量的可取消生物识别方案 便捷的生物识别数据是一把双刃剑&#xff0c;在为生物识别认证系统的繁荣铺平道路的同时&#xff0c;也带来了个人隐私问题。为了缓解这种担忧&#xff0c;提出了各种生物特征模板保护方案来保护生物特征模板免于信息泄露。现有提案…...

平板作为主机扩展屏的实现

网上有许多教程使用平板作为电脑的拓展屏&#xff0c;但是多数都是需要在电脑和平板上都装上服务器和客户端的软件才行&#xff0c;而且有些系统还没有对应的软件。 那有没有一种方法只需要在主机上运行一个软件&#xff0c;而平板上只需要扫个码就行呢&#xff1f; 答案是当然…...

HTTP和HTTPS有什么区别?如何实现网站的HTTPS?

细心的朋友会发现&#xff0c;我们在浏览网站时&#xff0c;有的网址以http开头&#xff0c;而有的网站却以https开头&#xff0c;那这两者之间有什么区别吗&#xff1f;http的网站如何能变成https呢&#xff1f;本文中科三方针对这个问题做下简单介绍。 什么是http&#xff1…...

Rockstar Games遭黑客攻击,《侠盗猎车手6》90个开发视频外泄

当地时间9月19日&#xff0c;视频游戏开发商Rockstar Games证实&#xff0c;其 热门游戏《侠盗猎车手6》&#xff08;Grand Theft Auto&#xff09;开发片段遭到黑客大规模窃取 &#xff0c;这一泄露事件立即在游戏圈迅速传播。 据报道&#xff0c; 上周末黑客至少泄露了90个游…...

RabbitMQ-客户端源码之AMQPImpl+Method

AMQPImpl类包括AMQP接口&#xff08;public class AMQImpl implements AMQP&#xff09;主要囊括了AMQP协议中的通信帧的类别。 这里以Connection.Start帧做一个例子。 public static class Connection {public static final int INDEX 10;public static class Startextends…...

雅思经验(7)

我发现雅思阅读要命的不是难度&#xff0c;而是时间的把控。考试时间是总共一小时&#xff0c;但是要写三篇文章&#xff0c;之后总共40道题目&#xff0c;也就是说每篇文章平均是13.3道。但是他们很多人说&#xff0c;如果誊写答案需要花掉3、4分钟每篇&#xff0c;也就是说真…...

Ubuntu20.04 用 `hwclock` 或 `timedatectl` 设置RTC硬件时钟为本地时区

Ubuntu20.04用 hwclock 或 timedatectl 设置硬件时区为本地时区 可以用hwclock命令 sudo hwclock --localtime --systohc&#x1f446;效果等同&#x1f447; , --localtime的简写是-l ; --systohc的简写是-w sudo hwclock -l -w也可以用timedatectl命令 &#x1f446;效果等…...

大学物理·第15章【量子物理】

黑体 斯特藩玻耳兹曼定律 维恩定律 光电效应 在光照射下 &#xff0c;电子从金属表面逸出的现象&#xff0c;叫光电效应. 逸出的电子&#xff0c;叫光电子 经典理论&#xff1a; 光电流值与入射光强成正比截止频率&#xff08;红限&#xff09;v0对某种金属来说&#xff0c;只有…...

2010-2019年290个地级市经济发展与城市绿化数据

2010-2019年290个地级市经济发展与城市绿化数据 1、时间&#xff1a;2010-2019年 2、来源&#xff1a;城市统计NJ&#xff0c;缺失情况与NJ一致 3、范围&#xff1a;290个地级市 4、指标&#xff1a; 综合经济&#xff1a;地区生产总值、人均地区生产总值、地区生产总值增…...

【CSS 布局】-多列布局

一、两列布局 两列布局&#xff1a;一列定宽(也有可能由子元素决定宽度)&#xff0c;一列自适应的布局。 创建一个父盒子&#xff0c;和子盒子 <div class"container clearfix"><div class"left ">定宽</div><div class"right…...

从C语言向C++过渡

文章目录前言1.命名空间1.域的概念2.命名空间的使用2.C输入&输出3.缺省参数1.概念2.分类3.注意事项4.函数重载5.引用1.概念2.使用注意事项3.引用使用场景4.指针和引用的区别6.内联函数7.auto关键字8.nullptr前言 C被成为带类的C,本文由C语言向C过度&#xff0c;将会初步介…...

Matter 研讨会回顾(第三期)|乐鑫 Matter 免开发方案与证书服务介绍

1 月 17 日&#xff0c;乐鑫举办了以“乐鑫 Matter 免开发方案与证书服务介绍”为主题的第三期 Matter 线上研讨会&#xff0c;介绍乐鑫开箱即用的 ESP-ZeroCode 模组及其免开发 Matter 方案&#xff0c;以及证书生成和预配置相关服务。欢迎观看研讨会的视频回放了解详情。&…...

函数栈帧的创建和销毁——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰来为大家介绍一个知识点——函数栈帧的创建和销毁。其实这个知识点&#xff0c;我们很早之前就要讲&#xff0c;但是因为我的一系列原因&#xff0c;才一直拖到了现在&#xff0c;那么&#xff0c;话不多说&#xff0c;让我们一起…...