Spring的Bean意义

news2024/10/6 0:35:10

一、Spring概述

1. Spring家族

  • 官网:https://spring.io
  • Spring发展到今天已经形成了一种开发的生态圈,Spring提供了若干个项目,每个项目用于完成特定的功能。
    在这里插入图片描述

2. Spring体系结构

⑴. Spring Framework系统架构图

Spring Framework是Spring生态圈中最基础的项目,是其他项目的根基
在这里插入图片描述
在这里插入图片描述

⑵. Spring Framework 学习路线

在这里插入图片描述

3. Spring核心概念

⑴. 目前我们代码存在的问题

在这里插入图片描述

  • 代码书写现状:耦合度偏高
  • 解决方案:使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象

⑵. 核心概念

IOC(Inversion of Control)控制反转:
使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。通俗的讲就是 将new对象的权利交给Spring,我们从Spring中获取对象使用即可

Spring技术对IoC思想进行了实现:

  • Spring提供了一个容器,称为IOC容器,用来充当IoC思想中的“外部”
  • IOC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IoC容器中统称为Bean

DI(Dependency Injection)依赖注入:
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入。
在这里插入图片描述
目标:

  • 充分解耦
  • 使用IoC容器管理bean(IOC)
  • 在IoC容器内将有依赖关系的bean进行关系绑定(DI)

最终效果: 使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系



二、IOC和DI入门案例

Gitee仓库: https://gitee.com/yuan0_0/spring_frame_quick-start.git

1. 思路分析

  1. 管理什么?(Service与Dao)
  2. 如何将被管理的对象告知IOC容器?(配置文件)
  3. 被管理的对象交给IOC容器,如何获取到IoC容器?(接口)
  4. IOC容器得到后,如何从容器中获取bean?(接口方法)
  5. 使用Spring导入哪些坐标?(pom.xml)

实现步骤:
【第一步】导入Spring坐标
【第二步】定义Spring管理的类(接口)
【第三步】创建Spring配置文件,配置对应类作为Spring管理的bean对象
【第四步】初始化IOC容器(Spring核心容器/Spring容器),通过容器获取bean对象

2. 搭建示例项目

⑴. 创建项目

在这里插入图片描述

⑵. 服务层

新建 src/main/java/com/it/service/BookService.java 文件:

public interface BookService {
    public void save();
}

⑶. 服务处实现类

新建 src/main/java/com/it/service/impl/BookServiceImpl.java 文件:

public class BookServiceImpl implements BookService {
    private BookDao bookDao = new BookDaoImpl();

    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}

⑷. 数据层

新建 src/main/java/com/it/dao/BookDao.java 文件:

public interface BookDao {
    public void save();
}

⑸. 数据层实现类

新建 src/main/java/com/it/dao/impl/BookDaoImpl.java 文件:

public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
}

⑹. 测试类

新建 src/main/java/com/it/App.java 文件:

public class App {
    public static void main(String[] args) {
        BookService bookService = new BookServiceImpl();
        bookService.save();
    }
}

在这里插入图片描述

3. IOC入门案例

⑴. 导入Spring坐标

编辑 pom.xml 文件:

    <dependencies>
        <!--导入spring的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.10.RELEASE</version>
        </dependency>

        <!--单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

⑵. Spring配置文件

新建 src/main/resources/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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--
        bean标签标示配置bean
        id属性标示给bean起名字
        class属性表示给bean定义类型
    -->
    <bean id="bookDao" class="com.it.dao.impl.BookDaoImpl"/>

    <bean id="bookService" class="com.it.service.impl.BookServiceImpl"/>

</beans>

⑶. 初始化IOC容器

新建src/main/java/com/it/App2.java 文件:

public class App2 {
    public static void main(String[] args) {
        // 1.创建IoC容器对象,加载spring核心配置文件
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

        // 2.从IOC容器中获取Bean对象(bookDao对象)
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        
        // 3.调用Bean对象(bookDao对象)的方法
        bookDao.save();

        System.out.println("-----");

        BookService bookService = (BookService) ctx.getBean("bookService");
        bookService.save();
    }
}

在这里插入图片描述

4. DI入门案例

⑴. 思路分析

  1. 基于IOC管理bean
  2. Service中使用new形式创建的Dao对象是否保留?(否)
  3. Service中需要的Dao对象如何进入到Service中?(提供方法)
  4. Service与Dao间的关系如何描述?(配置)

⑵. 删除使用new的形式创建对象

编辑 src/main/java/com/it/service/impl/BookServiceImpl.java 文件:

public class BookServiceImpl implements BookService {
    // private BookDao bookDao = new BookDaoImpl();
    // 删除业务层中使用new方式创建的Dao对象
    private BookDao bookDao;


    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }
}

⑶. 提供依赖对象对应的setter方法

编辑 src/main/java/com/it/service/impl/BookServiceImpl.java 文件:

public class BookServiceImpl implements BookService {
    // private BookDao bookDao = new BookDaoImpl();
    // 删除业务层中使用new方式创建的Dao对象
    private BookDao bookDao;


    public void save() {
        System.out.println("book service save ...");
        bookDao.save();
    }

    // 提供对应的setter方法
    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}

⑷. 配置service与dao之间的关系

编辑 src/main/resources/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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--
        bean标签标示配置bean
        id属性标示给bean起名字
        class属性表示给bean定义类型
    -->
    <bean id="bookDao" class="com.it.dao.impl.BookDaoImpl"/>

    <bean id="bookService" class="com.it.service.impl.BookServiceImpl">
        <!--配置server与dao的关系
            property标签:表示配置当前bean的属性
            name属性:表示配置哪一个具体的属性
            ref属性:表示参照哪一个bean
        -->
        <property name="bookDao" ref="bookDao" />
    </bean>

</beans>

⑸. 测试结果

在这里插入图片描述

⑹. 图解

在这里插入图片描述



三、Bean

1. Bean配置

⑴. 基础配置

配置说明:

类别描述
名称bean
类型标签
所属beans标签
功能定义Spring核心容器管理的对象
格式<beans><bean/><bean></bean></beans>
属性列表id:bean的id,使用容器可以通过id值获取对应的bean,在一个容器中id值唯一
class:bean的类型,即配置的bean的全路径类名
范例<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl"></bean>

⑵. 别名配置

①. 配置说明

类别描述
名称name
类型属性
所属bean标签
功能定义bean的别名,可定义多个,使用逗号(,)分号(;)空格( )分隔
范例<bean id="bookDao" name="dao bookDaoImpl" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean name="service,bookServiceImpl" class="com.itheima.service.impl.BookServiceImpl"/>

②. bean指定别名

编辑 src/main/resources/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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--
        bean标签标示配置bean
        id属性标示给bean起名字
        class属性表示给bean定义类型
    -->
    <bean id="bookDao" class="com.it.dao.impl.BookDaoImpl"/>

    <!--<bean id="bookService" class="com.it.service.impl.BookServiceImpl">-->
    <!--name:为bean指定别名,别名可以有多个,使用逗号,分号,空格进行分隔-->
    <bean id="bookService" name="service service4 bookEbi" class="com.it.service.impl.BookServiceImpl">
        <!--配置server与dao的关系
            property标签:表示配置当前bean的属性
            name属性:表示配置哪一个具体的属性
            ref属性:表示参照哪一个bean
        -->
        <property name="bookDao" ref="bookDao" />
    </bean>

</beans>

③. 测试类

新建 src/main/java/com/it/AppForName.java 文件:

public class AppForName {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookService bookService = (BookService) ctx.getBean("service");
        bookService.save();
    }
}

在这里插入图片描述

⑶. 作用范围配置

①. 配置说明

类别描述
名称scope
类型属性
所属bean标签
功能定义bean的作用范围,可选范围如下:singleton 单例(默认)、prototype 非单例
范例<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" scope="prototype" />

②. bean指定作用范围

编辑 src/main/resources/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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--<bean id="bookService" class="com.it.service.impl.BookServiceImpl">-->
    <!--name:为bean指定别名,别名可以有多个,使用逗号,分号,空格进行分隔-->
    <bean id="bookService" name="service service4 bookEbi" class="com.it.service.impl.BookServiceImpl">
        <!--配置server与dao的关系
            property标签:表示配置当前bean的属性
            name属性:表示配置哪一个具体的属性
            ref属性:表示参照哪一个bean
        -->
        <property name="bookDao" ref="bookDao" />
    </bean>

    <!--
        bean标签标示配置bean
        id属性标示给bean起名字
        class属性表示给bean定义类型
    -->
    <!--<bean id="bookDao" class="com.it.dao.impl.BookDaoImpl"/>-->
    <!--scope:为bean设置作用范围,可选值为单例singloton,非单例prototype-->
    <bean id="bookDao" class="com.it.dao.impl.BookDaoImpl" scope="prototype"/>

</beans>

③. 测试类

新建 src/main/java/com/it/AppForScope.java 文件:

public class AppForScope {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao1 = (BookDao) ctx.getBean("bookDao");
        BookDao bookDao2 = (BookDao) ctx.getBean("bookDao");
        System.out.println(bookDao1);
        // => com.it.dao.impl.BookDaoImpl@25bbe1b6
        System.out.println(bookDao2);
        // => com.it.dao.impl.BookDaoImpl@5702b3b1
    }
}

④. 说明

在我们的实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性

  • 适合交给容器进行管理的bean: 表现层对象、业务层对象、数据层对象、工具对象
  • 不适合交给容器进行管理的bean: 封装实体的域对象


2. Bean实例化

bean本质上就是对象,创建bean使用构造方法完成

Gitee仓库: https://gitee.com/yuan0_0/spring_frame_bean_instance.git

⑴. 构造方法(常用)

①. 创建项目

在这里插入图片描述

②. spring坐标

编辑 pom.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring_01_bean_instance</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

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

</project>

③. 接口

新建 src/main/java/com/it/dao/BookDao.java 文件:

public interface BookDao {
    public void save();
}

④. 接口实现类

新建 src/main/java/com/it/dao/impl/BookDaoImpl.java 文件:

public class BookDaoImpl implements BookDao {

    // 创建无参构造方法
    public BookDaoImpl() {
        System.out.println("book dao constructor is running ....");
    }

    public void save() {
        System.out.println("book dao save ...");
    }
}

⑤. 配置文件

新建 src/main/resources/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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--方式一:构造方法实例化bean-->
    <bean id="bookDao" class="com.it.dao.impl.BookDaoImpl"/>

</beans>

⑥. 测试类

新建 src/main/java/com/it/AppForInstanceBook.java 文件:

public class AppForInstanceBook {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        bookDao.save();
    }
}

在这里插入图片描述

无参构造方法如果不存在,将抛出异常 BeanCreationException


⑵. 静态工厂(了解)

①. 接口

新建 src/main/java/com/it/dao/OrderDao.java 文件:

public interface OrderDao {
    public void save();
}

②. 实现类

新建 src/main/java/com/it/dao/impl/OrderDaoImpl.java 文件:

public class OrderDaoImpl implements OrderDao {
    public void save() {
        System.out.println("order dao save ...");
    }
}

③. 静态工厂

新建 src/main/java/com/it/factory/OrderDaoFactory.java 文件:

//静态工厂创建对象
public class OrderDaoFactory {
    public static OrderDao getOrderDao(){
        System.out.println("factory setup....");
        return new OrderDaoImpl();
    }
}

④. 配置

新建 src/main/resources/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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--方式一:构造方法实例化bean-->
    <!--<bean id="bookDao" class="com.it.dao.impl.BookDaoImpl"/>-->

    <!--方式二:使用静态工厂实例化bean-->
    <bean id="orderDao" class="com.it.factory.OrderDaoFactory" factory-method="getOrderDao"/>

</beans>

⑤. 测试类

新建 src/main/java/com/it/AppForInstanceOrder.java 文件:

public class AppForInstanceOrder {
    public static void main(String[] args) {
        //通过静态工厂创建对象
        OrderDao orderDao = OrderDaoFactory.getOrderDao();
        orderDao.save();
    }
}

在这里插入图片描述


⑶. 实例化工厂(了解)

①. 接口

新建 src/main/java/com/it/dao/UserDao.java 文件:

public interface UserDao {
    public void save();
}

②. 实现类

新建 src/main/java/com/it/dao/impl/UserDaoImpl.java 文件:

public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("user dao save ...");
    }
}

③. 实例化工厂

新建 src/main/java/com/it/factory/UserDaoFactory.java 文件:

//实例工厂创建对象
public class UserDaoFactory {
    public UserDao getUserDao(){
        return new UserDaoImpl();
    }
}

④. 测试类

新建 src/main/java/com/it/AppForInstanceUser.java 文件:

public class AppForInstanceUser {
    public static void main(String[] args) {
        //创建实例工厂对象
        UserDaoFactory userDaoFactory = new UserDaoFactory();
        //通过实例工厂对象创建对象
        UserDao userDao = userDaoFactory.getUserDao();
        userDao.save();
    }
}

在这里插入图片描述


⑤. 配置

新建 src/main/resources/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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--方式一:构造方法实例化bean-->
    <!--<bean id="bookDao" class="com.it.dao.impl.BookDaoImpl"/>-->

    <!--方式二:使用静态工厂实例化bean-->
    <!--<bean id="orderDao" class="com.it.factory.OrderDaoFactory" factory-method="getOrderDao"/>-->

    <!--方式三:使用实例工厂实例化bean-->
    <bean id="userFactory" class="com.it.factory.UserDaoFactory"/>
    <bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>

</beans>

⑥. 测试类

新建 src/main/java/com/it/AppForInstanceUser.java 文件:

public class AppForInstanceUser {
    public static void main(String[] args) {
//        //创建实例工厂对象
//        UserDaoFactory userDaoFactory = new UserDaoFactory();
//        //通过实例工厂对象创建对象
//        UserDao userDao = userDaoFactory.getUserDao();
//        userDao.save();

        // 实例化工厂
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) ctx.getBean("userDao");
        userDao.save();
    }
}

在这里插入图片描述


⑷. FactoryBean(实用)

①. FactoryBean

新建 src/main/java/com/it/factory/UserDaoFactoryBean.java 文件:

public class UserDaoFactoryBean implements FactoryBean<UserDao> {
    //代替原始实例工厂中创建对象的方法

    // bean实例
    public UserDao getObject() throws Exception {
        return new UserDaoImpl();
    }

    // bean类型
    public Class<?> getObjectType() {
        return UserDao.class;
    }

    // bean作用范围: 单例
    public boolean isSingleton() {
        return true;
    }
}

②. 配置

编辑 src/main/resources/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 http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--方式一:构造方法实例化bean-->
    <!--<bean id="bookDao" class="com.it.dao.impl.BookDaoImpl"/>-->

    <!--方式二:使用静态工厂实例化bean-->
    <!--<bean id="orderDao" class="com.it.factory.OrderDaoFactory" factory-method="getOrderDao"/>-->

    <!--方式三:使用实例工厂实例化bean-->
    <!--<bean id="userFactory" class="com.it.factory.UserDaoFactory"/>
    <bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>-->

    <!--方式四:使用FactoryBean实例化bean-->
    <bean id="userDao" class="com.it.factory.UserDaoFactoryBean"/>

</beans>

③. 测试类

编辑 src/main/java/com/it/AppForInstanceUser.java 文件:

public class AppForInstanceUser {
    public static void main(String[] args) {
//        //创建实例工厂对象
//        UserDaoFactory userDaoFactory = new UserDaoFactory();
//        //通过实例工厂对象创建对象
//        UserDao userDao = userDaoFactory.getUserDao();
//        userDao.save();

        // 实例化工厂
//        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//        UserDao userDao = (UserDao) ctx.getBean("userDao");
//        userDao.save();

        // 测试bean作用范围: 单例/非单例
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao1 = (UserDao) ctx.getBean("userDao");
        UserDao userDao2 = (UserDao) ctx.getBean("userDao");
        System.out.println(userDao1);
        System.out.println(userDao2);
    }
}

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

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

相关文章

四、【React-Router5】样式丢失问题

文章目录1、先上结论2、修改上一节代码3、发现问题4、分析原因5、3个解决办法1、先上结论 public/index.html 中 引入样式时不写 ./ 写 / [ 常用 ]public/index.html 中 引入样式时不写 ./ 写 %PUBLIC_URL% [ 常用 ]使用 HashRouter 2、修改上一节代码 点击访问 上节代码&…

[附源码]SSM计算机毕业设计学生档案管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【错误 :Segmentation fault 】以及gdb调试 core duumped文件

core dumped文件&#xff08;核心转储文件&#xff09; 当进程意外终止&#xff0c;系统可以将该进程的地址空间的内容急终止的一些其它信息转储到核心转储文件 它的触发条件&#xff0c;当系统收到以下信号时就会产生coredumped文件。 SIGABRT &#xff1a;异常终止(abort)时…

野火FPGA进阶(1):基于SPI协议的Flash驱动控制

文章目录第48讲&#xff1a;基于SPI协议的Flash驱动控制0. 理论部分1. Flash全擦除实验key_filterflash_be_ctrlspi_flash_betb_flash_be_ctrltb_spi_flash_be2. Flash扇区擦除实验key_filterflash_se_ctrlspi_flash_se3. 数据读操作key_filteruart_txflash_read_ctrlspi_flash…

专注于元宇宙实际应用方案的企业

元宇宙的话题持续火热。国内互联网大厂正在加大对元宇宙相关技术和应用的研发&#xff0c;元宇宙正在逐步成为创新创业的主战场。企业元宇宙在教育、会展、文创、旅游、博物馆、文化艺术、娱乐、社交、版权、零售等等领域发力&#xff0c;增加客户对企业的认同。 也许未来只需一…

接口测试学习第一天

1. 接口 接口的定义&#xff1a;是指系统或组件之间的交互点&#xff0c;通过这些交互点可以实现数据的交互。&#xff08;数据交互的通道&#xff09; 接口的分类&#xff1a;硬件接口和软件接口&#xff1b;我们这里只关注软件层面的接口&#xff1b; 1.1 接口的类型 接…

LeetCode-28-找出字符串中第一个匹配项的下标

1、KMP算法$$ 解决本问题最简单的方法就是暴力穷举&#xff0c;思路简单但时间复杂度为O(m∗n)O(m*n)O(m∗n)。此处我们仅考虑最优的KMP算法&#xff0c;时间复杂度为O(mn)O(mn)O(mn)。 KMP算法的优化之处在于当我们对比haystackhaystackhaystack和needleneedleneedle时&…

[附源码]计算机毕业设计springboot基于Java酒店管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

亚马逊商品销售数据爬虫分析报告

家电产业和消费者升级悄然地展开。 市场的这种变化使消费者对家用电器的期望不再仅仅是一个简单的功能满足&#xff0c;而是更多的细节体验和技术创新。 通过洞察家用电器的消费特点&#xff0c;有利于确定市场的未来趋势&#xff0c;从而积极应对市场变化。 ▼ 我们围绕亚马逊…

AI智能视频技术在考古工作中的安防应用

文物考古关系着民族文化的传承、历史的记录与保留&#xff0c;工作意义重大。考古发掘工地由于面积大、区域多且分散&#xff0c;以及周边环境复杂&#xff0c;因此安全防护工作开展困难&#xff0c;整体的安全形势不容乐观。 一、考古现场安保面临问题&#xff1a;1、考古遗址…

K - Scholomance Academy Gym - 103202K

题目链接 题意&#xff1a;很长&#xff0c;读了很长时间才懂&#xff1a; 就是给一个物品评分&#xff0c;假设分数大于等于x&#xff0c;就将其判断为正数&#xff0c;否则判断为负数 这样判断肯定会出现一些误判&#xff0c;那么我们将判为负数的正数成为假正数&#xff0…

C. Set or Decrease(二分 + 有两个不确定情况如何二分)

Problem - 1622C - Codeforces 给你一个整数数组a1,a2,...,an和整数k。 在一个步骤中&#xff0c;你可以 选择某个索引i并将ai减少1&#xff08;使aiai-1&#xff09;。 或者选择两个索引i和j&#xff0c;将ai等于aj&#xff08;使aiaj&#xff09;。 为了使数组∑i1nai≤k的…

启动服务提供者报 zookeeper not connected错

今天启动zookeeper的服务提供者后&#xff0c;报 zookeeper not connected错&#xff0c;记录一下解决过程 意思是zookeeper注册中心连接不上&#xff0c;无非两个原因&#xff1a; 第一&#xff1a;zookeeper没有启动好。第二&#xff1a;zookeeper的ip以及端口号配置没配好 …

算法day35|860,406,452

目录 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球 860.柠檬水找零 class Solution:def lemonadeChange(self, bills: List[int]) -> bool:five,ten,twenty 0,0,0for bill in bills:#情况一&#xff1a;如果bills是5元&#xff0c;不需要找零if bill…

黑马点评--附近商铺

附近商铺 GEO数据结构 GEO就是Geolocation的简写形式&#xff0c;代表地理坐标。Redis在3.2版本加入了对GEO的支持&#xff0c;允许存储地理坐标消息&#xff0c;帮助我们根据经纬度来检索数据。常见的命令有&#xff1a; GEOADD&#xff1a;添加一个地理空间信息&#xff0…

gcexcel-java-5.2.5 Crack update in 2022-11-28

gcexcel高速 Java Excel 电子表格 API 库 在 Java 应用程序中以编程方式创建、编辑、导入和导出 Excel 电子表格。几乎可以在任何地方部署。 创建、加载、编辑和保存 Excel 电子表格 保存为 .XLSX、PDF、HTML、CSV 和 JSON 基于具有零 Excel 依赖性的 Excel 对象模型 在本地、…

Tomcat负载均衡部署动静分离

NginxTomcat架构拓扑 环境部署 Nginx服务器&#xff1a;IP地址192.168.32.3 Tomcat服务器1&#xff1a;IP地址192.168.32.4 Tomcat服务器2&#xff1a;IP地址192.168.32.5 关闭防火墙&#xff0c;关闭开机自启 systemctl stop firewalld.service setenforce 0Nginx 主机安…

计算机组成原理习题课第三章-1(唐朔飞)

计算机组成原理习题课第三章-1&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&…

高电压放大器与高电流放大器该如何选择使用

虽然电压放大器和电流放大器都属于功率放大器的分支类型&#xff0c;所能起到的效果和作用也都是一致的&#xff0c;不过两者还是细微差别的。经常会有人在后台咨询“电压放大器和电流放大器有什么区别&#xff0c;该如何选择使用”等等&#xff0c;针对这些疑问&#xff0c;今…

zynq实现视频动态字符叠加OSD,提供2套工程源码和技术支持

目录1.网上同行的OSD方案(太low)2.本方案OSD的优势3.HLS实现方案4.OSD延时和资源占用情况5.工程1&#xff1a;zynq7100实现字符叠加6.上板调试验证7.福利&#xff1a;工程源码获取1.网上同行的OSD方案(太low) 视频的字符叠加&#xff0c;简称OSD&#xff0c;是FPGA图像处理的基…