Springboot学习-day16

news2025/1/15 22:52:45

Springboot学习-day16

Springboot是spring家族中的一个全新框架,用来简化spring程序的创建和开发过程。在以往我们通过SpringMVC+Spring+Mybatis框架进行开发的时候,我们需要配置web.xml,spring配置,mybatis配置,然后整合在一起,而springboot抛弃了繁琐的xml配置过程,采用大量默认的配置来简化我们的spring开发过程。

SpringBoot化繁为简,使开发变得更加的简单迅速。

1. Springboot项目搭建

1.1 maven下载和配置

下载maven的压缩包,并解压

在解压后的文件夹中,找到conf文件夹中的settings.xml文件配置本地库地址和配置国内镜像

<!-- 配置maven本地库的位置 -->
<localRepository>C:\maven\repository</localRepository>

<!-- 配置国内镜像源 -->
<mirror>  
		<id>alimaven</id>  
		<mirrorOf>central</mirrorOf>    
		<name>aliyun maven</name>  
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>        
</mirror>

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

1.2 pom.xml

在IDEA中创建maven项目

在这里插入图片描述

在IDEA的setting中修改maven的配置,将路径改为自己配置的maven路径以及setting.xml和本地库路径

在这里插入图片描述

在pom.xml文件中,添加springboot依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.6.6</version>
</dependency>

更新maven库,下载完成后可以在External Libraries中看到新添加的jar包

在这里插入图片描述

什么是POM?

pom是Project Object Model的缩写,即项目对象模型。pom.xml文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。

maven的基本字段含义

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.funtl</groupId>
    <artifactId>itoken-dependencies</artifactId>
    <version>1.0.0</version>
    <packaging>war</packaging>
    <name>itoken dependencies</name>
    <url>www.funtl.com</url>
</project>

字段说明
modelVersion声明项目描述符遵循的哪一个POM模型版本。这是为了当Maven引入新的特性或者其他模型变更的时候,确保稳定性
groupId公司或者组织的唯一标识,并且配置时生成的路径也是由此生成的。
artifactId本项目唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的
version本项目目前所处的版本号
packaging打包类型,如pom,jar,rar等
name项目的名称,Maven产生的文档用,可省略
url项目主页的url,Maven产生文档用,可省略

其中groupId,artifactId,version,packaging这四项组成了项目的唯一坐标。一般情况下,前面三项就足矣。

依赖项中的字段含义

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.6.6</version>
    </dependency>
</dependencies>
字段说明
groupId依赖项的组织名
artifactId依赖项的子项目名
version依赖项的版本

约定大于配置?

"约定大于配置"是一种设计理念,它在Spring Boot框架中有广泛的应用。这一理念的核心思想是,通过开发框架中定义一些默认的约定和规则,从而减少开发人员需要配置的工作,使开发更加高效,同时提高了项目的可维护性和可读性。

1.3 启动Springboot项目

创建项目启动类,名字一般为XXApplication

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

//@SpringBootApplication 标识SpringBoot应用程序的入口类
@SpringBootApplication
public class EasySpringAApplication {
    //项目启动类  运行起该类就运行了整个项目
    public static void main(String[] args) {
        //SpringApplication.run(启动类的类对象, args);
        SpringApplication.run(EasySpringAApplication.class, args);
    }
}

启动成功如下图所示

在这里插入图片描述

可以看到上图中Started EasySpringAApplication in 1.082 seconds,这代表项目已经启动成功

Tomcat started on port(s): 8080 (http) with context path ''表示Tomcat已经在端口8080启动,并准备接受HTTP请求,with context path后是空串,表示应用是部署在根目录下的,访问http://localhost:8080即可访问

2. IoC

IoC(Inverse of Control:控制反转)是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。IoC 在其他语言中也有应用,并非 Spring 特有。IoC 容器是 Spring 用来实现 IoC 的载体,IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。

将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件xml/注解即可,完全不用考虑对象是如何被创建出来的。

优点

  • 实现组件之间的解耦
  • 提高程序的灵活性和可维护性

缺点

  • 对程序员来说创建对象的步骤变复杂了,不直观
  • 因为使用反射来创建对象,所以在效率上会有些损耗。但相对于程序的灵活性和可维护性来说,这点损耗是微不足道的。
  • 缺少IDE重构的支持,如果修改了类名,还需到XML文件中手动修改。

3. DI

DI—Dependency Injection,即“依赖注入”组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。**依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。**通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

参考:http://t.csdnimg.cn/OP0ve

4. 常用注解

4.1 @SpringBootApplication

@SpringBootApplication注解通常被用于Spring Boot应用程序的入口类上,用于启动Spring Boot应用程序。它可以简化Spring应用程序的配置和启动过程。这是一个组合注解,包括了@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解。

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

4.2 @Component、@Repository、@Service、@Controller

@Component是最基本的注解,用于将一个普通的类标记为Spring的组件,是以下三个类的父注解

@Component
public class UserService {
    // 类的实现...
}

@Repository用于标记数据访问对象(DAO Date Access),通常用于与数据库交互的类。

@Repository
public class UserRepositoryDao {
    // 数据访问的实现...
}

@Service用于标记服务类,通常用于业务逻辑处理和组装。

@Service
public class UserService {
    // 服务类的实现...
}

@Controller 用于标记控制器类,通常用于 Web 应用程序中处理用户请求和返回响应。

@Controller
public class UserController {
    // 控制器类的实现...
}

这些注解的作用类似,都是用来将类标记为 Spring 组件,使其被 Spring 容器扫描和管理。使用它们的好处是可以使代码更加清晰和易读,并在代码层面表示出组件的角色和职责。在使用时,根据类的具体功能和用途选择合适的注解来标记类。同时,这些注解也可以与其他注解结合使用,实现更复杂的功能和特性。

4.3 @Bean

@Bean 是 Spring Framework 中的一个注解,用于告诉 Spring 容器将被注解标记的方法的返回值作为一个 Bean 注册到容器中。

通常情况下,我们需要在 Spring 容器中创建和管理对象。通过 @Bean 注解,我们可以自定义方法来返回或创建这些对象,并将它们注册为 Spring 的 Bean,使得它们可以在其他地方进行依赖注入、使用和管理。

@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserServiceImpl();
    }
}

在上述示例中,@Bean 注解标记了 userService() 方法,该方法返回一个 UserService 对象。当 Spring 容器初始化时,会调用 userService() 方法,并将其返回的对象注册为一个 Bean。这样,在其他需要使用 UserService 的地方,可以通过依赖注入的方式获取该 Bean 的实例,并使用它提供的服务。

除了简单的方法返回对象,@Bean 注解还支持更复杂的配置:

  • 可以通过 name 属性指定 Bean 的名称,例如 @Bean(name = “myBean”)。
  • 可以通过 initMethod 属性指定在实例化 Bean 之后调用的初始化方法,例如 @Bean(initMethod = “init”)。
  • 可以通过 destroyMethod 属性指定在销毁 Bean 之前调用的销毁方法,例如 @Bean(destroyMethod = “cleanup”)。
  • 可以通过 @Scope 注解指定 Bean 的作用域,如单例(@Scope(“singleton”))、原型(@Scope(“prototype”))等。

4.4 @Scope

@Scope在和@Component注解一起修饰在类上,作为类级别注解时,@Scope表示该类实例的范围

在和@Bean一起修饰在方法上,作为方法级别注解时,@Scope表示该方法返回的实例的范围。

@Component
@Scope("prototype")
public class MyService {
    // 类的实现...
}

在上述示例中,MyService 类被标记为一个组件,并使用 @Scope("prototype") 注解将该组件的作用域设置为原型模式,每次通过容器获取 MyService 的实例时都会创建一个新的对象。

4.5 @Autowired

通过@Autowired注解,我们可以自动将 Spring 容器中匹配类型的 Bean 注入到目标对象中,避免了手动处理依赖对象的创建和管理,提高了代码的可维护性和可测试性。

@RestController
public class EasyController {
    //该类中需要EasyService类的对象
    //在这个类中只需要声明我们依赖EasyService这个类就可以
    //而不需要通过代码主动获取EasyService类的对象
    //注入依赖 DI  通过识别依赖关系,注入对应的对象
    @Autowired
    EasyService easyS;
}

4.6 @RequestMapping

@RequestMapping 是 Spring Framework 中的一个注解,用于映射请求的 URL 路径到控制器类或方法上。

通过 @RequestMapping 注解,我们可以定义控制器类或方法处理的请求 URL,以及与之关联的 HTTP 请求方法、请求参数、请求头等条件。

@RestController
public class EasyController {
    @Autowired
    TestA testA;

    @RequestMapping("testB")
    public String testB(){
        testA.test();
        return "EasyB method";
    }
}

参考:https://blog.csdn.net/weixin_55772633/article/details/131882825

5. Bean的作用域

bean的作用域就是指Spring给我们创建出的对象的存活范围,在配置文件中通过bean的scope属性指定

scope:对象的作用范围,取值如下

取值范围说明
singleton默认值,单例模式,只会创建一个对象
prototype原型模式,每次需要时都会创建一个新对象
requestWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中
sessionWEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中
global sessionWEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当于 session

当scope取值为singleton时,Bean的实例化个数只有一个,当Spring核心文件加载时,就会实例化配置的Bean实例

当scope取值为prototype时,Bean的实例化个数就为多个,当调用getBean()方法时,就会实例化Bean类

当scope取值为request时,会在每次http请求中生成一个新的Bean实例类,类似于prototype,应用场景:一次http请求和响应共享Bean

当scope取值为session时,会在http session中定义一个Bean实例,场景用户会话中共享Bean,例如可以用来记录一个用户的登录信息

6. Bean的生命周期

Bean 生命周期管理是 Spring Boot 中的关键功能之一。它负责管理应用程序中的 Java 对象,这些对象被称为 Beans。Spring Boot 通过创建、配置、初始化和销毁这些 Beans 来确保应用程序的正常运行。这个功能的目的是提供一种灵活的方式,使开发人员能够轻松地管理对象的生命周期,从而实现高效的依赖注入和组件化开发。
在这里插入图片描述

  1. 实例化: 在Spring容器启动时,Spring会创建配置中定义的所有Bean。这是通过类的构造方法或工厂方法来完成的

    //@Component("easybean")
    public class EasyBean{
        public EasyBean(){
            System.out.println("1------EasyBean构造方法");
        }
    }
    
  2. 属性注入: 一旦Bean被实例化,Spring会注入所有相关的属性,包括通过构造方法或Setter方法注入的属性

    //@Component("easybean")
    public class EasyBean{
        public EasyBean(){
            System.out.println("1------EasyBean构造方法");
        }
    
        TestA testA;
    
        @Autowired
        public void setTestA(TestA testA){
            System.out.println("2------注入属性");
            this.testA = testA;
        }
    }
    
  3. 如果 Bean 实现了 BeanNameAware 接口,则 Spring 调用 Bean 的 setBeanName() 方法传入当前 Bean 的 id 值。

    //@Component("easybean")
    public class EasyBean implements BeanNameAware{
        public EasyBean(){
            System.out.println("1------EasyBean构造方法");
        }
    
        TestA testA;
    
        @Autowired
        public void setTestA(TestA testA){
            System.out.println("2------注入属性");
            this.testA = testA;
        }
    
        @Override
        public void setBeanName(String s) {
            System.out.println("3------BeanNameAware接口的setBeanName方法" + s);
        }
    }
    
  4. 如果 Bean 实现了 BeanFactoryAware 接口,则 Spring 调用 setBeanFactory() 方法传入当前工厂实例的引用。

    //@Component("easybean")
    public class EasyBean implements BeanNameAware, BeanFactoryAware{
        public EasyBean(){
            System.out.println("1------EasyBean构造方法");
        }
    
        TestA testA;
    
        @Autowired
        public void setTestA(TestA testA){
            System.out.println("2------注入属性");
            this.testA = testA;
        }
    
        @Override
        public void setBeanName(String s) {
            System.out.println("3------BeanNameAware接口的setBeanName方法" + s);
        }
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            System.out.println("4------BeanFactoryAware的setBeanFactory方法" + beanFactory);
        }
    }
    
  5. 当一个 Bean 实现了 ApplicationContextAware 接口并在 Spring 容器中被实例化时,Spring 容器会自动调用该 Bean 的 setApplicationContext 方法,并将应用程序上下文ApplicationContext作为参数传递进来

    //@Component("easybean")
    public class EasyBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware{
        public EasyBean(){
            System.out.println("1------EasyBean构造方法");
        }
    
        TestA testA;
    
        @Autowired
        public void setTestA(TestA testA){
            System.out.println("2------注入属性");
            this.testA = testA;
        }
    
        @Override
        public void setBeanName(String s) {
            System.out.println("3------BeanNameAware接口的setBeanName方法" + s);
        }
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            System.out.println("4------BeanFactoryAware的setBeanFactory方法" + beanFactory);
        }
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            System.out.println("5------ApplicationContextAware接口的setApplicationContext方法");
        }
    }
    
  6. BeanPostProcessor 是 Spring 框架中的一个重要接口,它允许开发者在 Spring 容器创建和初始化 bean 的过程中,对 bean 进行自定义处理。这包括在 bean 实例化之后、属性设置之前(postProcessBeforeInitialization 方法),以及在 bean 初始化之后(postProcessAfterInitialization 方法)执行自定义逻辑

    Spring 容器在创建和初始化每一个 bean 时,都会调用 CustomBeanPostProcessor 中的这两个方法,允许你进行自定义处理

    初始化之前执行postProcessBeforeInitialization方法,初始化之后执行postProcessAfterInitialization方法

    @Component
    public class EasyBeanPost implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if(beanName.equals("easyBean")) System.out.println("6------BeanPostProcessor的before方法" + beanName);
            return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
        }
    }
    
  7. InitializingBean 是 Spring 框架中的一个接口,它定义了一个 afterPropertiesSet 方法。当 Spring 容器创建 bean 的所有属性都被设置完成后,会调用这个方法。

    //@Component("easybean")
    public class EasyBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean{
        public EasyBean(){
            System.out.println("1------EasyBean构造方法");
        }
    
        TestA testA;
    
        @Autowired
        public void setTestA(TestA testA){
            System.out.println("2------注入属性");
            this.testA = testA;
        }
    
        @Override
        public void setBeanName(String s) {
            System.out.println("3------BeanNameAware接口的setBeanName方法" + s);
        }
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            System.out.println("4------BeanFactoryAware的setBeanFactory方法" + beanFactory);
        }
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            System.out.println("5------ApplicationContextAware接口的setApplicationContext方法");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("7-----InitializingBean接口的afterPropertiesSet方法");
        }
    }
    
  8. 如果在配置文件中通过 init-method 属性指定了初始化方法,则调用该初始化方法。

    //@Component("easybean")
    public class EasyBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean{
        public EasyBean(){
            System.out.println("1------EasyBean构造方法");
        }
    
        TestA testA;
    
        @Autowired
        public void setTestA(TestA testA){
            System.out.println("2------注入属性");
            this.testA = testA;
        }
    
        @Override
        public void setBeanName(String s) {
            System.out.println("3------BeanNameAware接口的setBeanName方法" + s);
        }
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            System.out.println("4------BeanFactoryAware的setBeanFactory方法" + beanFactory);
        }
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            System.out.println("5------ApplicationContextAware接口的setApplicationContext方法");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("7-----InitializingBean接口的afterPropertiesSet方法");
        }
    
        public void initMethod(){
            System.out.println("8------initMethod方法");
        }
    }
    
    @Configuration
    public class EastConfiguration {
        @Bean(initMethod = "initMethod")
        public EasyBean easyBean(){
            return new EasyBean();
        }
    }
    
  9. 如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的初始化方法postProcessAfterInitialization()。此时,Bean 已经可以被应用系统使用了。

    @Component
    public class EasyBeanPost implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if(beanName.equals("easyBean")) System.out.println("6------BeanPostProcessor的before方法" + beanName);
            return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            if(beanName.equals("easyBean")) System.out.println("9------BeanPostProcessor的after方法");
            return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
        }
    }
    
  10. 如果在 <bean> 中指定了该 Bean 的作用范围为 scope=“singleton”,则将该 Bean 放入 Spring IoC 的缓存池中,将触发 Spring 对该 Bean 的生命周期管理;如果在 <bean> 中指定了该 Bean 的作用范围为 scope=“prototype”,则将该 Bean 交给调用者,调用者管理该 Bean 的生命周期,Spring 不再管理该 Bean。

    @Configuration
    public class EastConfiguration {
        @Bean(initMethod = "initMethod")
        //@Scope("prototype")
        public EasyBean easyBean(){
            return new EasyBean();
        }
    }
    
  11. 如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁;如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁。

    EasyBean类

    //@Component("easybean")
    public class EasyBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {
        public EasyBean(){
            System.out.println("1------EasyBean构造方法");
        }
    
        TestA testA;
    
        @Autowired
        public void setTestA(TestA testA){
            System.out.println("2------注入属性");
            this.testA = testA;
        }
    
        @Override
        public void setBeanName(String s) {
            System.out.println("3------BeanNameAware接口的setBeanName方法" + s);
        }
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            System.out.println("4------BeanFactoryAware的setBeanFactory方法" + beanFactory);
        }
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            System.out.println("5------ApplicationContextAware接口的setApplicationContext方法");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("7-----InitializingBean接口的afterPropertiesSet方法");
        }
    
        public void initMethod(){
            System.out.println("8------initMethod方法");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("10------easyBean被回收了");
        }
    }
    

    EasyBeanPost类

    @Component
    public class EasyBeanPost implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if(beanName.equals("easyBean")) System.out.println("6------BeanPostProcessor的before方法" + beanName);
            return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            if(beanName.equals("easyBean")) System.out.println("9------BeanPostProcessor的after方法");
            return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
        }
    }
    

    EasyConfiguration类

    @Configuration
    public class EastConfiguration {
        @Bean(initMethod = "initMethod")
        //@Scope("prototype")
        public EasyBean easyBean(){
            return new EasyBean();
        }
    }
    

    执行结果如下图所示
    在这里插入图片描述

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

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

相关文章

layui+jsp框架下实现对pdf或图片预览功能

功能 对上传的文件实现预览功能&#xff0c;文件类型为图片或pdf。 效果展示 实现 引入 jQuery&#xff1a; <script src"https://code.jquery.com/jquery-3.5.1.min.js"></script>引入 Bootstrap 的 CSS 和 JavaScript&#xff1a; <link href&quo…

Java面试必看!知己知彼才能百战百胜,如何做好面试前的准备?

随着 Java 这个赛道的不断内卷&#xff0c;这两年&#xff0c;Java 程序员的面试&#xff0c;从原来的常规八股文&#xff08;有 标准答案&#xff09;到现在&#xff0c;以项目、场景问题、技术深度思考为主&#xff0c;逐步转变成没有标准答案&#xff0c; 需要大家基于自己的…

【大厂笔试】翻转、平衡、对称二叉树,最大深度、判断两棵树是否相等、另一棵树的子树

检查两棵树是否相同 100. 相同的树 - 力扣&#xff08;LeetCode&#xff09; 思路解透 两个根节点一个为空一个不为空的话&#xff0c;这两棵树就一定不一样了若两个跟节点都为空&#xff0c;则这两棵树一样当两个节点都不为空时&#xff1a; 若两个根节点的值不相同&#xff…

【时时三省】(C语言基础)函数的嵌套调用和链式访问

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 嵌套调用 每一个函数都只能在大括号的外面独立存在 不能在一个函数的里面还有一个函数 这样是不行的 函数是不能嵌套定义的 但是函数可以嵌套调用 比如在外面建立函数1&函数 然后在mai…

小区房布置超五类网线,怎么网络只有100Mbps?

前言 最近有粉丝找到小白&#xff0c;说家里的网络怎么一直都是100Mbps&#xff0c;宽带明明是1000Mbps的&#xff0c;只用了十分之一。 一开始小白以为是家里的网络使用的是两对双绞线的那种网线&#xff08;一共四芯&#xff09;。 随即她说水晶头接的都是8根&#xff0c;…

JSP分页写法

一、写界面框架&#xff1a; <html> <head><title>学生管理系统</title><style>body { font-family: 微软雅黑; background-color: #e0f7fa; margin: 0; padding: 0; display: flex; justify-content: center; align-items: center; margin-top…

log4j2漏洞练习

log4j2 是Apache的一个java日志框架&#xff0c;我们借助它进行日志相关操作管理&#xff0c;然而在2021年末log4j2爆出了远程代码执行漏洞&#xff0c;属于严重等级的漏洞。apache log4j通过定义每一条日志信息的级别能够更加细致地控制日志生成地过程&#xff0c;受影响的版本…

C++·哈希

1. unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到logN。后来在C11中STL又提供了4个unordered系列的关联式容器&#xff0c;这四个容器与红黑树结构的使用方法类似&#xff0c;但是底层结构不同&…

【C++】类和对象——Lesson2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C &#x1f680;本系列文章为个人学习笔记…

最全架构学习路线图,海量大厂架构案例

很多读者经常抱怨&#xff0c;工作中涉及不到太多架构设计&#xff0c;对于架构的理解少之又少。 零散地做过一些架构工作&#xff0c;但完全不知道架构设计的全流程是怎样的。 想要成长为架构师&#xff0c;缺乏系统的方法论指导。 无论是程序员&#xff0c;还是产品经理&a…

数字图像边缘曲率计算及特殊点检测

一、曲率和数字图像边缘曲率检测常用方法简介 边缘曲率作为图像边缘特征的重要参数&#xff0c;不仅反映了边缘的几何形状信息&#xff0c;还对于图像识别、图像分割、目标跟踪等任务具有显著影响。 曲线的曲率&#xff08;curvature&#xff09;就是针对曲线上某个点的切线方向…

只有4%知道的Linux,看了你也能上手Ubuntu桌面系统,Ubuntu简易设置,源更新,root密码,远程服务...

创作不易 只因热爱!! 热衷分享&#xff0c;一起成长! “你的鼓励就是我努力付出的动力” 最近常提的一句话&#xff0c;那就是“但行好事&#xff0c;莫问前程"! 与辉同行的董工说​&#xff1a;​守正出奇。坚持分享&#xff0c;坚持付出&#xff0c;坚持奉献&#xff0c…

患者特征对AI算法在解释阴性筛查数字乳腺断层摄影研究中的表现的影响| 文献速递-AI辅助的放射影像疾病诊断

Title 题目 Patient Characteristics Impact Performance of AI Algorithm in Interpreting Negative Screening Digital Breast Tomosynthesis Studies 患者特征对AI算法在解释阴性筛查数字乳腺断层摄影研究中的表现的影响 Background 背景 Artificial intelligence (AI)…

什么是云边协同?

当今信息技术高速发展的时代&#xff0c;"云边协同"&#xff08;Edge Cloud Collaboration&#xff09;已经成为一个备受关注的话题。它涉及到云计算和边缘计算的结合&#xff0c;为数据处理、存储和应用提供了全新的可能性。本文将介绍云边协同的概念、优势以及在不…

Learning vtkjs之LookUpTable

颜色映射表 LookUpTable 介绍 先看官方的介绍&#xff1a; vtkLookupTable is a 2D widget for manipulating a marker prop vtkLookupTable 是一个用于操纵标记属性的2维的小部件。 一般可以用来进行颜色刻度的显示。它会帮我们进行颜色线性插值计算 代码效果 其实设置一个…

C++必修:STL之vector的了解与使用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. C/C中的数组 1.1. C语言中的数组 在 C 语言中&#xff0c;数组是一组相同类型…

顺序消费rocketMQ(FIFO先进先出)和小技巧 取模运算的周期性特征来将数据分组。

20240801 一、顺序消费MQ&#xff08;FIFO先进先出&#xff09;介绍 二、一个小技巧&#xff0c;对于取模运算&#xff0c;用来在几以前进行随机选取&#xff0c;取模运算的周期性特征来将数据分组&#xff0c;使用场景对于取模会重复问题 一、顺序消费MQ&#xff08;FIFO先进先…

openeuler下载docker

https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/rhel/9/x86_64/stable/ #清华的网址 https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable/ #阿里云的网址 开始配置 vim /etc/yum.repos.d/docker-ce.repo #写仓库&#xff0c;我这里…

【初阶数据结构篇】归并排序和计数排序(总结篇)

文章目录 归并排序和计数排序前言代码位置归并排序计数排序排序性能比较排序算法复杂度及稳定性分析 归并排序和计数排序 前言 本篇以排升序为例 代码位置 gitee 前篇&#xff1a;【初阶数据结构篇】冒泡排序和快速排序 中篇&#xff1a;【初阶数据结构篇】插入、希尔、选择…

【Qt】QDateTimeEdit

在Qt中&#xff0c;QDateEdit是用于选择日期的微调框&#xff0c;QTimeEdit是用于选择小时和分钟的微调框 QDateTimeEdit则是基于QDateEdit和QTimeEdit的组合控件&#xff0c;能够同时显示日期和时间&#xff0c;并允许用户以交互方式编辑日期 常用属性 属性说明dateTime时间…