Spring (四) 之配置及配置文件的操作

文章目录

  • 1、Spring 基于注解的配置
    • 基于注解的配置
    • 引入依赖包
    • 配置
    • 实体类
    • 数据访问层
    • 业务层
    • 业务层实现
    • 测试
  • 2、@Bean和@Component和@Configuration的区别
      • 1 @Bean:
      • 2 @Component:
      • 3 @Configuration:
      • 总结:
    • 区别
      • @Component和@Configuration区别
  • 3、Spring读取properties配置文件
    • 准备配置文件
    • 通过配置文件配置
      • 方式一:
      • 方式二:
    • 使用
    • 导入依赖包
    • 测试
      • 输出,表示连接上数据库
    • 通过注解配置
      • 在AppConfig中导入DatabaseConfig
      • 测试
      • 输出
  • 4、Spring 中的监听器事件
    • Spring 中的事件处理
      • Spring 提供了以下的标准事件:
    • 监听上下文事件
      • 下面是 **CSRefreshedEventHandler.java** 文件的内容:
      • 下面是 **CStartEventHandler.java** 文件的内容:
      • 下面是 **CStopEventHandler.java** 文件的内容:
      • 下面是 **CSClosedEventHandler.java** 文件的内容:
      • 下面是 调用的内容:
      • 输出以下消息:
  • 5、Spring整合junit
    • 整合Junit5
      • 引入包
    • 注解版
    • 配置文件xml版
  • 6、Spring SpEL表达式语言
    • 一、${}
    • 二、${}使用
    • 总结
  • 上一篇:[Spring (三) 之Aop及事务控制](https://blog.csdn.net/qq_45525848/article/details/137721166)

在这里插入图片描述

1、Spring 基于注解的配置

基于注解的配置

从 Spring 2.5 开始就可以使用注解来配置依赖注入。而不是采用 XML 来描述一个 bean 连线,你可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身。

在 XML 注入之前进行注解注入,因此后者的配置将通过两种方式的属性连线被前者重写。

注解连线在默认情况下在 Spring 容器中不打开。因此,在可以使用基于注解的连线之前,我们将需要在我们的 Spring 配置文件中启用它。所以如果你想在 Spring 应用程序中使用的任何注解,可以考虑到下面的配置文件。

@Configuration的约束

Configuration类必须作为类提供(即不作为从工厂方法返回的实例),以允许通过生成的子类增强运行时

配置类必须不是final。

配置类必须是非本地的(即,不能在方法中声明)。

任何嵌套的配置类都必须声明为static。

@Bean 方法不会再创建其他配置类(任何此类实例都将被视为常规Bean,其配置注释不会被检测到)。

引入依赖包

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.19</version>
</dependency>

配置

package com.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;@Configuration
@ComponentScan("com")
public class AppConfig {
}

实体类

package com.entity;import lombok.Data;@Data
public class User {private Long id;private String userName;private String password;
}

数据访问层

package com.dao;import org.springframework.stereotype.Repository;@Repository
public class UserDao {public void save(){System.out.println("save....");}
}

业务层

package com.service;public interface UserService {void save();
}

业务层实现

package com.service.impl;import com.dao.UserDao;
import com.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService {@AutowiredUserDao userDao;@Overridepublic void save() {userDao.save();}
}

测试

package com.main;import com.config.AppConfig;
import com.service.UserService;
import com.service.impl.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class StartApplication {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);UserService userService = context.getBean(UserServiceImpl.class);userService.save();}
}

2、@Bean和@Component和@Configuration的区别

@Bean, @Component, 和 @Configuration 是Spring Framework中用于配置Bean的三个不同注解,它们有以下区别:

1 @Bean:

  • 作用:@Bean注解用于在配置类中声明Bean对象。当你希望自己控制Bean的创建过程,并将其添加到Spring容器中时,可以使用@Bean注解。

  • 使用方式:将@Bean注解放在一个方法上,并在该方法中实例化并返回一个Bean对象。Spring会将这个Bean注册到容器中,供其他组件使用。

2 @Component:

  • 作用:@Component是通用的组件扫描注解,用于标记一个类为Spring管理的组件。通过组件扫描,Spring会自动将带有@Component注解的类注册为Bean,并将其添加到Spring容器中。

  • 使用方式:将@Component注解放在一个类上,Spring会自动扫描并将这个类实例化并注册为Bean。

3 @Configuration:

  • 作用:@Configuration注解表示一个类是配置类,用于声明Bean的创建和其他配置。配置类类似于XML配置文件,可以用来替代XML配置,用于定义Bean和其他组件。

  • 使用方式:将@Configuration注解放在一个类上,通常会结合@Bean注解一起使用,在配置类中定义Bean的创建过程。

总结:

​ ● @Bean主要用于配置类中手动定义Bean。

​ ● @Component用于自动组件扫描注册Bean。

​ ● @Configuration用于定义配置类,类似于XML配置文件,用于声明Bean和其他组件。

区别

@Bean的实例化和初始化操作由开发人员完成,bean的生命周期IOC不负责。

@Component/@Configuration实例化,初始化由容器来完成,bean的生命周期由IOC容器管理

@Component和@Configuration区别

用@Component修饰的类,在方法中相互调用的时候每次都会调用。而用@Configuration只调用一次。

// @Configuration 
@Component
public class BeanConfig {@Beanpublic User user1() {User user = new User();System.out.println("BeanConfig.user1:" + user);return user;}@Beanpublic String testUser() {// @Configuration 每次调用user1()返回的都是容器中的对象// @Component 每次调用user1()都会创建一个新的对象User user = user1();System.out.println(user); return "hello";}
}

3、Spring读取properties配置文件

​ 一般properties文件,用于在代码块中读取,并給变量赋值。但是,Spring可以Bean XML方式定义(注册Bean)中,可以通过${属性名}使用properties文件配置的值。或者在代码中使用@Value注解读取properties的属性值。

准备配置文件

在resources文件夹下创建jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/company
jdbc.user=root
jdbc.pwd=root

所以用途有两种:

通过配置文件配置

Spinrg的Bean XML定义中,可以通过${属性名}使用properties文件配置的值

首先,必须先加载properties配置文件,方式有两种,如下

方式一:

<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 用途1:Spring的xml配置文件中,可以通过${属性名}使用properties文件配置的值用途2:可以使用@Value("${属性名}")注解读取properties文件配置的值,再给字段赋值方法1:注解在字段上,给字段赋值方法2:注解在字段的setter方法中赋值           --><!-- 加载配置文件 --><context:property-placeholder location="classpath:jdbc.properties"/>
</beans>

方式二:

<?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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!--用途1:Spring的xml配置文件中,可以通过${属性名}使用properties文件配置的值用途2:可以使用@Value("${属性名}")注解读取properties文件配置的值,再给字段赋值方法1:注解在字段上,给字段赋值方法2:注解在字段的setter方法中赋值--><!-- 加载配置文件 --><bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="location" value="jdbc.properties" /></bean>
</beans>

可以清楚的看到,方式一,非常地简洁,但是如果要使用多个properties就可能实现不了,其实可以通过通配符实现,会有点麻烦。

使用

接着,就可以在Bean的定义中,使用properties中的属性值,如下

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.user}" /><property name="password" value="${jdbc.pwd}" />
</bean>

导入依赖包

这里只是方便测试,测试了连接数据库而已,非必须的!!

<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.15</version>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version>
</dependency>

测试

ApplicationContext ctx = new ClassPathXmlApplicationContext("Bean.xml");
DataSource dataSource = ctx.getBean("dataSource", DriverManagerDataSource.class);
System.out.println(dataSource);
System.out.println(dataSource.getConnection());

输出,表示连接上数据库

org.springframework.jdbc.datasource.DriverManagerDataSource@144ab983
com.mysql.cj.jdbc.ConnectionImpl@67b61834

通过注解配置

@Configuration可以配合@PropertySource导入properties配置。

之后通过@Value,配合Spring的EL表达式,和JSP中的EL表达式有点类似,后面SpringEL表达式模块会遇到详细用法。

@Configuration
@PropertySource("classpath:jdbc.properties")
public class DatabaseConfig {@Value("${jdbc.url}")String url;@Value("${jdbc.driver}")String driver;@Value("${jdbc.user}")String user;@Value("${jdbc.pwd}")String pwd;@Beanpublic DataSource dataSource(){DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setUrl(url);dataSource.setDriverClassName(driver);dataSource.setUsername(user);dataSource.setPassword(pwd);return dataSource;}}

在AppConfig中导入DatabaseConfig

@Configuration
@ComponentScan("com")
@Import({DatabaseConfig.class})
public class AppConfig {}

测试

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
DataSource dataSource = ctx.getBean(DataSource.class);
System.out.println(dataSource.getConnection());

输出

com.mysql.cj.jdbc.ConnectionImpl@5f08fe00

4、Spring 中的监听器事件

Spring 中的事件处理

你已经看到了在所有章节中 Spring 的核心是 ApplicationContext,它负责管理 beans 的完整生命周期。当加载 beans 时,ApplicationContext 发布某些类型的事件。例如,当上下文启动时,ContextStartedEvent 发布,当上下文停止时,ContextStoppedEvent 发布。

通过 ApplicationEvent 类和 ApplicationListener 接口来提供在 ApplicationContext 中处理事件。如果一个 bean 实现 ApplicationListener,那么每次 ApplicationEvent 被发布到 ApplicationContext 上,那个 bean 会被通知。

Spring 提供了以下的标准事件:

Spring 内置事件 & 描述
ContextRefreshedEvent : ApplicationContext 被初始化或刷新时,该事件被发布。这也可以在 ConfigurableApplicationContext 接口中使用 refresh() 方法来发生。
ContextStartedEvent: 当使用 ConfigurableApplicationContext 接口中的 start() 方法启动 ApplicationContext 时,该事件被发布。你可以调查你的数据库,或者你可以在接受到这个事件后重启任何停止的应用程序。
ContextStoppedEvent: 当使用 ConfigurableApplicationContext 接口中的 stop() 方法停止 ApplicationContext 时,发布这个事件。你可以在接受到这个事件后做必要的清理的工作。
ContextClosedEvent: 当使用 ConfigurableApplicationContext 接口中的 close() 方法关闭 ApplicationContext 时,该事件被发布。一个已关闭的上下文到达生命周期末端;它不能被刷新或重启。
RequestHandledEvent: 这是一个 web-specific 事件,告诉所有 bean HTTP 请求已经被服务。

​ 由于 Spring 的事件处理是单线程的,所以如果一个事件被发布,直至并且除非所有的接收者得到的该消息,该进程被阻塞并且流程将不会继续。因此,如果事件处理被使用,在设计应用程序时应注意。

监听上下文事件

为了监听上下文事件,一个 bean 应该实现只有一个方法 onApplicationEvent() 的 ApplicationListener 接口。因此,我们写一个例子来看看事件是如何传播的,以及如何可以用代码来执行基于某些事件所需的任务。

下面是 CSRefreshedEventHandler.java 文件的内容:

@Component
public class CSRefreshedEventHandler implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {System.out.println("ContextRefreshedEvent Received");}
}

下面是 CStartEventHandler.java 文件的内容:

@Component
public class CStartEventHandler implements ApplicationListener<ContextStartedEvent>{public void onApplicationEvent(ContextStartedEvent event) {System.out.println("ContextStartedEvent Received");}
}

下面是 CStopEventHandler.java 文件的内容:

@Component
public class CStopEventHandler implements ApplicationListener<ContextStoppedEvent>{public void onApplicationEvent(ContextStoppedEvent event) {System.out.println("ContextStoppedEvent Received");}
}

下面是 CSClosedEventHandler.java 文件的内容:

@Component
public class CSClosedEventHandler implements ApplicationListener<ContextClosedEvent> {@Overridepublic void onApplicationEvent(ContextClosedEvent event) {System.out.println("ContextClosedEvent Received");}
}

下面是 调用的内容:

ConfigurableApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
ctx.start();
ctx.stop();
ctx.close();

输出以下消息:

ContextRefreshedEvent Received
ContextStartedEvent Received
ContextStoppedEvent Received
ContextClosedEvent Received

5、Spring整合junit

整合Junit5

引入包

<dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.19</version>
</dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.8.2</version><scope>test</scope>
</dependency>

注解版

上面的其他代码不变,修改测试代码模块

@SpringJUnitConfig(classes = {AppConfig.class})
public class MyTestSpringJunit4 {@AutowiredHelloWorld helloWorld;@Testpublic void testA(){System.out.println(helloWorld);}}

配置文件xml版

@SpringJUnitConfig(locations = "classpath:Beans.xml")
public class JunitSpringXmlTest {
}

6、Spring SpEL表达式语言

一、${}

${} 用于加载外部文件指定的Key值,常用在xml和注解中,@Value(" ${key_value}")

二、${}使用

在resources文件夹下面创建创建jdbc.properties文件

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/company
jdbc.user=root
jdbc.pwd=root
package com.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;@Configuration
@PropertySource("classpath:jdbc.properties")
public class AppConfig {@Value("${jdbc.url}")String url;@Value("${jdbc.user}")String username;@Value("${jdbc.pwd}")String password;@Value("${jdbc.driver}")String driverClassName;public void print(){System.out.println("url = " + url);System.out.println("username = " + username);System.out.println("password = " + password);System.out.println("driverClassName = " + driverClassName);}}
package com;import com.config.AppConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class MainApp {public static void main(String[] args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);AppConfig appConfig = ctx.getBean(AppConfig.class);appConfig.print();}
}

打印结果

url = jdbc:mysql://localhost:3306/company
username = root
password = root
driverClassName = com.mysql.cj.jdbc.Driver

总结

${}用的比较多,主要是用来获取配置文件的数据,比如获取数据库连接信息。

上一篇:Spring (三) 之Aop及事务控制

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

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

相关文章

第一届AI Agent智能体现场开发大赛报名开启!8月上旬火热开赛~

由联想拯救者、AIGC开放社区、英特尔携手主办的“AI生成未来第二届拯救者杯OPENAIGC开发者大赛”已经正式启动&#xff0c;“2024 AI Agent极限挑战赛”作为特设专项赛道&#xff0c;也将同步于8月上旬开赛&#xff0c;参赛者将在更加紧张刺激的现场比赛中展现其技术与创造力。…

抖音小店新店铺起飞式玩法,这几步一定要做好,前期很重要

大家好&#xff0c;我是电商笨笨熊 进入抖音小店后不知道该怎么操作&#xff0c;不清楚如何让新店快速起店&#xff1b; 今天我们就来聊聊新店铺快速起店的几个关键步骤&#xff0c;新手玩家一定要按照流程去做。 第一步&#xff1a;店铺搭建 小店开通之后不要着急选品上架&…

MGRE环境下的ospf实验

MGRE环境下的ospf实验 一.拓扑图 二.实验步骤 1.分配各路由网段IP [R1]int g 0/0/0 [R1-GigabitEthernet0/0/0]ip address 16.0.0.1 24 [R1-GigabitEthernet0/0/0]int g 0/0/1 [R1-GigabitEthernet0/0/1]ip address 116.0.0.1 24[R2]int g 0/0/0 [R2-GigabitEthernet0/0/0]…

Docker+Uwsgi部署Django项目

在之前的文章中&#xff0c;已经给大家分享了在docker中使用django自带的命令部署项目&#xff0c;这篇文章主要讲解如何使用uwsgi部署。 1. 在Django项目的根目录下新建Dockerfile文件 #Dockerfile文件 # 使用 Python 3.9 作为基础镜像 FROM python:3.9# 设置工作目录 WORKDI…

随机游走的艺术-图嵌入表示学习

图嵌入引入 机器学习算法&#xff1a; 厨师 样本集&#xff1a; 食材 只有好的食材才能做出好的饭菜 我们需要把数据变成计算机能够读懂的形式&#xff08;将数据映射成为向量&#xff09; 图嵌入概述 传统图机器学习 图表示学习 自动学习特征&#xff0c;将…

初学python记录:力扣924. 尽量减少恶意软件的传播

题目&#xff1a; 给出了一个由 n 个节点组成的网络&#xff0c;用 n n 个邻接矩阵图 graph 表示。在节点网络中&#xff0c;当 graph[i][j] 1 时&#xff0c;表示节点 i 能够直接连接到另一个节点 j。 一些节点 initial 最初被恶意软件感染。只要两个节点直接连接&#x…

提升测试效率都有哪些具体手段?

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

uncloud的查询数据库的条件要和shema中写的一致,不然会报错

为什么uni-app中的database中的有些文件在hbuilder中可以看到&#xff0c;在vscode中看不到&#xff1f; uni-starter微信登录后查数据库db.collection后会提示没有权限 貌似非管理员都不能访问 uni-starter微信登录后查数据库db.collection(opendb-poi).aggregate()后会提示…

计算机网络(六)应用层

应用层 基本概念 服务器端&#xff08;Server&#xff09;&#xff1a; 服务器是网络中提供服务的计算机或软件程序。服务器通常具有更高的性能、更大的存储空间和更高的带宽&#xff0c;用于提供各种服务&#xff0c;如文件存储、数据库管理、Web托管、电子邮件传递等。服务…

共享桌面,3分钟自己实现一个吧,还能听见麦克风声音哦

前言 关于【SSD系列】&#xff1a; 前端一些有意思的内容&#xff0c;旨在3-10分钟里&#xff0c; 500-1000字&#xff0c;有所获&#xff0c;又不为所累。 共享桌面程序&#xff0c;哇&#xff0c;高大尚耶&#xff01;其实不然&#xff0c;让我带你3分钟实现桌面共享程序&am…

LD3320语音模块开发以及未来拿到其他模块的开发方式

当我们拿到一块模块进行开发的时候&#xff0c;一定要拿到配套的使用手册&#xff0c;不然在短时间内根本下不了手 一、使用source Insight来阅读源码 1.建立文件夹 2. 在source Insight放入该文件 3.添加源码 4.解决Source Insight乱码的问题 5.让各个代码模块之间有关联 二、…

uni-app中页面生命周期与vue生命周期的执行顺序对比

应用生命周期 uni-app 支持如下应用生命周期函数&#xff1a; 函数名说明平台兼容onLaunch当uni-app 初始化完成时触发&#xff08;全局只触发一次&#xff09;&#xff0c;参数为应用启动参数&#xff0c;同 uni.getLaunchOptionsSync 的返回值onShow当 uni-app 启动&#x…

Python零基础从小白打怪升级中~~~~~~~Python面向对象(二)

第九节&#xff1a;Python面向对象——继承和多继承 一、继承 Python面向对象的继承指的是多个类之间的所属关系&#xff0c;即子类默认继承父类的所有属性和函数。 在Python中&#xff0c;所有类默认继承object类&#xff0c;object类是顶级类或基类&#xff1b; 1、单继承…

Linux - 线程

目录 一.Linux线程的概念 1.1什么是线程 1.2 线程的优点 1.3 线程的缺点 1.4 线程异常 1.5 线程用途 二. Linux进程VS线程 2.1 进程和线程 三. Linux线程控制 3.1 POSIX线程库 3.2 创建线程 3.3 进程ID和线程ID 3.4 线程ID及进程地址空间布局 3.5 线程终止 3.6 线…

实战小项目 | ESP32-S3和ESP32-C3通过ESP-Mesh-Lite组网 温湿度传感器案例

传统Wi-Fi网络所有终端设备都需要直接与路由器相连&#xff0c;这使得Wi-Fi的覆盖区域受到路由器位置的限制&#xff0c;可接入终端设备的数量也受到路由器容量的限制。而乐鑫ESP-Mesh-Lite Wi-Fi组网方案&#xff0c;所有终端设备都可以与相邻设备连接&#xff0c;摆脱了对路由…

移动硬盘盒支持PD充电:优势解析与实际应用探讨

随着科技的飞速发展&#xff0c;数据存储和传输的需求日益增长&#xff0c;移动硬盘盒作为便携式存储设备的重要载体&#xff0c;其功能和性能也在不断提升。近年来&#xff0c;越来越多的移动硬盘盒开始支持PD&#xff08;Power Delivery&#xff09;充电技术&#xff0c;这一…

9.Hexo通过partial文件传值和改变CSS属性

partials 基本上是可以在自己的HTML文件或.ejs文件中定义网站中不同组件的方法 如果想要为网站定义一个标头&#xff0c;这个标头将会很好地出现在网站的每个页面上 用partials可以创建一个.ejs文件&#xff0c;可以将该标头的所有代码存储在该文件中&#xff0c;然后当想要在…

记一次奇妙的某个edu渗透测试

前话&#xff1a; 对登录方法的轻视造成一系列的漏洞出现&#xff0c;对接口确实鉴权造成大量的信息泄露。从小程序到web端网址的奇妙的测试就此开始。&#xff08;文章厚码&#xff0c;请见谅&#xff09; 1. 寻找到目标站点的小程序 进入登录发现只需要姓名加学工号就能成功…

BIT-6-C语言文件操作(C语言进阶)

本章重点 为什么使用文件什么是文件文件的打开和关闭文件的顺序读写文件的随机读写文本文件和二进制文件文件读取结束的判定 文件缓冲区 1. 为什么使用文件 我们前面学习结构体时&#xff0c;写了通讯录的程序&#xff0c;当通讯录运行起来的时候&#xff0c;可以给通讯录中增…

程序员应该遵守的 10 个编程原则

程序员应该遵守的编程原则 程序员拥有一个较好的编程原则能使他的编程能力有大幅的提升&#xff0c;可以使其开发出维护性高、缺陷更少的代码。以下内容梳理自StactOverflow的一个问题&#xff1a;编程时你最先考虑的准则是什么&#xff1f; 目录 Toggle KISS&#xff08;Keep …