Spring Boot核心注解大全:从入门到精通(三)

本系列文章简介:

        Spring Boot是一款非常流行的Java开发框架,它通过简化配置和提供丰富的开箱即用功能,使得Java开发变得更加快速和简单。在Spring Boot中,核心注解扮演着非常重要的角色,它们定义了应用程序的行为和特性。因此,了解并熟练掌握这些核心注解是非常重要的。

        本系列文章将带您从入门到精通,介绍Spring Boot的核心注解,帮助您深入理解它们的作用和用法。无论您是初学者还是有一定经验的开发者,都可以通过本系列文章学习到有关Spring Boot注解的重要知识。

        在本系列文章中,我们将按照不同的功能和用途对核心注解进行分类和介绍。这些注解包括但不限于:配置注解、启动注解、路由注解、数据访问注解、事务注解等。我们将逐一介绍每个注解的作用和如何使用它们。

        此外,我们还将提供大量的示例代码和实际应用场景,帮助您更好地理解和应用这些注解。通过学习本系列文章,您将能够掌握Spring Boot注解的核心概念和用法,快速上手并有效地开发出高质量的应用程序。

        无论您是正在学习Spring Boot,还是希望提升自己的开发技能,本系列文章都将是一个很好的参考资料。我们相信,通过学习Spring Boot核心注解,您将能够更加高效地进行Java开发,为您的项目带来更大的成功。让我们一起开始吧!

        欢迎大家订阅《Java技术栈高级攻略》专栏,一起学习,一起涨分!

目录

1、前言

2、缓存注解

2.1 @Cacheable

2.2 @CachePut

2.3 @CacheEvict

3、定时任务注解

3.1 @Scheduled

3.2 @EnableScheduling

4、异步方法注解

4.1 @Async

5、条件注解

5.1 @Conditional

6、配置注解

6.1 @Configuration

6.2 @Value

6.3 @ConfigurationProperties

7、结语


1、前言

        Spring Boot是一个开源的Java框架,它被设计用来简化Spring应用的创建和开发过程。它基于Spring框架,通过自动配置和约定大于配置的方式,提供了一种快速创建独立的、可部署的Spring应用的方法。

        本文将跟随《Spring Boot核心注解大全:从入门到精通(二)》的进度,继续介绍Spring Boot核心注解。希望通过本系列文章的学习,您将能够更好地理解Spring Boot核心注解的内部工作原理,掌握Spring Boot核心注解的使用技巧,以及通过合理的设计完成最佳实践,充分发挥优化Spring Boot核心注解的潜力,为系统的高效运行提供有力保障。

2、缓存注解

2.1 @Cacheable

@Cacheable注解用于将方法的结果缓存起来,以便在下次调用相同方法时可以直接从缓存中取值,而不需要再次执行方法。

使用@Cacheable注解时,可以指定一个缓存的名称和一个缓存键的生成策略。例如:

@Cacheable(value = "myCache", key = "#param")
public Object getResult(String param) {// method logic here...
}

上述代码将方法的返回结果缓存在名为"myCache"的缓存中,缓存键的生成策略是根据方法的参数param来生成的。

@Cacheable注解还可以指定条件,只有当满足条件时才会将方法的返回结果缓存起来。例如:

@Cacheable(value = "myCache", key = "#param", condition = "#result != null")
public Object getResult(String param) {// method logic here...
}

上述代码表示只有当方法的返回结果不为null时才会将结果缓存起来。

同时,@Cacheable注解还可以设置一个过期时间,表示缓存的数据在多长时间后失效。例如:

@Cacheable(value = "myCache", key = "#param", condition = "#result != null", expire = 600)
public Object getResult(String param) {// method logic here...
}

上述代码表示缓存的数据在600秒后失效。

需要注意的是,@Cacheable注解需要配合缓存管理器一起使用,以实现真正的缓存功能。可以通过配置文件或者代码的方式配置缓存管理器。另外,还需要确保使用了@Cacheable注解的方法始终返回相同类型的值,否则会导致缓存数据类型不一致的问题。

2.2 @CachePut

@CachePut注解用于将方法的返回值保存到缓存中。它主要用于在调用方法之前,检查缓存中是否已存在相应的键值对。如果存在,则不执行方法;如果不存在,则执行方法,并将返回值保存到缓存中。

使用@CachePut注解需要先配置一个缓存管理器,比如使用Spring提供的CacheManager或者其他缓存框架提供的缓存管理器。

下面是一个示例代码:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@CachePut(value = "users", key = "#user.id")public User save(User user) {return userRepository.save(user);}
}@Repository
public interface UserRepository extends JpaRepository<User, Long> {// ...
}

在上面的示例中,save方法使用了@CachePut注解来将返回值保存到名为"users"的缓存中,并以user对象的id作为缓存的键值。

需要注意的是,@CachePut注解与@Cacheable注解的区别在于,@CachePut注解总是执行方法,并将返回值保存到缓存中,而不去检查缓存中是否已存在相应的键值对。因此,@CachePut注解适合用于更新缓存的情况,比如更新数据库中的数据。

总结: @CachePut注解用于将方法的返回值保存到缓存中,常用于更新缓存的情况。使用@CachePut注解需要先配置一个缓存管理器,并且需要指定缓存的名称和键值。

2.3 @CacheEvict

@CacheEvict注解是Spring框架中的一个注解,用于清除缓存。它可以应用在方法上,表示该方法执行后将清除指定的缓存区域。

@CacheEvict注解的常用属性如下:

  • value:指定要清除缓存的名称,可以是一个字符串或字符串数组。若不指定,则默认使用默认缓存管理器的名称。
  • key:指定要清除的缓存项的键,支持SpEL表达式。若不指定,则会根据方法参数生成一个默认的键。
  • condition:指定清除缓存的条件,支持SpEL表达式。只有当条件为真时,才会清除缓存。默认为空,表示无条件清除。
  • allEntries:指定是否要清除缓存中的所有项。默认为false,表示只清除指定的键对应的缓存项。

以下是一个使用@CacheEvict注解的例子:

@Service
public class UserService {@CacheEvict(value = "users", key = "#id")public void deleteUserById(Long id) {// 执行删除用户的操作}@CacheEvict(value = "users", allEntries = true)public void deleteAllUsers() {// 执行删除所有用户的操作}}

在上面的例子中,deleteUserById方法使用@CacheEvict注解清除了名为"users"的缓存区域中键为指定id的缓存项。deleteAllUsers方法使用@CacheEvict注解清除了名为"users"的缓存区域中的所有缓存项。

需要注意的是,@CacheEvict注解只能应用在有缓存注解(如@Cacheable、@CachePut)的方法上,否则无效。

3、定时任务注解

3.1 @Scheduled

@Scheduled注解是Spring框架提供的一个注解,用于定义定时任务。通过在方法上添加该注解,可以指定方法在特定的时间间隔内执行。

@Scheduled注解有几种使用方式:

  1. 固定时间间隔执行:使用fixedRate属性,指定方法的执行间隔时间,单位是毫秒。
  2. 固定延迟执行:使用fixedDelay属性,指定方法的执行间隔时间,单位是毫秒。与fixedRate不同的是,fixedDelay会等待上一个方法执行完成后再执行下一个方法。
  3. cron表达式执行:使用cron属性,指定方法的执行时间,支持cron表达式的完整语法。

下面是一个使用@Scheduled注解的例子:

@Component
public class MyScheduledTask {@Scheduled(fixedRate = 5000)public void doTask() {// 方法要执行的操作}@Scheduled(fixedDelay = 5000)public void doAnotherTask() {// 方法要执行的操作}@Scheduled(cron = "0 0 12 * * ?")public void doCronTask() {// 方法要执行的操作}
}

在上面的例子中,MyScheduledTask类是一个Spring组件,使用@Component注解进行标记。在类中的方法上添加了@Scheduled注解,分别定义了三个定时任务方法。第一个doTask方法每隔5秒钟执行一次,第二个doAnotherTask方法等上一个方法执行完成后再等5秒钟执行,第三个doCronTask方法使用cron表达式指定每天中午12点执行一次。

需要注意的是,@Scheduled注解需要与@EnableScheduling注解一起使用,以启用Spring的定时任务功能。在Spring Boot应用中,可以直接在启动类上添加@EnableScheduling注解。

以上就是@Scheduled注解的详解和使用方法。通过使用该注解,可以轻松地定义和管理定时任务。

3.2 @EnableScheduling

@EnableScheduling是Spring框架中的一个注解,它用于启用定时任务的功能。在使用这个注解之前,我们需要先配置一个实现了SchedulingConfigurer接口的类,并在其中实现定时任务的相关逻辑。

@EnableScheduling注解的作用是告诉Spring框架,我们希望启用定时任务的功能,并且该注解可以用在Spring Boot应用程序的入口类上(通常是带有@SpringBootApplication注解的类)。

使用@EnableScheduling注解后,我们就可以在Spring应用程序中使用@Scheduled注解来定义定时任务。@Scheduled注解可以配置定时任务的执行时间、执行频率、执行逻辑等。

例如,下面是一个简单的示例:

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import import org.springframework.stereotype.Component;@Component
@EnableScheduling
public class ScheduledTasks {@Scheduled(fixedRate = 5000)public void printMessage() {System.out.println("Hello, world!");}
}

在上面的示例中,我们定义了一个名为printMessage的定时任务,它会每5秒钟打印一次"Hello, world!"。

需要注意的是,@EnableScheduling注解只能用于标记Spring应用程序的入口类,并且定时任务的方法需要有public修饰符,否则无法被Spring框架识别。

总结一下,@EnableScheduling注解的作用是启用定时任务的功能,它可以用于标记Spring应用程序的入口类,并配合@Scheduled注解来定义定时任务的执行逻辑。

4、异步方法注解

4.1 @Async

@Async注解是Spring框架提供的一个用于实现异步方法调用的注解。

在需要实现异步调用的方法上加上@Async注解,就可以将该方法的执行交给一个单独的线程来处理,而当前线程可以继续执行其他操作。

使用@Async注解需要满足以下条件:

  1. 需要在配置类中添加@EnableAsync注解,开启异步方法支持。
  2. 需要在异步方法所在的类上添加@Component或@Service注解,使其能够被Spring框架扫描到。
  3. 异步方法必须是public修饰的。

使用@Async注解的方法不能有返回值,如果需要返回结果,可以通过Future<T>对象来获取。

下面是一个使用@Async注解的示例:

@Configuration
@EnableAsync
public class AppConfig {
}@Service
public class MyService {@Asyncpublic void doSomething() {// 异步执行的逻辑}@Asyncpublic Future<String> doSomethingWithResult() {// 异步执行的逻辑return new AsyncResult<>("result");}
}

在上述示例中,doSomething方法和doSomethingWithResult方法被标注为@Async,因此它们的执行将在一个单独的线程中进行。

需要注意的是,使用@Async注解时要确保使用的是基于线程池的TaskExecutor,而不是SimpleAsyncTaskExecutor,因为SimpleAsyncTaskExecutor是每次调用都会创建一个新的线程,而线程池可以重用线程,性能更好。

除了上述示例中的方法级别的@Async注解,还可以在类级别上使用@Async注解,表示该类的所有方法都是异步的。

需要注意的是,@Async注解只有在使用@EnableAsync注解开启异步方法支持后才会生效。

5、条件注解

5.1 @Conditional

@Conditional注解是Spring框架提供的一个条件化注解,用于根据条件决定是否创建一个Bean。

使用@Conditional注解时,我们需要定义一个条件类,该类实现了Condition接口,并重写了其中的matches方法。matches方法返回一个boolean值,用于判断是否创建该Bean。

例如,我们定义一个条件类MyCondition:

public class MyCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {// 根据条件判断是否创建Bean// 返回true,则创建Bean;返回false,则不创建Bean}
}

然后我们可以在需要条件化创建Bean的地方使用@Conditional注解,指定我们定义的条件类:

@Configuration
public class MyConfiguration {@Bean@Conditional(MyCondition.class)public MyBean myBean() {// 创建Bean的逻辑return new MyBean();}
}

在上述例子中,只有当MyCondition.matches方法返回true时,才会创建MyBean对象并注入到Spring容器中。如果返回false,那么将不会创建MyBean对象。

@Conditional注解的使用场景非常广泛,可以用于动态创建Bean,根据不同的环境条件创建不同的Bean,或者根据某些配置属性创建Bean等等。它可以灵活的控制Bean的创建和销毁,使得应用程序的逻辑更加灵活和可配置。

6、配置注解

6.1 @Configuration

@Configuration是一个用来标识配置类的注解,表示该类是一个配置类,用于定义配置信息和创建Bean实例。

@Configuration注解通常与@Bean注解一起使用,使用@Bean注解的方法会被Spring容器托管,返回的对象会被添加到Spring容器中。可以使用@Configuration注解的类来替代XML配置文件,通过Java代码来配置Bean。

使用@Configuration注解的类通常有以下特点:

  1. 该类必须被@ComponentScan扫描到,可以通过@ComponentScan注解指定扫描的包范围。
  2. 使用@Bean注解的方法必须返回一个对象,Spring会将该对象添加到容器中。
  3. 使用@Bean注解的方法可以有参数,参数可以使用@Autowired注解进行自动装配。

@Configuration注解的使用示例:

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {@Beanpublic MyBean myBean() {return new MyBean();}
}

在上面的示例中,AppConfig类被@Configuration注解标识为配置类,使用@ComponentScan注解指定了需要扫描的包路径。另外,该类还定义了一个名为myBean的@Bean方法,用于创建一个MyBean对象,Spring会将该对象添加到容器中。

在使用@Configuration注解时需要注意以下几点:

  1. @Configuration注解标识的类内部的@Bean方法不能在同一个类中调用,否则@Bean方法会失效。
  2. 可以使用@Import注解来导入其他配置类,方便管理配置。
  3. 可以使用@PropertySource注解来加载外部的配置文件。
  4. 使用@ConfigurationProperties注解来绑定配置文件的属性到一个Bean中。

总之,使用@Configuration注解可以方便地替代XML配置文件,通过Java代码来配置Bean,提高了代码的可读性和维护性。

6.2 @Value

@Value注解是Spring框架中用于对字段进行赋值的注解。它可以用于类的属性上,也可以用于方法的参数上。

在类的属性上使用@Value注解,可以直接为属性赋值。例如:

@Component
public class MyBean {@Value("Hello World")private String message;//...
}

这里的message属性会被赋值为"Hello World"。可以看到,我们可以直接在@Value注解中指定属性的值。

除了直接指定属性的值,@Value注解还支持表达式的使用。例如:

@Component
public class MyBean {@Value("#{systemProperties['my.property']}")private String myProperty;//...
}

这里的myProperty属性会被赋值为系统属性my.property的值。

@Value注解还支持使用SpEL表达式。例如:

@Component
public class MyBean {@Value("#{T(java.lang.Math).random()}")private double randomNumber;//...
}

这里的randomNumber属性会被赋值为一个随机数。

在方法的参数上使用@Value注解,可以将注解的值作为方法的参数传入。例如:

@Component
public class MyBean {@Autowiredprivate MyService myService;public void doSomething(@Value("Hello World") String message) {myService.printMessage(message);}
}

这里的doSomething方法的参数message会被赋值为"Hello World",然后传递给myService的printMessage方法。

总结一下,@Value注解可以用于直接为字段赋值,支持直接指定值、使用表达式和SpEL表达式;也可以用于方法的参数上,将注解的值作为方法的参数传入。

6.3 @ConfigurationProperties

@ConfigurationProperties是Spring Boot提供的一个注解,用于将配置文件中的属性值映射到一个Java对象中。它可以用在任何Spring管理的Bean上,使这个Bean成为一个配置类。

使用@ConfigurationProperties注解的步骤如下:

  1. 创建一个Java类,并在类上添加@ConfigurationProperties注解。这个类将用于映射配置文件中的属性。
  2. 在类中定义与配置文件中属性对应的字段,并为这些字段提供getter和setter方法。
  3. 在配置文件中设置属性的值。

举个例子,假设我们有一个配置文件application.properties,其中包含了以下属性:

myapp.name=My Application
myapp.version=1.0.0
myapp.description=This is a sample application.

我们可以创建一个类来映射这些属性:

@ConfigurationProperties(prefix = "myapp")
public class MyAppConfig {private String name;private String version;private String description;// getter and setter methods here...
}

在这个类中,我们使用了prefix = "myapp"来指定属性的前缀。使用这个前缀,我们可以将配置文件中的属性值映射到这个类的对应字段中。

然后,在我们的Spring Boot应用程序中,我们可以使用@Autowired注解将这个配置类注入到其他地方使用:

@Autowired
private MyAppConfig myAppConfig;

现在,我们就可以在代码中使用myAppConfig对象来访问配置文件中的属性了:

String appName = myAppConfig.getName();
String appVersion = myAppConfig.getVersion();
String appDescription = myAppConfig.getDescription();

@ConfigurationProperties还支持属性的校验和默认值设置。我们可以在字段上使用javax.validation.constraints注解来定义校验规则,例如:

@NotBlank(message = "Name cannot be blank")
private String name;

同时,我们也可以为字段提供默认值,当配置文件中没有为该字段设置值时,将使用默认值:

private String name = "Default Name";

总之,@ConfigurationProperties注解是一个非常方便的工具,可以帮助我们轻松地将配置文件中的属性值映射到Java对象中。这样做可以使我们的代码更加清晰和可维护。

7、结语

        文章至此,已接近尾声!希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注。您的支持是作者创作的最大动力,如果您觉得这篇文章对您有所帮助,请分享给身边的朋友和同事!

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

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

相关文章

LeetCode 53. 最大子序和

解题思路 相关代码 class Solution {public int maxSubArray(int[] nums) {//f[i]是以nums[i]结尾的连续子数组的最大和。int f[] new int[100010];f[0] nums[0];int resnums[0];for(int i1;i<nums.length;i){f[i] Math.max(f[i-1]nums[i],nums[i]);res Math.max(res,f…

【LeetCode热题100】【二叉树】二叉树的中序遍历

题目链接&#xff1a;94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09; 中序遍历就是先遍历左子树再遍历根最后遍历右子树 class Solution { public:void traverse(TreeNode *root) {if (!root)return;traverse(root->left);ans.push_back(root->val);tra…

js的模块是怎么加载的

js的模块是怎么加载的 以上是几种常见的 JavaScript 模块加载方式。不同的加载方式适用于不同的场景&#xff0c;选择合适的模块加载方式可以更好地组织和管理 JavaScript 代码。 1.ES6 模块 (ESM)&#xff1a;ES6 模块是 JavaScript 中官方的模块化方案&#xff0c;使用 imp…

阻抗匹配(低频和高频)

一、当信号为低频时 二、当信号为高频时 三、最理想的阻抗要求&#xff1f; 四、为什么射频阻抗基本都是50欧姆&#xff08;信号源阻抗传输线特征阻抗负载阻抗50欧姆&#xff09; 综合考虑&#xff0c;射频行业标准选定50欧姆阻抗。

kubeadm k8s 1.24之后版本安装,带cri-dockerd

最后编辑时间&#xff1a;2024/3/26 适用于1.24之后的版本 单节点配置 检查是否已经安装kubectl, kubelet, kubeadm直接输入命令确定&#xff0c;如果提示没有该指令则正确 kubectl kubelet kubeadm如果之前安装&#xff0c;首先reset&#xff0c;然后使用apt remove和snap r…

java1.8关于 List .Stream()常用的方法

List <String>listArrays.strean(array).collect(Collectors.toList())&#xff1b;//数组转集合 String[] arraylist.stream().toArray(String[]::new);//集合转数组 Map<String,String>list.stream().collect(Collectors.toMap(Student::getId,Student::getNam…

SqlServer快速导出数据库结构的方法

1、查询出所有的表 SELECT name, id From sysobjects WHERE xtype u ORDER BY name ASC 2、根据表名查询出表结构 select syscolumns.name as "列名", systypes.name as "数据类型", syscolumns.length as "数据长度", sys.extended_prope…

【三十九】【算法分析与设计】综合练习(5),79. 单词搜索,1219. 黄金矿工,980. 不同路径 III

79. 单词搜索 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平…

hive-3.1.2分布式搭建与hive的三种交互方式

hive-3.1.2分布式搭建&#xff1a; 一、上传解压配置环境变量 在官网或者镜像站下载驱动包 华为云镜像站地址&#xff1a; hive&#xff1a;Index of apache-local/hive/hive-3.1.2 mysql驱动包&#xff1a;Index of mysql-local/Downloads/Connector-J # 1、解压 tar -zx…

C/C++的前置++、后置++以及前置--、后置--使用的详细讲解

在c/c语言中&#xff0c;变量的自增和自减经常被使用到&#xff0c;所以今天就来个详细讲解。本次讲解用到的语言是c语言&#xff0c;在c中的原理也是一样的。 变量自增自减分为四种情况&#xff0c;每种情况的结果都有所差异&#xff0c;四种情况分别为前置、后置、前置--、后…

STK Components 二次开发-卫星碎片

1.碎片数据下载 2.处理数据 和处理卫星数据一致。 3.批量创建卫星碎片 其实创建方式和卫星一样 var issPoint new Sgp4Propagator(tleList).CreatePoint();var debris new Platform{Name tleList.Name,LocationPoint issPoint,OrientationAxes new AxesVehicleVelocityL…

基于Whisper语音识别的实时视频字幕生成 (二): 在线实时字幕

Whisream Whistream&#xff08;微流&#xff09;是基于Whisper语音识别的的在线字幕生成工具&#xff0c;支持rtsp/rtmp/mp4等视频流在线语音识别 1. whistream介绍 whistream将在whishow基础上引入whisper进行在线语音识别生成视频字幕 2. 使用 python&#xff1a; pyth…

React Router 中常用的方法总结

在 React 中使用 React Router 可以实现类似于 Vue Router 的路由跳转、获取参数和编程式导航、获取路由对象等功能。以下是一些常用的方法&#xff1a; 编程式导航&#xff1a;您可以使用 useHistory 钩子进行编程式导航。以下是一个示例&#xff1a; import { useHistory }…

第23次修改了可删除可持久保存的前端html备忘录:增加了百度引擎

第22次修改了可删除可持久保存的前端html备忘录视频背景分离&#xff0c;增加了本地连接&#xff0c;增加了纯CSS做的折叠隐藏修改说明 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport…

JVM-结合MAT工具分析OOM问题

JVM-结合MAT工具分析OOM问题 启动项目前配置VM参数 -XX:UseParNewGC -XX:UseConcMarkSweepGC -Xms1m #初始化大小 -Xmx1m #最大值 -XX:PrintGCDetails -Xloggc:gc_dandan.log -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath./运行结果截图 使用MAT打开java_pid12164.hprof…

IDEA无法成功配置Tomcat的解决方法(IDEA版本问题)

在创建Servlet时&#xff0c;下载了Tomcat文件夹以及成功配置了环境变量之后&#xff0c;在IDEA中怎么都找不到Tomcat&#xff0c;尝试了网络中的各种方法&#xff0c;都不行&#xff0c;结果发现时IDEA版本的问题。因为我下的IDEA是社区版的&#xff0c;所以没有自带的Tomcat&…

Gitflow和元数据是什么

Gitflow 是一种基于 Git 的分支管理工作流程&#xff0c;旨在帮助团队更有效地管理软件开发过程中的版本发布、功能开发和修复 bug。它由 Vincent Driessen 在他的博客上首次提出&#xff0c;并已成为许多团队常用的工作流程模型之一。 Gitflow 工作流程主要包括以下几个关键分…

4.9日总结

1.MySQL概述 1.数据库基本概念&#xff1a;存储数据的仓库&#xff0c;数据是有组织的进行存储 2.数据库管理系统&#xff1a;操纵和管理数据库的大型软件 3.SQL&#xff1a;操作关系型数据库的编程语言&#xff0c;定义了一套操作型数据库统一标准 2.MySQL数据库 关系型数…

运行gitHub中的vue项目,遇到三个报错解决方案

报错1&#xff1a;解决npm run serve启动报错npm ERR Missing script:"serve" 启动项目的时候用npm run serve发现报了以下的错误 npm ERR! Missing script: "serve" npm ERR! npm ERR! To see a list of scripts, run: npm ERR! npm runnpm ERR! A co…

03-JAVA设计模式-代理模式详解

代理模式 什么是代理模式 Java代理模式是一种常用的设计模式&#xff0c;主要用于在不修改现有类代码的情况下&#xff0c;为该类添加一些新的功能或行为。代理模式涉及到一个代理类和一个被代理类&#xff08;也称为目标对象&#xff09;。代理类负责控制对目标对象的访问&a…