【Spring Boot】02 HelloWorld

本文详细介绍如何使用SpringBoot创建并运行一个简单的Web应用,包括Maven项目搭建、依赖导入、主程序编写、Controller与Service实现,以及应用的部署与运行。

1、Spring Boot HelloWorld

1.1 创建一个 maven 项目(jar)

IDEA 新建 maven 项目后,选择 Enable Auto-Import ,启动自动导入

1.2 导入 spring boot 相关依赖

在 pom.xml 中添加

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

这里使用的是 Spring Boot 2.1.6 版本

1.3 写一个主程序,启动 spring boot 应用

package com.test;

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

/**
 * @SpringBootApplication
 * 来标注一个主程序类
 * 说明这是一个 spring boot 应用
 */
@SpringBootApplication
public class HelloWorld {

    public static void main(String[] args) {

        // Spring 应用启动
        SpringApplication.run(HelloWorld.class,args);
    }
}

1.4 编写 Controller、Service

package com.test.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @ResponseBody
    @RequestMapping("/hello")
    public String hello(){
        return "Hello World!";
    }
}

1.5 运行主程序

启动项目后,访问 http://localhost:8080/hello 即可

1.6 简化部署

<!-- 此插件可以将应用打包成一个可执行的jar包 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

将这个应用打包jar包,直接使用 java -jar 命令进行执行

2、HelloWorld探索

2.1 POM 文件

2.1.1 父项目
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
</parent>

<!-- 它的父项目是 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>1.5.9.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
</parent>
<!-- 它来管理 Spring Boot 应用中的所有依赖版本 -->

Spring Boot 版本仲裁中心:

以后导入依赖默认是不需要写版本号的(没有在dependencies中管理的依赖需要声明版本号)

2.1.2 导入的依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

spring-boot-starter-web

​ spring-boot-starter:spring boot场景启动器,帮我们导入了web模块正常运行所依赖的组件

Spring Boot 将所有的功能场景都抽取出来了,做成了一个个starters启动器,只需要在项目中引入这些starter相关场景的所有依赖就都会导入进来,要用什么就导入什么场景的启动器

关于starters的官方介绍

2.2 主程序类,主入口类

package com.test;

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

/**
 * @SpringBootApplication
 * 来标注一个主程序类
 * 说明这是一个 spring boot 应用
 */
@SpringBootApplication
public class HelloWorld {

    public static void main(String[] args) {

        // Spring 应用启动
        SpringApplication.run(HelloWorld.class,args);
    }
}

@SpringBootApplication:Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {

@SpringBootConfiguration:Spring Boot 的配置类

​ 标注在某个类上,表示这是一个 Spring Boot 的配置类

@Configuration:配置类上来标注这个注解

​ 配置类——配置文件;配置类也是容器中的一个组件;@Component

@EnableAutoConfiguration:开启自动配置功能

​ 以前需要配置的东西,Spring Boot 直接帮我们自动配置;@EnableAutoConfiguration告诉Spring Boot 开启自动配置功能;这样自动配置才能生效

@AutoConfigurationPackage
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {

@AutoConfigurationPackage:自动配置包

​ @Import({Registrar.class})

​ Spring 的底层注解 @Import,给容器中导入一个组件;导入的组件由Registrar.class

将主配置类(@SpringBootApplication标注的类)的所在包及以下所有子包里面的所有组件扫描到Spring容器中

@Import({EnableAutoConfigurationImportSelector.class})

​ 给容器中导入组件

​ EnableAutoConfigurationImportSelector:导入哪些组件的选择器

​ 将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中

​ 会给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件

自动配置类

有了这些自动配置类,免去了手动编写配置注入功能组件等的工作

​ SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader);

Spring Boot在启动的时候从类路径下的 META-INF/spring.factories 中获取 EnableAutoConfiguration 指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效了,帮我们进行自动配置工作,以前需要自己配置,现在自动配置类都帮我们配置好了【classLoader:类加载器】

J2EE的整体整合方案和自动配置都在spring-boot-1.5.9.RELEASE.jar

<think>根据用户需求,我们需要删除数据框中所有的值都不大于20的行。也就是说,对于每一行,如果该行的所有的值都小于等于20,那么我们就删除一行。 在R语言中,我们可以使用多种方法来实现这个功能。下面我将介绍几种常见的方法: ### 方法1: 使用`apply()`函数和逻辑判断 我们可以使用`apply()`函数按行(MARGIN=1)应用一个函数,该函数检查当前行是否所有元素都小于等于20。然后,我们可以用这个逻辑向量来子集数据框,保留至少有一个元素大于20的行。 ```r # 假设df是数据框 # 创建一个逻辑向量:对于每一行,如果所有值都<=20则为FALSE,否则为TRUE rows_to_keep <- apply(df, 1, function(row) any(row > 20)) # 然后使用这个逻辑向量来选取行 df_filtered <- df[rows_to_keep, ] ``` ### 方法2: 使用`rowSums()`函数 另一种方法是利用`rowSums()`计算每行大于20的值的个数,然后保留那些个数大于0的行。 ```r # 计算每行大于20的值的个数 count_greater_than_20 <- rowSums(df > 20) # 保留至少有一个值大于20的行 df_filtered <- df[count_greater_than_20 > 0, ] ``` ### 方法3: 使用dplyr包的`filter()`函数 如果你习惯使用tidyverse,可以使用dplyr包中的`filter()`函数结合`rowwise()`和`any()`,或者更高效地使用`if_any()`或`if_all()`(但注意这里我们需要的是任意一个大于20,所以用`if_any`)。 注意:`if_any`和`if_all`在dplyr 1.0.0以上版本引入,用于条件筛选。 ```r library(dplyr) # 使用if_any:选择至少有一个满足条件(大于20)的行 df_filtered <- df %>% filter(if_any(everything(), ~ . > 20)) # 或者使用rowwise(较慢,不推荐用于大数据) # df_filtered <- df %>% rowwise() %>% filter(any(c_across(everything()) > 20)) %>% ungroup() ``` ### 示例 假设我们有以下数据框: ```r df <- data.frame( a = c(15, 25, 5, 30), b = c(10, 18, 20, 22), c = c(18, 22, 15, 19) ) ``` 我们想删除所有都不大于20的行。那么: - 第一行:15,10,18 -> 都<=20,删除 - 第二行:25,18,22 -> 有大于20的,保留 - 第三行:5,20,15 -> 都<=20(注意20不大于20,是等于),删除 - 第四行:30,22,19 -> 有大于20的,保留 所以结果应该保留第二行和第四行。 ### 代码验证 用方法1: ```r rows_to_keep <- apply(df, 1, function(row) any(row > 20)) df_filtered <- df[rows_to_keep, ] # 输出 # a b c #2 25 18 22 #4 30 22 19 ``` ### 注意事项 1. 数据框中的非数值:如果数据框中有非数值(如字符、因子等),上述方法可能会出错,因为比较运算符(如`>`)只适用于数值。因此,在应用之前,请确保只对数值进行操作,或者先选择数值。例如: ```r # 假设df有混合,我们只选择数值 numeric_cols <- sapply(df, is.numeric) df_numeric <- df[, numeric_cols] # 然后对df_numeric应用上述方法,但注意这样会丢失非数值。所以更好的方法是先提取行索引,再对原数据框子集。 rows_to_keep <- apply(df[, numeric_cols], 1, function(row) any(row > 20)) df_filtered <- df[rows_to_keep, ] ``` 2. NA值处理:如果数据中有NA,那么比较结果可能为NA,这会影响结果。可以在比较时使用`na.rm=TRUE`参数(在`any`函数或`rowSums`中)。例如: ```r rows_to_keep <- apply(df, 1, function(row) any(row > 20, na.rm=TRUE)) # 或者 count_greater_than_20 <- rowSums(df > 20, na.rm=TRUE) ``` ### 总结 根据用户需求,推荐使用`apply`方法或`rowSums`方法,它们都是基础R的函数,不需要额外安装包。如果用户已经使用dplyr,那么使用`filter(if_any(...))`也很方便。 §§相关问题§§ 1. 如何删除数据框中所有的值都小于某个阈值的行? 2. R语言中如何根据条件删除数据框的行? 3. 在R语言中如何处理数据框中的NA值? 4. 如何选择数据框中的数值?</think>### 在R语言删除数据框中所有的值都不大于20的行 根据你的需求,我将详细介绍几种在R语言删除数据框中所有的值都不大于20的行的方法。核心思路是:**识别并保留至少有一个的值大于20的行**。 #### 方法1:使用`apply()`函数和`any()`逻辑判断(基础R) 这是最直接的方法,通过逐行检查是否至少有一个元素大于20: ```r # 创建逻辑向量:检查每行是否至少有一个值>20 keep_rows <- apply(your_dataframe, 1, function(row) any(row > 20)) # 删除不满足条件的行 filtered_df <- your_dataframe[keep_rows, ] ``` **说明**: - `apply(, 1, ...)` 表示按行操作 - `any(row > 20)` 检查当前行是否至少有一个值大于20 - `[keep_rows, ]` 保留逻辑值为TRUE的行 #### 方法2:使用`rowSums()`(高效处理大数据) 适用于大型数据集的高效方法: ```r # 计算每行中>20的值的数量 count_above_20 <- rowSums(your_dataframe > 20) # 保留至少有一个值>20的行 filtered_df <- your_dataframe[count_above_20 > 0, ] ``` **优势**:向量化操作,计算速度更快[^4] #### 方法3:使用dplyr包的`filter()`(tidyverse风格) 适合tidyverse用户: ```r library(dplyr) filtered_df <- your_dataframe %>% filter(if_any(everything(), ~ . > 20)) ``` **说明**: - `if_any(everything(), ...)` 检查所有 - `~ . > 20` 是简写函数,判断每个元素是否>20 #### 示例演示 假设原始数据框: ```r df <- data.frame( A = c(15, 25, 18, 10), B = c(20, 22, 16, 5), C = c(18, 30, 20, 15) ) ``` 应用方法1后: ``` A B C # 保留的行(至少有一个>20) 2 25 22 30 # 25>20, 22>20, 30>20 3 18 16 20 # 注意:20不大于20,但18>20? 错误→实际应删除此行 ``` **修正说明**:第三行所有值(18,16,20)均≤20,实际会被删除。正确结果只保留第2行。 #### 注意事项 1. **NA值处理**:默认情况下,`NA > 20`会返回`NA`,可能导致整行被误删。解决方案: ```r # 添加na.rm=TRUE keep_rows <- apply(your_dataframe, 1, function(row) any(row > 20, na.rm = TRUE)) ``` 2. **非数值处理**:如果数据框包含非数值,需先选择数值: ```r numeric_cols <- sapply(your_dataframe, is.numeric) filtered_df <- your_dataframe[rowSums(your_dataframe[, numeric_cols] > 20) > 0, ] ``` 3. **等号边界**:条件`>20`是严格大于,等于20的值不会触发保留条件(如示例第3行)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值