spring boot 新手入门【1】基础学习

学习开始时间: 2024/03/30 晚上 10:44

基础教程
教程仓库
在线编程
其它教程

1.搭建spring boot 工程,定义HelloController.hello()方法,返回’Hello SpringBoot!’

要搭建一个简单的Spring Boot工程并定义一个HelloController类,可以按照以下步骤进行操作:

  1. 首先,确保你已经安装了Java开发环境和Maven构建工具。

  2. 创建一个新的Spring Boot项目。你可以使用Spring Initializr(https://start.spring.io/)来生成一个新的Spring Boot项目。在这里,你可以选择项目的基本信息(如项目名称、描述、包名等)以及项目的依赖。对于你的需求,你可以选择Web依赖以便支持创建Web应用。

  3. 将生成的项目导入到你的集成开发环境(IDE)中,比如Eclipse、IntelliJ IDEA等。

  4. 创建一个名为HelloController的类,并在其中定义一个方法hello(),返回’Hello SpringBoot!'。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello SpringBoot!";
    }
}
  1. 运行你的Spring Boot应用程序。你可以在IDE中运行应用程序,也可以使用Maven命令来构建和运行。当应用程序成功启动后,你可以在浏览器中访问http://localhost:8080/hello,应该能够看到输出Hello SpringBoot!

这样,你就成功搭建了一个简单的Spring Boot工程,并定义了一个HelloController类,其中包含一个返回’Hello SpringBoot!'的hello()方法。

这段代码定义了一个名为HelloController的类,用于处理HTTP GET请求并返回一个简单的字符串响应。让我们逐行解释这段代码:

  1. import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;导入了Spring Framework中的相关类,以便在代码中使用@GetMapping@RestController注解。

  2. @RestController注解告诉Spring Framework,这个类是一个RESTful API控制器,它将处理HTTP请求并返回响应。与@Controller注解不同的是,@RestController注解还将自动将响应转换为JSON或XML格式,以便客户端可以轻松地解析响应。

  3. public class HelloController定义了一个名为HelloController的类,用于处理HTTP GET请求并返回响应。

  4. @GetMapping("/hello")注解告诉Spring Framework,当HTTP GET请求的URL路径为“/hello”时,将调用下面的hello()方法。

  5. public String hello()方法是实际处理HTTP GET请求的方法。它返回一个简单的字符串响应,即“Hello SpringBoot!”。

综上所述,这段代码定义了一个RESTful API控制器,用于处理HTTP GET请求并返回一个简单的字符串响应。它使用Spring Framework中的@RestController@GetMapping注解来简化代码,并使其易于阅读和维护。

2.spring boot 起步依赖原理分析

Spring Boot的起步依赖(Starter Dependencies)是一种方便的方式,可以帮助简化Spring应用程序的依赖管理配置。起步依赖本质上是一组预配置依赖项集合,它们被打包成一个单独依赖,以简化项目的构建管理。下面是关于Spring Boot起步依赖原理的分析:

  1. 简化依赖管理

    • Spring Boot的起步依赖为开发人员提供了一种简化依赖管理的方法。通过引入特定的起步依赖,开发人员无需手动管理每个版本,而是可以依赖Spring Boot自动管理依赖版本
  2. 自动配置

    • 起步依赖不仅包含依赖项,还包含自动配置(Auto-Configuration)。自动配置是Spring Boot的一个关键特性,它根据项目中的依赖配置 自动配置应用程序的行为。这意味着你可以快速启动一个应用程序,而不必手动配置大量的设置。
  3. 约定大于配置

    • Spring Boot遵循“约定大于配置”的原则,即通过默认约定减少配置。起步依赖通过提供默认配置依赖项,使得开发人员可以更快速地搭建应用程序,而不必担心繁琐的配置。
  4. 模块化设计

    • Spring Boot的起步依赖是模块化设计的一部分,每个起步依赖都关注特定功能技术。这种模块化设计使得开发人员可以根据需要选择合适的起步依赖,而不必引入整个框架
  5. 适配不同场景

    • Spring Boot提供了各种类型的起步依赖,包括Web开发、数据访问、安全等。开发人员可以根据应用程序的需求选择合适的起步依赖,以满足不同的场景和需求。

总的来说,Spring Boot的起步依赖通过简化依赖管理、提供自动配置、遵循约定大于配置等原则,帮助开发人员快速搭建应用程序,并降低开发和配置的复杂性。这使得开发人员可以更专注于业务逻辑的实现,而不必过多关注底层的技术细节。

3.spring boot配置文件分类

在Spring Boot应用程序中,可以使用多种类型的配置文件来配置应用程序的行为。下面是Spring Boot配置文件的分类:

  1. application.properties:这是最常用的配置文件类型。它是一个基于键值对的文本文件,用于配置应用程序的属性。在该文件中,每一行都包含一个属性的键和值,通过“=”号分隔。例如,server.port=8080

  2. application.yml:这是另一种常用的配置文件类型。它是一个基于缩进的文本文件,使用YAML语法来定义属性。在该文件中,属性使用“:`”号分隔,每个属性都有一个缩进级别。例如:

    server:
      port: 8080
    
  3. bootstrap.properties:这是一个特殊的配置文件,用于配置Spring Boot应用程序的启动过程。它包含一些基本属性,例如应用程序的名称和配置文件的位置。在该文件中,每一行都包含一个属性的键和值,通过“=”号分隔。例如,spring.application.name=myapp

  4. bootstrap.yml:这是另一种特殊的配置文件,用于配置Spring Boot应用程序的启动过程。它使用YAML语法来定义属性。在该文件中,属性使用“:`”号分隔,每个属性都有一个缩进级别。例如:

    spring:
      application:
        name: myapp
    
  5. application-{profile}.properties:这是一种基于环境或配置文件的配置文件类型。它允许您为不同的环境或配置文件定义不同的属性值。在该文件中,{profile}是一个占位符,表示环境或配置文件的名称。例如,application-dev.properties

  6. application-{profile}.yml:这是另一种基于环境或配置文件的配置文件类型。它使用YAML语法来定义属性。在该文件中,{profile}是一个占位符,表示环境或配置文件的名称。例如,application-dev.yml

总的来说,Spring Boot提供了多种类型的配置文件,以满足不同的需求和场景。开发人员可以根据应用程序的需求选择合适的配置文件类型,并使用相应的语法来定义属性。

4.配置文件的优先级

在Spring Boot应用程序中,不同类型的配置文件有不同的优先级。当存在多个配置文件时,Spring Boot会按照一定的顺序加载这些配置文件,具体的加载顺序和优先级如下:

  1. 高优先级

    • bootstrap.ymlbootstrap.properties:这两个文件是启动配置文件,具有最高优先级。它们用于配置应用程序的启动过程,例如设置应用程序的名称、配置文件的位置等。
  2. 次高优先级

    • bootstrap-{profile}.ymlbootstrap-{profile}.properties:这些是针对特定环境或配置文件的启动配置文件,具有次高优先级。例如,bootstrap-dev.yml
  3. 普通优先级

    • application.ymlapplication.properties:这两个文件是最常用的配置文件类型,用于配置应用程序的属性。它们具有普通优先级。
  4. 低优先级

    • application-{profile}.ymlapplication-{profile}.properties:这些是针对特定环境或配置文件的配置文件,具有较低的优先级。例如,application-dev.yml
  5. 最低优先级

    • 在上述文件中,更具体的配置会覆盖通用的配置。例如,application-dev.yml中的属性会覆盖application.yml中相同属性的值。

当Spring Boot应用程序启动时,它会按照上述优先级顺序加载配置文件。具有更高优先级的配置文件会覆盖具有较低优先级的配置文件中相同属性的值。这种优先级顺序确保了配置的灵活性,使开发人员可以根据需要覆盖通用配置或针对特定环境进行配置。

5.什么是yaml文件

YAML(Yet Another Markup Language,另一种标记语言)是一种轻量级的数据序列化格式,用于表示数据结构和配置信息。它的设计目标是易于阅读和编写,并且可以方便地与各种编程语言进行交互。

YAML使用缩进和空格来表示层次结构,而不是使用标记或符号。它支持列表、映射和标量类型,例如字符串、整数、布尔值等。下面是一个简单的YAML示例:

# 一个映射示例
person:
  name: John
  age: 30
  address:
    city: New York
    state: NY
    zip: 10001

# 一个列表示例
fruits:
  - apple
  - banana
  - orange

在这个示例中,我们定义了一个名为person的映射,其中包含了一个名为name的字符串属性、一个名为age的整数属性,以及一个名为address的嵌套映射。我们还定义了一个名为fruits的列表,其中包含了三个字符串元素。

YAML的主要优点是易于阅读和编写,尤其是对于复杂的数据结构和配置信息。它也支持注释和多行字符串,使得文档更易于理解和维护。在Spring Boot中,YAML是一种常用的配置文件格式,用于定义应用程序的属性和行为。

YAML有一些基本规则,这些规则有助于保持文档的一致性和易读性。以下是一些常见的YAML规则:

  1. 使用缩进表示层次结构:YAML使用缩进来表示层次结构,通常使用两个空格或四个空格作为缩进。

  2. 使用冒号表示键值对:YAML使用冒号(:)来表示键值对,键和值之间用一个空格分隔。

  3. 使用破折号表示列表项:YAML使用破折号(-)来表示列表项,列表项之间用一个空格分隔。

  4. 使用井号表示注释:YAML使用井号(#)来表示注释,井号后面的内容将被忽略。

  5. 使用单引号或双引号表示字符串:YAML使用单引号(')或双引号(")来表示字符串,双引号中的字符串支持转义字符。

  6. 使用竖线或大于号表示多行字符串:YAML使用竖线(|)或大于号(>)来表示多行字符串,竖线表示保留换行符,而大于号表示将换行符转换为空格。

  7. 使用&*表示锚点和别名:YAML使用&来表示锚点,使用*来表示别名,这可以用于共享数据结构。

这些规则有助于保持YAML文档的一致性和易读性,使其更容易理解和维护。

6.spring boot 怎么读取配置文件的数据

在Spring Boot中,读取配置文件的数据是通过@Value注解、@ConfigurationProperties注解或Environment对象来实现的。以下是这些方法的简要说明:

  1. @Value注解

    • 使用@Value注解可以直接将配置文件中的值注入到Spring组件中的字段或方法参数中。
    • 示例:
      @Value("${myapp.name}")
      private String applicationName;
      
  2. @ConfigurationProperties注解

    • 使用@ConfigurationProperties注解可以将配置文件中的值绑定到一个POJO(Plain Old Java Object)类中,这样可以更方便地组织和管理配置属性。
    • 示例:
      @Component
      @ConfigurationProperties(prefix = "myapp")
      public class MyAppProperties {
          private String name;
          // getters and setters
      }
      

这段代码定义了一个MyAppProperties类,它使用了@Component@ConfigurationProperties注解。

@Component注解表示这个类是一个Spring组件,可以被Spring容器自动扫描并创建实例。这个注解通常用于定义业务逻辑组件、持久化组件、控制器等等。

@ConfigurationProperties注解表示这个类是一个配置属性类,它将配置文件中的属性值绑定到这个类的属性中。prefix属性指定了配置文件中属性的前缀,Spring会将以这个前缀开头的属性值绑定到这个类的属性中。例如,如果配置文件中有一个名为myapp.name的属性,它的值将会被绑定到MyAppProperties类的name属性中。

在这个类中,我们定义了一个name属性,它将会被绑定到配置文件中的myapp.name属性。我们还可以定义其他的属性,它们将会被绑定到配置文件中以myapp.为前缀的其他属性中。

最后,我们需要为这个类提供gettersetter方法,以便Spring可以将属性值注入到这个类中。例如,我们可以定义一个getName()方法来获取name属性的值,以及一个setName()方法来设置name属性的值。

通过使用@ConfigurationProperties注解,我们可以将配置文件中的属性值绑定到Java对象中,这样可以更方便地管理和组织配置属性。如果我们需要在应用程序中使用这些属性,只需要将这个类注入到需要使用它们的组件中即可。

  1. Environment对象

    • 可以通过Environment对象来获取配置文件中的值。
    • 示例:
      @Autowired
      private Environment env;
      
      public void someMethod() {
          String appName = env.getProperty("myapp.name");
      }
      
  2. 配置文件的加载顺序

    • Spring Boot会按照一定的顺序加载配置文件,包括application.propertiesapplication.ymlbootstrap.propertiesbootstrap.yml,以及针对不同profile的配置文件(如application-{profile}.propertiesapplication-{profile}.yml)。
    • 配置文件中的属性可以通过${}语法引用,例如${myapp.name}

这些方法提供了灵活的方式来读取配置文件中的数据,开发人员可以根据需要选择最适合他们的方法来访问配置属性。

7. 什么是spring的注解

Spring框架中的注解是一种用于配置和管理Spring应用程序的方式。它们可以用于声明Bean、依赖注入、AOP、事务管理等方面。

以下是一些常用的Spring注解:

  1. @Component:用于声明一个类为Spring组件,可以被自动扫描并创建实例。

  2. @Autowired:用于自动装配一个Bean,可以用在构造方法、setter方法、字段上。

  3. @Qualifier:用于指定一个Bean的名称,当多个Bean类型相同时,可以用这个注解来指定要注入的Bean。

  4. @Controller@Service@Repository:用于声明一个类为Spring MVC的控制器、业务逻辑组件、持久化组件。

  5. @RequestMapping:用于定义一个HTTP请求的映射,可以用在控制器的方法上。

  6. @ResponseBody:用于将方法返回值转换为HTTP响应体,可以用在控制器的方法上。

  7. @Transactional:用于声明一个方法或类需要进行事务管理。

  8. @Aspect@Pointcut@Before@After:用于声明一个切面、切点、前置通知、后置通知等。

  9. @Value:用于注入一个配置属性的值。

  10. @Configuration@Bean:用于声明一个Java配置类和Bean。

这些注解提供了一种简洁、优雅的方式来声明和配置Spring应用程序,使得开发人员可以更加专注于业务逻辑的实现,而不是Spring框架的配置和管理。

8.profile

在Spring Boot中,profile是一种用于区分不同环境配置的机制。通过使用profile,我们可以为不同的环境(如开发、测试、生产等)提供不同的配置,从而使我们的应用程序更加灵活和可配置。

以下是在Spring Boot中使用profile的步骤:

  1. application.propertiesapplication.yml文件中定义不同环境的配置属性。例如,我们可以定义一个名为myapp.message的属性,它的值在不同环境下有不同的取值:
# application-dev.properties
myapp.message=Hello, Dev!

# application-prod.properties
myapp.message=Hello, Prod!
  1. 在启动应用程序时,通过spring.profiles.active属性指定当前的profile。例如,我们可以通过以下命令来指定当前的profiledev
java -jar myapp.jar --spring.profiles.active=dev
  1. 在应用程序中,通过@Value注解来注入不同环境下的属性值。例如,我们可以在一个Spring组件中定义一个message属性,并使用@Value注解来注入不同环境下的myapp.message属性值:
@Component
public class MyComponent {
    @Value("${myapp.message}")
    private String message;

    // ...
}

在上面的示例中,message属性的值将会根据当前的profile来自动注入不同的值。

通过使用profile,我们可以方便地为不同的环境提供不同的配置,从而使我们的应用程序更加灵活和可配置。在实际开发中,我们通常会为每个环境定义一个独立的配置文件,并通过spring.profiles.active属性来指定当前的环境。

它在yml多文档中怎么使用

在YAML多文档中使用profile,可以为每个profile定义一个独立的YAML文档,并使用YAML多文档来组织这些文档。以下是一个示例:

---
spring:
  profiles: dev
myapp:
  message: Hello, Dev!
---
spring:
  profiles: prod
myapp:
  message: Hello, Prod!

在上面的示例中,我们定义了两个YAML文档,分别对应于devprod两个profile。每个文档都包含了相应的配置属性,例如myapp.message属性的值在不同的文档中有不同的取值。

在应用程序中,我们可以通过spring.profiles.active属性来指定当前的profile,并使用Spring Boot的配置类来加载相应的YAML文档。以下是一个示例:

@Configuration
@ConfigurationProperties(prefix = "myapp")
public class MyAppConfig {
    private String message;

    // getters and setters

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

在上面的示例中,我们定义了一个名为MyAppConfig的配置类,并使用@ConfigurationProperties注解来指定前缀为myapp的属性。在@Bean方法中,我们返回了一个PropertySourcesPlaceholderConfigurer对象,用于加载YAML文档中的属性值。

通过使用YAML多文档和Spring Boot的配置类,我们可以方便地为不同的profile提供不同的配置,并在应用程序中使用这些配置属性。

9.内部配置加载顺序

在Spring Boot中,配置文件的加载顺序是有一定规则的,具体的加载顺序如下所示(按优先级从高到低):

  1. 命令行参数(Command Line Arguments):通过命令行参数传递的配置会覆盖其他配置。例如,java -jar myapp.jar --myapp.message=Hello

  2. JVM系统属性(System Properties):可以通过在启动应用程序时设置JVM系统属性来覆盖应用程序中的配置。例如,-Dmyapp.message=Hello

  3. 操作系统环境变量(OS Environment Variables):可以通过操作系统的环境变量来设置应用程序的配置。例如,export MYAPP_MESSAGE=Hello

  4. 外部配置文件

    • application.properties
    • application.yml
    • application-{profile}.properties
    • application-{profile}.yml

这些外部配置文件可以放置在应用程序的classpath下,或者通过spring.config.location属性指定的外部位置。不同profile的配置文件会根据当前激活的profile加载。

  1. 内嵌配置:Spring Boot内置了一些默认配置,这些默认配置通常被打包在应用程序的jar包中。例如,Spring Boot的自动配置类、默认配置属性等。

  2. 默认配置:Spring Boot提供了一些默认的配置,用于配置应用程序的基本行为。这些默认配置通常位于Spring Boot的jar包中,并会在应用程序启动时生效。

通过这种加载顺序,Spring Boot允许我们在不同的环境中提供不同的配置,并且具有灵活性和可扩展性。根据不同的需求,我们可以选择合适的方式来配置应用程序,同时也可以根据需要覆盖或补充默认配置。

10. spring boot 整合其它框架

Spring Boot作为一个开发框架,提供了很好的整合能力,可以方便地与其他框架和技术进行整合。以下是一些常见的框架和技术,可以与Spring Boot进行整合:

  1. Spring框架:Spring Boot是基于Spring框架构建的,因此与Spring框架的各个模块(如Spring MVC、Spring Data、Spring Security等)天然整合,可以直接在Spring Boot应用中使用这些功能。

  2. Spring Data:Spring Boot与Spring Data整合非常紧密,可以轻松地使用Spring Data JPA、Spring Data MongoDB等模块来访问和操作数据库。

  3. Spring Security:Spring Boot可以与Spring Security整合,实现应用程序的安全认证和授权功能。

  4. Spring Cloud:Spring Boot可以与Spring Cloud一起使用,实现微服务架构中的服务注册与发现、负载均衡、断路器等功能。

  5. Thymeleaf、Freemarker、Velocity:Spring Boot支持多种模板引擎,可以与Thymeleaf、Freemarker、Velocity等模板引擎整合,用于构建Web应用的视图。

  6. Hibernate、MyBatis:Spring Boot可以与Hibernate、MyBatis等持久化框架整合,实现数据持久化操作。

  7. Redis、Elasticsearch:Spring Boot可以与Redis、Elasticsearch等NoSQL数据库进行整合,实现缓存、搜索等功能。

  8. RabbitMQ、Kafka:Spring Boot可以与消息队列系统如RabbitMQ、Apache Kafka整合,实现消息传递和异步处理。

  9. Swagger:Spring Boot可以与Swagger整合,自动生成API文档,方便接口的查看和测试。

  10. JUnit、Mockito:Spring Boot与JUnit、Mockito等测试框架整合,支持单元测试和集成测试。

这些仅仅是一些常见的整合方式,实际上Spring Boot具有非常广泛的整合能力,可以与众多框架和技术进行无缝整合,使开发更加高效和便捷。

11.spring boot 整合radis

要在Spring Boot应用中整合Redis,可以通过以下步骤:

  1. 添加Redis依赖:首先,在pom.xml文件中添加Redis的依赖,例如使用Spring Data Redis依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置Redis连接信息:在application.propertiesapplication.yml中配置Redis连接信息,包括主机、端口、密码等:
spring.redis.host=your_redis_host
spring.redis.port=your_redis_port
spring.redis.password=your_redis_password
  1. 使用RedisTemplate:在需要使用Redis的地方,可以注入RedisTemplate来进行操作,例如设置值、获取值等操作:
@Autowired
private RedisTemplate<String, String> redisTemplate;

public void setValue(String key, String value) {
    redisTemplate.opsForValue().set(key, value);
}

public String getValue(String key) {
    return redisTemplate.opsForValue().get(key);
}
  1. 使用注解操作Redis:Spring Data Redis还提供了一些注解,可以方便地操作Redis,例如@Cacheable@CachePut@CacheEvict等。

  2. 集成Spring Cache和Redis:Spring Boot还可以与Spring Cache整合,将缓存数据存储在Redis中,提高应用性能。

这些是基本的整合步骤,根据具体需求和场景,还可以深入了解Redis的更多功能和特性,并结合Spring Boot提供的各种特性来更好地利用Redis。整合Redis可以为应用程序提供高性能的数据缓存、会话管理等功能,提升系统的性能和扩展性。

代码解释:

这段代码,用于在Spring Boot应用中操作Redis缓存:

  1. @Autowired:这是一个Spring Framework提供的注解,用于自动装配(自动注入)Spring Bean。在这里,@Autowired注解用于将RedisTemplate对象注入到当前类中,这样就可以在当前类中直接使用redisTemplate对象而不需要手动实例化。

  2. private RedisTemplate<String, String> redisTemplate;:这行代码声明了一个RedisTemplate对象,用于与Redis进行交互。RedisTemplate是Spring Data Redis提供的一个模板类,用于简化与Redis的交互操作。

  3. public void setValue(String key, String value):这是一个方法,用于向Redis中设置键值对数据。在方法内部,通过redisTemplate.opsForValue().set(key, value)来将指定的键值对数据存储到Redis中。这里使用了opsForValue()方法获取一个操作字符串值的对象,然后调用set(key, value)方法设置键值对数据。

  4. public String getValue(String key):这是另一个方法,用于从Redis中获取指定键的值。在方法内部,通过redisTemplate.opsForValue().get(key)来获取指定键对应的值。这里使用了opsForValue()方法获取一个操作字符串值的对象,然后调用get(key)方法获取键对应的值,并将其返回。

总的来说,这段代码片段展示了如何在Spring Boot应用中使用RedisTemplate对象来操作Redis缓存。通过setValue方法可以向Redis中设置键值对数据,通过getValue方法可以获取指定键对应的值。这样,你可以在Spring Boot应用中方便地利用Redis进行数据缓存和存储。

12. Spring Framework和Spring boot的关系

Spring Framework和Spring Boot之间的关系可以理解为Spring Framework是一个全功能的Java应用程序框架,而Spring Boot则是基于Spring Framework的快速开发框架和工具。

具体来说,它们之间的关系可以总结如下:

  1. Spring Framework

    • Spring Framework是一个全面的Java应用程序框架,提供了大量的功能和组件,包括依赖注入、面向切面编程、事务管理、MVC框架、集成各种技术、测试支持等。
    • Spring Framework需要开发者进行一些繁琐的配置,以及手动集成其他技术和框架,使得应用程序的搭建和配置相对复杂。
  2. Spring Boot

    • Spring Boot是由Spring团队推出的用于简化Spring应用程序开发的工具。
    • Spring Boot基于约定优于配置的原则,通过自动配置和快速启动帮助开发者快速搭建基于Spring的应用程序。
    • Spring Boot内置了许多常用的依赖和配置,减少了开发者的配置工作,使得应用程序的开发更加高效和简单。
    • Spring Boot还提供了一些开箱即用的功能,如嵌入式Web服务器、健康检查、外部化配置等,让开发者可以更轻松地构建独立的、可执行的Spring应用程序。

总的来说,Spring Boot是建立在Spring Framework之上的工具,旨在简化Spring应用程序的开发和部署。使用Spring Boot可以让开发者更专注于业务逻辑的实现,而不必过多关注繁琐的配置和集成问题,提高了开发效率和开发体验。因此,Spring Boot可以看作是Spring Framework的补充和增强,使得Spring应用程序的开发更加便捷和高效。

13. IoC 和 bean

在 Spring 框架中,控制反转(IoC, Inversion of Control)和 bean 是两个核心概念,它们共同构成了 Spring 的基础架构。让我们分别详细解析这两个概念:

控制反转(IoC)

控制反转是一种设计原则,用于减少代码之间的耦合度。在传统的程序设计中,代码之间的依赖关系通常由程序员在代码中直接构造,这可以导致代码的高耦合和难以测试。IoC 的思想是将依赖关系的控制权从程序代码中取走,交给外部容器处理,通过依赖注入(DI, Dependency Injection)等方式实现。

依赖注入(DI)
依赖注入是实现 IoC 的一种方法。它允许对象的依赖项通过构造器参数、工厂方法的参数或对象实例的属性来传入,而不是在对象内部创建依赖项。这样,对象不需要关心如何构造它们的依赖项,只需声明它们需要哪些依赖项即可。

Bean

在 Spring 中,bean 是构成应用程序的主要对象,由 Spring IoC 容器实例化、配置和管理。Bean 是一个被实例化、组装和由 Spring IoC 容器所管理的对象。你可以将它视为应用程序中的一个组件,如服务、存储库、工厂等。

Bean 的生命周期

Spring 容器负责管理 bean 的整个生命周期,这包括:

  • 实例化: 创建对象的实例。
  • 填充属性: 根据配置文件或注解对属性进行设置。
  • 调用 Bean 初始化方法: 如果 bean 实现了 InitializingBean 接口或通过 init-method 指定了初始化方法,Spring 容器会在设置完所有属性后调用初始化方法。
  • 使用 Bean: 一旦 bean 被初始化,它就可以被应用程序使用了。
  • 调用 Bean 销毁方法: 当容器关闭时,如果 bean 实现了 DisposableBean 接口或通过 destroy-method 指定了销毁方法,Spring 容器会调用这个方法。

通过控制反转,Spring 提供了一个强大的机制来管理对象的创建、配置和管理过程,减少了代码间的耦合。Bean 则是这一机制中的基本构件,代表了应用程序中管理的对象。这样,Spring 不仅可以用于管理对象的生命周期,还可以通过依赖注入等技术,提高代码的模块化和可测试性。

14. public 和 private

publicprivate 是 Java 中用于控制访问权限的关键字,它们用于限制类、方法和变量的可访问性。它们之间的主要区别在于访问范围和可见性:

  1. public:

    • 修饰类:如果一个类被声明为 public,则表示该类对所有其他类都是可见的。这意味着任何其他类都可以访问该类,无论这些类是否在同一个包中。
    • 修饰方法:如果一个方法被声明为 public,则表示该方法对所有其他类都是可见的。其他类可以通过该方法调用来执行其功能。
    • 修饰变量:如果一个变量被声明为 public,则表示该变量对所有其他类都是可见的,并且可以直接访问和修改。
  2. private:

    • 修饰类:类不能被声明为 private。类的访问权限只能是 public 或默认(不使用任何关键字)。
    • 修饰方法:如果一个方法被声明为 private,则表示该方法只对所在类内部可见。其他类无法直接调用或访问该方法,只有该类的其他方法可以访问。
    • 修饰变量:如果一个变量被声明为 private,则表示该变量只对所在类内部可见。其他类无法直接访问或修改该变量,只有该类的方法可以访问和修改。

总的来说,public 修饰的成员具有最高的可见性,可以被任何其他类访问。而 private 修饰的成员只能在所属类的内部访问,对外部是隐藏的。这种封装性有助于提高代码的安全性和可维护性。

15. 什么是修饰类,什么是修饰方法,什么是修饰变量

在Java中,关键字(比如publicprivate)可以用来修饰类、方法和变量,以控制它们的可见性和访问权限。下面是它们的具体含义:

  1. 修饰类:

    • 修饰类意味着指定这个类在其他类中的可见性。
    • Java中类的修饰符可以是publicabstractfinalstrictfp等。
    • public修饰的类表示该类对所有其他类可见,可以被其他类访问。
    • abstract修饰的类是抽象类,不能被实例化,只能被继承。
    • final修饰的类表示该类不能被继承。
    • strictfp修饰的类表示类中所有方法都使用严格的浮点计算规则。
  2. 修饰方法:

    • 修饰方法指定了方法在其他类中的可见性以及其他行为特征。
    • Java中方法的修饰符可以是publicprivateprotectedstaticfinal等。
    • public修饰的方法表示该方法对所有其他类可见,可以被其他类调用。
    • private修饰的方法只能在所在类内部访问,其他类无法直接调用。
    • protected修饰的方法对同一包内的类和所有子类可见。
    • static修饰的方法是静态方法,可以直接通过类名调用,而不需要实例化对象。
    • final修饰的方法表示该方法不能被子类重写。
  3. 修饰变量:

    • 修饰变量指定了变量的可见性和其他特性。
    • Java中变量的修饰符可以是publicprivateprotectedstaticfinal等。
    • public修饰的变量表示该变量对所有其他类可见,可以被其他类访问。
    • private修饰的变量只能在所在类内部访问,其他类无法直接访问。
    • protected修饰的变量对同一包内的类和所有子类可见。
    • static修饰的变量是静态变量,属于类而不是实例,可以通过类名直接访问。
    • final修饰的变量表示该变量的值不能被修改,即为常量。

通过使用这些修饰符,可以控制类、方法和变量的可见性和行为,从而实现更好的封装、继承和多态等面向对象编程的特性。

好的,下面是一个综合的例子,演示了如何在Java中使用修饰符来定义类、方法和变量:

// 修饰类、方法和变量的综合示例
public class Car {
    // 私有变量,只能在Car类内部访问
    private String brand;
    private int year;

    // 公有构造方法
    public Car(String brand, int year) {
        this.brand = brand;
        this.year = year;
    }

    // 公有方法,可以被其他类调用
    public void displayInfo() {
        System.out.println("Brand: " + brand);
        System.out.println("Year: " + year);
    }

    // 私有方法,只能在Car类内部调用
    private void drive() {
        System.out.println("Driving the car...");
    }

    // 静态方法,可以直接通过类名调用
    public static void main(String[] args) {
        // 创建Car对象
        Car myCar = new Car("Toyota", 2022);

        // 调用公有方法
        myCar.displayInfo();

        // 无法调用私有方法,会报错
        // myCar.drive();
    }
}

在这个例子中:

  • Car 类使用public修饰符声明,表示该类对外部可见。
  • brandyear 变量使用private修饰符声明,表示这些变量只能在 Car 类内部访问。
  • Car 类有一个公有构造方法 Car(String brand, int year),可以被其他类用来实例化对象。
  • displayInfo() 方法使用public修饰符声明,表示该方法对外部可见,用于显示汽车的品牌和年份信息。
  • drive() 方法使用private修饰符声明,表示该方法只能在 Car 类内部调用,用于模拟驾驶汽车的行为。
  • main 方法是一个静态方法,可以直接通过类名调用,用于演示如何创建 Car 对象并调用公有方法。

这个例子展示了如何使用不同的修饰符来控制类、方法和变量的可见性和行为。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

刚刚!MySQL8.4.0 LTS发布,接着再探

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

郡望是一个什么性质的概念

顾名思义&#xff0c;郡望就是某郡中的望族。 别看现在听起来没什么感觉&#xff0c;在古代却是一个沉甸甸的庞然大物&#xff0c;是标志贵贱的&#xff0c;决定了个人&#xff0c;家庭和家族的未来。 自秦朝实行郡县制&#xff0c;直到唐朝废郡&#xff0c;郡做为一级或州管的…

【AIGC调研系列】LLaVA++整合Phi-3和Llama-3能够实现什么

LLaVA能够为Phi-3和Llama-3带来的主要好处包括&#xff1a; 视觉处理能力的增强&#xff1a;通过整合Phi-3和Llama-3模型&#xff0c;创建了具备视觉处理能力的Phi-3-V和Llama-3-V版本&#xff0c;这意味着这些模型现在能够理解和生成与图像相关的内容[1]。这种能力的增加&…

浅论汽车研发项目数字化管理之道

随着汽车行业竞争不断加剧&#xff0c;汽车厂商能否快速、高质地推出贴合市场需求的新车型已经成为车企竞争的重要手段&#xff0c;而汽车研发具备流程复杂、专业领域多、协作难度大、质量要求高等特点&#xff0c;企业如果缺少科学健全的项目管理体系&#xff0c;将会在汽车研…

如何查看我的Docker 容器和 `app.py` 脚本有足够的权限来读取 `config.json` 文件

要检查 Docker 容器和 app.py 脚本是否具有读取 config.json 文件的足够权限&#xff0c;你可以按照以下步骤操作&#xff1a; 检查宿主机上的文件权限&#xff1a; 在宿主机上&#xff0c;使用 ls -l 命令查看 config.json 文件的权限。 ls -l /path/to/config.json确保该文件…

从车规传感器发展的正反面,看智驾发展的“胜负手”

北京车展进程过半&#xff0c;雷军和周鸿祎成为车展新晋“网红”的同时&#xff0c;智能驾驶成为观众讨论最务实的话题之一。端到端自动驾驶、城市NOA这些炙手可热的话题&#xff0c;占据了大部分的关注度。 但在高阶智能驾驶之外&#xff0c;智能驾驶同样具有频繁使用需求的低…

实验案例一:在一台交换机上配置 VLAN

1.实验环境 实验拓扑图结构如图12.12所示&#xff0c;其中PC1和PC3属于VLAN 2&#xff0c;PC2属于VLAN 3&#xff0c;PC1的IP 地址为192.168.0.2/24&#xff0c;PC2的P 地址为 192.168.1.2/24&#xff0c;PC3的P地址为192.168.0.3/24 2.需求描述 要求处于相同VLAN中的主机能够…

CSS的布局模式

前言&#xff1a; 我们可以看到京东的官网上的一些例子&#xff08;如下图&#xff09;&#xff0c;在同一排中能够存在多个div&#xff0c;这是通过布局方式&#xff08;例如浮动&#xff09;来实现的。 CSS传统的布局模式&#xff1a; <1>普通流&#xff08;又称之为标…

Codeforces Round 928 (Div. 4) F. Vlad and Avoiding X

Vlad and Avoiding X 题目描述 弗拉迪斯拉夫有一个大小为 7 7 7 \times 7 77 的网格&#xff0c;其中每个单元格的颜色都是黑色或白色。在一次操作中&#xff0c;他可以选择任意一个单元格并改变其颜色&#xff08;黑色 ↔ \leftrightarrow ↔ 白色&#xff09;。 请找出…

39.WEB渗透测试-信息收集-域名、指纹收集(1)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;38.WEB渗透测试-信息收集-信息收集-企业信息收集&#xff08;5&#xff09; 子域名信息收…

公文写作笔记

标题 最后一行的日期&#xff0c;后边占4个格子。两个数字占一格。落款单位在日期的正上方。 格式积累 内容&#xff1a; ①开头&#xff1a;缘由 ②主题&#xff1a;对策&#xff08;别人做得好&#xff0c;就借鉴&#xff09; ③结尾&#xff1a;简单的总结&#xff08;字…

LeetCode - 611.有效三角形个数

题目链接 LeetCode - 611. 有效三角形的个数 动画解释 代码解释 class Solution { public:int triangleNumber(vector<int>& nums) {sort(nums.begin(),nums.end());int cout 0;int fix nums.size()-1;while(fix>1){int left 0;int right fix-1;while(left &l…

rust将json字符串直接转为map对象或者hashmap对象

有些时候我们还真的不清楚返回的json数据里面到底有哪些数据&#xff0c;数据类型是什么等&#xff0c;这个时候就可以使用批处理的方式将json字符串转为一个对象&#xff0c;然后通过这个对象的get方法来获取json里面的数据。 pub async fn test_json(&self) {let json_st…

通过AI助手实现一个nas定时任务更新阿里云域名解析

一.通过AI助手实现一个ip-domain.py的脚本 起一个Python脚本&#xff0c;ip-domain.py&#xff1b;注意已安装Python3.的运行环境&#xff1b;将下面阿里云相关配置添加&#xff0c;注意这里引用了两个包&#xff0c;requests和alibabacloud_alidns20150109&#xff1b;执行前…

如何设计一套轻量级的批处理技术?

对于任何应用程序而言&#xff0c;可以说批处理都是一种基础设施类的技术组件。批处理技术应用非常广泛&#xff0c;数据报表、统计分析、定时任务等场景实际上都可以应用批处理技术。如何在不需要人工参与的情况下进行离线、自动、高效地进行复杂数据分析是批处理程序需要考虑…

如何消除SmartScreen“未知发布者”警告?

在互联网高速发展、应用程序遍地开花的当今时代&#xff0c;作为企业&#xff0c;我们通常会开发自己的应用程序来开展自己的业务&#xff0c;以便与客户建立更深入的联系。不少应用程序所有者可能会面临一个难题&#xff0c;那就是用户下载时&#xff0c;系统会弹出SmartScree…

可以在手机端运行的大模型标杆:微软发布第三代Phi-3系列模型,评测结果超过同等参数规模水平,包含三个版本,最小38亿,最高140亿参数

本文原文来自DataLearnerAI官方网站&#xff1a; 可以在手机端运行的大模型标杆&#xff1a;微软发布第三代Phi-3系列模型&#xff0c;评测结果超过同等参数规模水平&#xff0c;包含三个版本&#xff0c;最小38亿&#xff0c;最高140亿参数 | 数据学习者官方网站(Datalearner…

Docker-harbor——私有仓库部署与管理

目录 一、搭建本地私有仓库 1.下载Registry镜像 2.添加本地私有仓库配置 3.重启服务并运行Registry容器 4.容器的操作 4.1拉取Nginx镜像并为镜像打标签 4.2上传到私有仓库 4.3列出私有仓库所有镜像 4.4列出私有仓库的镜像的所有标签 5.先删除原有镜像再拉取私有仓库镜…

Python 全栈体系【四阶】(三十七)

第五章 深度学习 八、目标检测 3. 目标检测模型 3.1 R-CNN 系列 3.1.1 R-CNN 3.1.1.1 定义 R-CNN(全称 Regions with CNN features) &#xff0c;是 R-CNN 系列的第一代算法&#xff0c;其实没有过多的使用“深度学习”思想&#xff0c;而是将“深度学习”和传统的“计算…

华为配置mDNS网关示例(AP与AC间二层转发)

华为配置mDNS网关示例&#xff08;AP与AC间二层转发&#xff09; 组网图形 图1 配置mDNS网关组网图 组网需求配置思路操作步骤配置文件 组网需求 如图1所示&#xff0c;某企业的移动终端通过WLAN连接网络&#xff0c;AP_1和AP_2分别与AC之间采用二层转发。部门1和部门2分别属…
最新文章