Spring的创建及使用

文章目录

    • 什么是Spring
    • Spring项目的创建
    • 存储Bean对象
    • 读取Bean对象
      • getBean()方法
    • 更简单的读取和存储对象的方式
      • 路径配置
      • 使用类注解存储Bean对象
      • 关于五大类注解
      • 使用方法注解@Bean存储对象
        • @Bean重命名
      • Bean对象的读取
    • 使用@Resource注入对象
    • @Resource VS @Autowired
    • 同一类型多个bean对象的读取问题

什么是Spring

Spring一般是指Spring Framework,即Spring框架。它是一个强大的java开发框架,可以支持多种应用场景;通过使用Spring框架,可以极大程度地简化开发流程,提高开发效率。

常见的对Spring的概括是:Spring是包含了众多工具方法的Ioc容器;

包含了“众多工具方法”不难理解,那么什么是所谓的Ioc容器呢?

Ioc实际上就是Inversion Control,即控制反转。在传统的开发模式中,对于在A类中使用B类这样一个场景,就需要在A类中创建B类的对象。这样,关于这个被创建的B类的对象,A就可以控制这个对象的所有行为,包括创建、使用、销毁。而如果是使用控制反转的开发模式,就是将这个对B类对象的控制权交出去,交给Spring去控制。也就是说,控制反转实际就是控制权的反转。

很明显,传统的开发模式存在一定的问题,即当代码或程序之间的调用关系过于复杂,就会存在修改了一个程序的代码之后,可能就需要修改对应的调用链上的一系列代码。但控制反转的开发模式则是可以很好地解决这个问题,实现代码之间的解耦。

可以使用代码来进行理解:

既然Ioc就是控制权反转的意思,那么容器又是指什么呢?在日常生活中的容器,就是用来容纳某种东西的一个装置,容器最大的作用也就是存和取。因此对于这样一个Ioc容器而言,两个最基础的功能应该也就是:存入对象到容器、从容器取出对象;

而对于Spring而言,将对象存储到Spring中,再根据需要从Spring中获取对象的过程其实也就是它最核心的功能或步骤;

Spring项目的创建

  1. 创建一个Maven项目;

在这里插入图片描述

在这里插入图片描述

  1. 添加需要的Spring框架依赖到pom.xml,包括Spring上下文和spring对象;
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.3.RELEASE</version></dependency>
</dependencies>

添加完成以后一定要进行刷新,确保依赖已经下载成功;

在这里插入图片描述
如上,表示下载成功;

  1. 在java文件夹下创建一个启动类(包含main方法即可);

在这里插入图片描述

至此,一个spring文件就创建成功了!

存储Bean对象

首先就是spring的第一个关键功能,存储对象到spring中,具体操作如下:

  1. 创建一个Bean对象;

Bean对象实际也只是java中的一个普通对象,创建在java文件夹下即可:

在这里插入图片描述

  1. 将bean对象注册到spring中;

在resources文件夹下创建一个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"></beans>

(上面的格式是固定内容,不需要记忆)

将之前创建的bean对象注册到spring中:

在这里插入图片描述
id是对象的标识,在之后取对象时会用到;class是指明了bean对象的位置(包名+类名);

读取Bean对象

  1. 得到Spring上下文;
  2. 从spring上下文获取bean对象;
  3. 根据需要使用bean对象;
package com.yun;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Start {public static void main(String[] args) {//1.得到spring上下文对象ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");//2.从spring上下文中取出bean对象User user=(User) context.getBean("user");//3.使用bean对象user.fun();}
}

在得到spring上下文对象时,需要指明对应的spring配置文件;

从spring上下文获取bean对象时,括号中的内容需要与配置文件中id一一对应;

getBean()方法

关于读取Bean对象的getBean()方法,其实还有多种重载方法可以来获取Bean对象:

  • 直接根据对象的id(名称)来获取bean对象;
  • 根据类型来获取bean对象;
  • 使用名称+类型的方式来获取bean对象;

使用代码进行演示:

在这里插入图片描述

三种方式各有优劣,一般来说,如果使用名称获取的方式,必须保证在配置文件中的id是唯一的;如果使用类型的方式获取,当出现同一个类型被多次注册到配置文件中时(即一下面所示的情况),程序就会出错;

在这里插入图片描述

更简单的读取和存储对象的方式

关于前面整个Bean对象的存储和读取的过程,实际还是较为繁琐的;为了简化其流程,我们使用注解来完成一种更加简单的存储和读取过程;

路径配置

在进行更简单的方式之前,我们首先需要完成Bean对象扫描路径的配置工作:

即在spring-config.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:content="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"><content:component-scan base-package="com.yun">
</content:component-scan>
</beans>

在这里插入图片描述
需要根据自己的代码的具体路径来修改上面图片红色方框中的路径,这实际就是Spring的扫描路径,只有在该路径下的Bean对象才会被存储到Spring中;

使用类注解存储Bean对象

在Spring中,提供了五大类注解可以实现将对象存储到Spring,分别是@Controller @Service @Repository @Component @Configuration ;

  • @Controller
    该注解主要是负责控制器存储,使用代码演示:
package com.yun.controller;import org.springframework.stereotype.Controller;@Controllerpublic class UserController {public void sayHello(){System.out.println("Hello~Controller");}
}

此时就可以读取到这里存储的UserController对象:

public class App {public static void main(String[] args) {//1.获取到Spring上下文对象ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");//2.从Spring上下文取出bean 对象// 使用注解默认的命名规则是小驼峰UserController userController=context.getBean("userController",UserController.class);//3.使用bean对象userController.sayHello();}
}

在这里插入图片描述

@Controlller注解使用中文翻译就是控制器的意思,主要是负责验证前端传递过来的参数,起到一个“安全检查”的作用;

  • @Service

该注解是负责服务存储;

package com.yun.service;import org.springframework.stereotype.Service;@Service
public class UserService {public void helloSer(){System.out.println("Hello~Service");}
}

在这里插入图片描述

@Service注解主要是负责了服务调用的编排和汇总;

  • @Repository

该注解负责仓库存储;

package com.yun.repository;import org.springframework.stereotype.Repository;@Repository
public class UserRepository {public void doRepository(){System.out.println("Hello~Repository");}
}

@Repository该注解的中文意思为仓库,使用该注解可以直接操作数据库;

  • @Component

该注解负责组件存储;

package com.yun.component;import org.springframework.stereotype.Component;@Component
public class UserComponent {public void doComponent(){System.out.println("Hello~Component");}
}

@Component 该注解表示了组件的意思,主要是负责一些通用化的工具类;

  • @Configuration

该注解负责配置存储;

package com.yun.configuration;import org.springframework.context.annotation.Configuration;@Configuration
public class UserConfiguration {public void doConfiguration(){System.out.println("Hello~Configuration");}
}

@Configuration该注解表示配置,负责了项目所需要的相关的所有配置;

使用五大类注解存储Bean对象的方法如上,而关于使用相关注解的Bean对象的读取,也是首先获取Spring的上下文,再通过上下文得到bean对象,最后使用bean对象;

关于五大类注解

  • 首先,为什么需要如此多的类注解呢?

如果是单从上面使用类注解来存储Bean对象的操作来看,似乎每一个类注解起到的作用都是相同的。但在实际的业务开发中,使用不同的类注解可以清晰的表明当前类的用途,这也就是前面说到不同的类注解负责的业务或模块是不同的;

  • 五大类注解之间的关系?

如果我们尝试去溯源五大注解的源码,就会发现:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看到, @Controller / @Service / @Repository / @Configuration四个注解的实现实际上都借助了@Component注解来实现,所有它们之间的关系也就显而易见,即可以简单地理解为前面四种注解是@Component的子类;

  • 使用五大类注解时Bean对象的命名

在上面的代码中,我们关于类名都是使用了大驼峰的方式进行标准的命名,在读取bean时则是默认使用了首字母小写的方式,最后也如愿读取成功了,关于这样使用的原因,我们同样可以溯源到相关的源码:

在这里插入图片描述

在这里插入图片描述

bean的命名方式在默认情况下使用类名首字母小写的方式进行;
特殊情况下,当类名的前两个字母均为大写的情况下,bean的命名直接使用原类名即可;

使用方法注解@Bean存储对象

方法注解@Bean,顾名思义就是使用在方法上的;方法注解正常使用的前提是:搭配类注解一起使用;

使用代码进行演示:

package com.yun.controller;import com.yun.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;@Component
public class UserBeans {@Beanpublic User user(){User user=new User();user.setId(1);user.setName("张三");user.setAge(18);return user;}
}

在这里插入图片描述

使用方法注解存储的Bean对象,在后续使用Bean对象时,是直接使用方法名来命名Bean对象;

另外,关于方法注解,只能使用在无参的方法上,因为Spring在初始化存储时,无法提供相应的参数;

@Bean重命名

当然,除了直接使用方法名,在Spring中关于方法注解的使用,还可以通过为Bean对象设置name属性来达到重命名的目的;

重命名的设置方法有三种方式:

  • 显示使用name属性重命名

在这里插入图片描述

  • 直接使用双引号重命名

在这里插入图片描述

  • 显式使用name属性进行多个重命名;

在这里插入图片描述
当然,在对Bean进行了重命名以后,就不能再使用原来的方法名获取Bean对象了;

Bean对象的读取

Bean对象的读取即,将对象读到以后放到某个类中,也称为对象装配或对象注入;

对象注入的方式有下面3种:

  • 属性注入

借助@Autowired注解实现,使用代码演示:

service部分的原始代码:

package com.yun.service;import org.springframework.stereotype.Service;
@Service
public class UserService {public boolean helloSer(){System.out.println("Hello~Service");return true;}
}

将UserService注入到UserController类中:

package com.yun.controller;import com.yun.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;@Controllerpublic class UserController {//将service中的UserService注入到了该类中@Autowiredprivate UserService userService;public void sayHello(){System.out.println(userService.helloSer());}
}

使用bean对象进行验证注入是否成功;

import com.yun.controller.UserController;
import com.yun.model.User;
import com.yun.repository.UserRepository;
import com.yun.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {//1.获取到Spring上下文对象ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");//2.从Spring上下文取出bean 对象UserController userController=context.getBean("userController",UserController.class);//使用bean对象userController.sayHello();}
}

运行结果:

在这里插入图片描述

  • Setter注入
    需要在属性的set方法上加上@Autowired注解来实现;

service中的代码基本保持不变;

package com.yun.service;import org.springframework.stereotype.Service;@Service
public class UserService {public boolean helloSer(){System.out.println("setter~Service");return true;}
}

在controller中改变注入对象的方式:

package com.yun.controller;import com.yun.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;@Controllerpublic class UserController {//将service中的UserService注入到了该类中private UserService userService;@Autowiredpublic void setUserService(UserService userService){this.userService=userService;}public void sayHello(){System.out.println(userService.helloSer());}
}

最后进行验证的代码与前面相同,下面是具体的运行结果:

在这里插入图片描述

  • 构造方法注入

构造方法注入是在当前类的构造方法中实现注入,同样使用到了@Autowired注解;

package com.yun.controller;import com.yun.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;@Controllerpublic class UserController {//将service中的UserService注入到了该类中private UserService userService;@Autowiredpublic UserController(UserService userService){this.userService=userService;}public void sayHello(){System.out.println(userService.helloSer());}
}

其余部分的代码与前面基本相同;

三种对象注入的方式各有特点,下面是对其各自优缺点的分析:

  1. 属性注入

优点:

  • 代码简洁,使用方便;

缺点:

  • 只适用于IOC容器,代码的可移植性不强;
  • 无法注入不可变的对象(final修饰的对象);
  • 容易违反单一设计原则;

使用属性注入的方式,代码量少,使用方便又简单;但也是由于这一点,违反单一设计原则、代码滥用的概率也相应增加;同时由于spring 是基于java环境实现,也必须遵守final关键字的使用规范,即不可以使用属性注入一个final修饰的对象。

  1. setter注入;

优点:

  • 符合单一设计原则;

缺点:

  • 无法注入一个不可变的对象;
  • 注入的对象存在被修改的概率;

在spring 4.2之前,这是官方推荐使用的注入方式,它遵循了单一设计原则;但由于set方法在代码中可能被多次调用,也相应地被修改的概率要更大。

  1. 构造方法注入;

优点:

  • 可以注入final修饰的对象;
  • 注入的对象没有被修改的概率;
  • 所依赖的对象在使用之前就会被完全初始化;
  • 代码的通用性更强;

缺点:

  • 当有多个注入时,代码略显臃肿;

在spring 4.2 之后,构造方法注入成为了官方推荐的注入方式。由于构造方法是会在类创建之初执行一次,因此使用这种方式注入的对象不会被修改,同时对象在使用之前就进行了初始化;另外因为构造方法是由JDK支持实现,因此使用这种方式注入的代码的通用性要更强。

进行对象的注入,除了使用前面提到的@Autowired注解,实际还有一个注解同样可以实现对象的注入;

使用@Resource注入对象

同样使用代码来演示@Resource的对象注入方式;

  • 属性注入;

创建一个UserService2类;

package com.yun.service;import org.springframework.stereotype.Service;
@Service
public class UserService2 {public void doService(){System.out.println("Do Service!");}
}

将上面创建的对象使用@Resource注入到UserController2中;

package com.yun.controller;import com.yun.service.UserService2;
import org.springframework.stereotype.Controller;import javax.annotation.Resource;
import java.nio.file.attribute.UserPrincipalLookupService;@Controller
public class UserController2 {@Resourcepublic UserService2 userService2;public void doController(){userService2.doService();}}

在这里插入图片描述

  • setter注入;
package com.yun.controller;import com.yun.service.UserService2;
import org.springframework.stereotype.Controller;import javax.annotation.Resource;
import java.nio.file.attribute.UserPrincipalLookupService;
@Controller
public class UserController2 {private UserService2 userService2;@Resourcepublic void setUserService2(UserService2 userService2) {this.userService2 = userService2;}public void doController(){userService2.doService();}}

直接看运行结果:
在这里插入图片描述

  • 构造方法注入

在这里插入图片描述

可以看到@Resource注解不能使用在构造方法注入的实现上;

@Resource VS @Autowired

既然两种注解都可以实现对象的注入,那么它们又具体有什么区别呢?

  • 方法数量上;

首先从java为两种注解提供的方法就可以发现,@Resource注解是包含了有众多的方法,而@Autowired则只有一个方法;
在这里插入图片描述
在这里插入图片描述
可以看到@Resource相对于@Autowired而言,支持更多的参数设置

  • 匹配对象的顺序;

@Autowired在从spring中查找相应的bean对象时,首先会根据对象的类的类型进行匹配,在未匹配成功的情况下,继续使用bean的名称来匹配;
@Resource则是首先进行bean名称的匹配查找,后进行类型的查找;

  • 出身来源不同;
    @Autowired是由spring提供的,而@Resource则是属于JDK的注解;

同一类型多个bean对象的读取问题

在一些特定的场景中,可以需要将同一类型的多个bean对象存储到spring中,在这种情况下,对于bean对象的读取必然会出现下面的错误:

首先创建一个类,这个类中包含了多个User类型的对象,再将User类型的对象使用方法注解存储到spring中;

package com.yun.controller;import com.yun.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;@Component
public class UserBeans {@Beanpublic User user1(){User user=new User();user.setId(1);user.setName("张三");user.setAge(18);return user;}@Beanpublic User user2(){User user=new User();user.setId(2);user.setName("李四");user.setAge(19);return user;}@Beanpublic User user3(){User user=new User();user.setId(3);user.setName("王五");user.setAge(20);return user;}
}

将User类注入注入到该类中:

package com.yun.controller;import com.yun.model.User;
import org.springframework.stereotype.Controller;import javax.annotation.Resource;@Controller
public class UserController3 {@Resourceprivate User user;public void doCon(){System.out.println(user.getName()+" "+user.getAge());}
}

在读取时发现出现了下面的报错信息:
在这里插入图片描述
在这里插入图片描述
通过报错信息,我们找到产生问题的原因就是:我们此处的bean对象不是唯一的,在同一类型下找到了多个匹配的bean对象,下面是相关的解决办法:

  • 使用@Resource注解注入,通过设置参数指定bean对象;在这里插入图片描述

  • 使用@Autowired注解注入,搭配@Qualifier 注解一起使用;

在这里插入图片描述
使用上面两种方式修改代码,即可得到正确的运行结果;

至此,关于Spring的创建以及将对象如何存储到Spring中,再从Spring中读取的全过程就介绍完毕啦~

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

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

相关文章

怎么让表格中的一行数据 转置 为一列数据 (WPS )

例如 我现在有一列数据 我想要 变成一行 数据 1.首先选中想要转置的数据&#xff0c;然后control C 2.接着 点击你想放置数据的位置 右键 其实 关键是 找到 选择性复制 3. 找到转置&#xff0c;勾选 最后 确定 反之亦然

PoseiSwap:基于 Nautilus Chain ,构建全新价值体系

在 DeFi Summer 后&#xff0c;以太坊自身的弊端不断凸显&#xff0c;而以 Layer2 的方式为其扩容成为了行业很长一段时间的叙事方向之一。虽然以太坊已经顺利的从 PoW 的 1.0 迈向了 PoS 的 2.0 时代&#xff0c;但以太坊创始人 Vitalik Buterin 表示&#xff0c; Layer2 未来…

TWS真无线蓝牙耳机哪家好?六款口碑好的TWS真无线蓝牙耳机分享

为了帮助大家在这个充满选择的世界中找到最理想的蓝牙耳机&#xff0c;我们特别为您精心挑选了几款备受赞誉的产品&#xff0c;它们在音质、舒适度、功能和性价比等方面都有出色的表现。在本文中&#xff0c;我们将深入探讨这些蓝牙耳机的特点和优势&#xff0c;帮助您更好地了…

智能化RFID耳机装配系统:提升效率、精准追踪与优化管理

智能化RFID耳机装配系统&#xff1a;提升效率、精准追踪与优化管理 在当今的智能化时代&#xff0c;无线射频识别技术&#xff08;RFID&#xff09;被广泛应用于各个行业。本文将介绍一种基于RFID技术的智能耳机装配案例&#xff0c;通过RFID技术实现耳机装配过程的自动化控制…

Github Pages自定义域名

Github Pages自定义域名 当你想在网上发布内容时&#xff0c;配置Github Pages是一个很好的选择。如果你想要在自己的域名上发布&#xff0c;你可以使用Github Pages来创建自己的网站。本文将介绍如何使用Github Pages自定义域名。 这里呢先列出前置条件&#xff1a; 您的Gi…

在使用Python爬虫时遇到503 Service Unavailable错误解决办法汇总

在进行Python爬虫的过程中&#xff0c;有时会遇到503 Service Unavailable错误&#xff0c;这意味着所请求的服务不可用&#xff0c;无法获取所需的数据。为了解决这个常见的问题&#xff0c;本文将提供一些解决办法&#xff0c;希望能提供实战价值&#xff0c;让爬虫任务顺利完…

mysql的json处理

需要注意&#xff0c;5.7以上版本才支持&#xff0c;但如果是生产环境需要使用的话&#xff0c;尽量使用8.0版本&#xff0c;因为8.0版本对json处理做了比较大的性能优化。你你可以使用select version();来查看版本信息。 本文看下MySQL的json处理。在正式开始让我们先来准备一…

DTCC2023第十四届中国数据库大会分享:MySQL性能诊断平台:利用eBPF技术实现高效的根因诊断

主题 8月16-18日 DTCC2023第十四届中国数据库大会在北京国际会议中心召开&#xff0c;17日下午在云原生数据库开发与实践分论坛&#xff0c;我将带来分享&#xff1a;《MySQL性能诊断平台&#xff1a;利用eBPF技术实现高效的根因诊断》敬请期待&#xff01; 欢迎大家提前试用我…

zsh中安装ros-<ros2-distro>-turtlebot3*失败 || 以humble为例

在zsh中尝试使用 sudo apt install ros-<ros2-distro>-turtlebot3* 安装turtlebot3相关仿真包失败&#xff0c;报错E: 无法定位软件包。 但是在bash中尝试使用同样的命令却可以安装。 原因是zsh中如果要使用通配符&#xff0c;那么一定要放在字符串里&#xff0c;以上…

不能乱点链接之获取cookie

这里是浏览器存储的某个网址的cookie 然后点击了链接就把参数获取到 因为document.cookie 会直接获取到浏览器cookie 所以为了拦截 存cookie的时候要设置&#xff1a; 设置httpOnly 只要http协议能够读取和携带 再document.cookie 就为空了 原文链接&#xff1a; 尚硅谷课程…

Github-Copilot初体验-Pycharm插件的安装与测试

引言&#xff1a; 80%代码秒生成&#xff01;AI神器Copilot大升级 最近copilot又在众多独角兽公司的合力下&#xff0c;取得了重大升级。GitHub Copilot发布还不到两年&#xff0c; 就已经为100多万的开发者&#xff0c;编写了46%的代码&#xff0c;并提高了55%的编码速度。 …

下级平台级联视频汇聚融合平台EasyCVR,层级显示不正确的原因排查

视频汇聚平台安防监控EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等…

什么是线程?为什么需要线程?和进程的区别?

目录 前言 一.线程是什么&#xff1f; 1.1.为什么需要线程 1.2线程的概念 1.3线程和进程的区别 二.线程的生命周期 三.认识多线程 总结 &#x1f381;个人主页&#xff1a;tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主 &#x1f3a5; 本文由 tq02 原创&#xf…

【机器学习】Feature scaling and Learning Rate (Multi-variable)

Feature scaling and Learning Rate 1、数据集2、学习率2.1 α \alpha α 9.9e-72.2 α \alpha α 9e-72.3 α \alpha α 1e-7 3、特征缩放3.1 特征缩放的原因3.2 Z-score 归一化3.3 预测3.4 损失等值线 导入所需的库 import numpy as np np.set_printoptions(precision…

采集数据筛选-过滤不要数据或只保留指定数据

采集文章数据&#xff0c;有时候会遇到一些不需要采集的数据&#xff0c;或者只想采集一些特定的数据&#xff0c;可以使用简数采集器的内容过滤功能&#xff0c;对采集的数据进行筛选&#xff0c;只有符合的数据才采集保留。 可以用于过滤掉一些广告、专题、网站首页等无效数…

计算机毕设 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长…

如何下载Bootstrap?编译版与源码版有何区别?Bootstrap的编译版下载下来之后有哪些文件?

01-进入Bootstrap的官网 https://getbootstrap.com/ 02-右上角选择"All versions",或者直接通过URL进入版本选择界面&#xff1a; https://getbootstrap.com/docs/versions/ 03-在页面中根据自己的需要选择版本下载。 通常下载编译版(Compiled版)&#xff0c…

C语言sprintf函数的简明介绍(头文件/自动添加杠0/与printf函数的区别)

介绍 一句话&#xff0c;与printf唯一的区别&#xff1a; printf函数打印输出到屏幕上&#xff0c;而sprintf函数打印到字符串中。 与printf同样支持&#xff1a;控制精度、将多个数值数据连接起来、打印某变量的地址、格式化数字字符串 自动在末尾添加\0&#xff0c;不用担…

链表(二) 双链表操作详解

文章目录 四、双向带头循环链表的实现List.hList.c创建返回链表的头结点双向链表打印双向链表尾插双向链表尾删双向链表头插双向链表头删双向链表查找双向链表在pos的前面进行插入双向链表删除pos位置的节点 五、单链表与双链表比较 什么是链表及单链表的实现请跳转&#xff1a…

最近写了10篇Java技术博客【SQL和画图组件】

&#xff08;1&#xff09;Java获取SQL语句中的表名 &#xff08;2&#xff09;Java SQL 解析器实践 &#xff08;3&#xff09;Java SQL 格式化实践 &#xff08;4&#xff09;Java 画图 画图组件jgraphx项目整体介绍&#xff08;一&#xff09; 画图组件jgraphx项目导出…