Spring框架的原理及应用详解(六)

本系列文章简介:

        在当今的软件开发世界中,随着应用复杂性的不断增加和技术的快速发展,传统的编程方式已经难以满足快速迭代、高可扩展性和易于维护的需求。为此,开发者们一直在寻求更加高效、灵活且易于管理的开发框架,以帮助他们应对这些挑战。Spring框架就是在这样的背景下应运而生,并凭借其独特的优势,迅速成为了Java企业级应用开发的首选框架。

        Spring框架是一个开源的、轻量级的Java应用开发框架,它提供了全面的功能来支持Java应用程序的各个方面,包括控制反转(IoC)、面向切面编程(AOP)、数据访问、Web开发等。Spring框架的设计初衷是简化企业级应用开发,通过其强大的IoC容器和AOP支持,开发者可以更加灵活地组织和管理应用程序的组件,实现高内聚、低耦合的代码结构。

        本系列文章旨在深入解析Spring框架的原理及应用,帮助大家全面理解和掌握Spring框架的核心技术。我们将从Spring框架的历史和概述入手,逐步深入到其各个核心模块的原理和实现方式。通过具体的应用实例和最佳实践,我们将展示如何使用Spring框架来构建高效、稳定且易于维护的Java应用程序。

        在本系列文章中,我们将重点关注以下几个方面:

  1. Spring框架的核心原理:我们将详细阐述Spring框架的控制反转(IoC)和面向切面编程(AOP)的原理,以及它们如何帮助开发者更好地组织和管理应用程序的组件。
  2. Spring框架的主要模块:我们将介绍Spring框架的各个主要模块,包括Spring Core、Spring MVC、Spring Data等,并解释它们的作用和用法。
  3. Spring框架的应用实例:我们将通过具体的Java应用程序开发实例,展示如何使用Spring框架来构建Web应用程序、进行数据访问、实现安全控制等。
  4. Spring框架的最佳实践:我们将分享一些在使用Spring框架进行开发时的最佳实践,帮助读者避免一些常见的错误和问题,提高开发效率和质量。

        希望本系列文章能够为大家提供一个全面而深入的Spring框架学习指南,帮助大家更好地理解和应用Spring框架,开发出更加高效、稳定且易于维护的Java应用程序。同时,我们也希望本系列文章能够激发大家对Spring框架进一步探索和学习的兴趣,共同推动Java企业级应用开发的发展。

        欢迎大家订阅《Java技术栈高级攻略》专栏(PS:近期会涨价),一起学习,一起涨分!

目录

一、引言

二、Spring框架的应用实例

2.1 构建一个基于Spring MVC的Web应用程序

2.2 集成Spring Data JPA进行数据访问

2.3 使用Spring Boot简化应用程序配置

2.4 集成Spring Security进行安全控制

三、Spring框架的最佳实践

四、总结与展望

五、结语


一、引言

        Spring框架是一个开源的、轻量级的Java应用开发框架,旨在为Java开发人员提供一个全面且高效的解决方案来构建企业级应用。它支持各种设计模式,并通过IoC(控制反转)和AOP(面向切面编程)等核心技术,极大地简化了应用程序的开发、管理和测试过程。

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


二、Spring框架的应用实例

2.1 构建一个基于Spring MVC的Web应用程序

构建一个基于Spring MVC的Web应用程序是一个常见的任务,它允许你使用Spring框架的MVC(Model-View-Controller)模式来创建动态、可维护的Web应用。下面是一个简单的步骤指南,用于构建一个基本的Spring MVC Web应用程序。

1. 初始化项目

使用Spring Initializr(https://start.spring.io/)来初始化一个新的Spring Boot项目,并添加Spring Web依赖。

2. 添加依赖

对于Maven项目,在pom.xml文件中添加Spring Boot的Web依赖:

<dependencies><!-- Spring Boot Web Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 其他依赖,如Thymeleaf模板引擎等 --></dependencies>


3. 创建控制器(Controller)

在Spring MVC中,控制器负责处理HTTP请求并返回响应。你可以通过创建带有@Controller注解的类来定义控制器,并使用@RequestMapping注解来映射请求到特定的方法。

import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;@Controllerpublic class HomeController {@GetMapping("/")public String home() {return "home"; // 返回视图名称,通常是Thymeleaf模板的名称}// 其他请求映射方法...}


4. 创建视图(View)

对于视图,你可以使用多种技术,如JSP、Thymeleaf、FreeMarker等。在这个例子中,我们将使用Thymeleaf。首先,在pom.xml中添加Thymeleaf依赖:

<dependency> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-thymeleaf</artifactId> 
</dependency>


然后,在src/main/resources/templates目录下创建HTML模板文件。例如,创建一个名为home.html的Thymeleaf模板:

<!DOCTYPE html> 
<html xmlns:th="http://www.thymeleaf.org"> 
<head> 
<title>Home</title> 
</head> 
<body> 
<h1>Welcome to the Home Page!</h1> 
<!-- 其他HTML内容 --> 
</body> 
</html>


5. 配置应用程序

src/main/resources/application.propertiesapplication.yml文件中配置应用程序的属性(如果需要)。对于简单的应用,你可能不需要进行任何配置。

6. 运行和测试

运行你的Spring Boot应用程序,并访问http://localhost:8080/(或你配置的其他端口)。你应该能看到home.html模板渲染的页面。

7. 添加其他功能

一旦你有了基本的MVC结构,你可以添加其他功能,如数据访问(使用Spring Data JPA或MyBatis)、表单处理、文件上传、用户认证和授权(使用Spring Security)等。

8. 部署到生产环境

当你的应用程序准备好部署到生产环境时,你可以使用Maven或Gradle打包你的应用程序,并将其部署到支持Java的Web服务器(如Tomcat、Jetty或Undertow)或容器(如Docker)中。

9. 监控和调优

在生产环境中,你可能还需要添加监控和调优功能,如使用Spring Boot Actuator进行健康检查、性能监控和度量收集,或使用Spring Cloud Config和Spring Cloud Bus进行配置管理和服务间通信。

10. 持续集成和持续部署(CI/CD)

最后,你可以设置持续集成和持续部署(CI/CD)流程,以便在代码更改时自动构建、测试和部署你的应用程序。这可以通过使用Jenkins、Travis CI等CI/CD工具来实现。

2.2 集成Spring Data JPA进行数据访问

集成Spring Data JPA进行数据访问是Spring框架中常见的用例之一。Spring Data JPA提供了一种简化的方法来与关系型数据库进行交互,而无需编写大量的数据访问代码。以下是一个集成Spring Data JPA进行数据访问的应用实例。

1. 添加依赖

首先,你需要在项目的pom.xml中添加Spring Data JPA和数据库驱动的依赖。例如,如果你使用的是MySQL数据库,可以添加以下依赖:

<dependencies> 
<!-- Spring Boot Starter Data JPA --> 
<dependency> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-data-jpa</artifactId> 
</dependency> 
<!-- MySQL Connector --> 
<dependency> 
<groupId>mysql</groupId> 
<artifactId>mysql-connector-java</artifactId> 
</dependency> 
</dependencies>


2. 配置数据源和JPA

application.propertiesapplication.yml中配置数据源和JPA设置:

# application.properties 示例 
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false 
spring.datasource.username=your_username 
spring.datasource.password=your_password 
spring.jpa.hibernate.ddl-auto=update # 可以是 create, create-drop, update, validate 
spring.jpa.show-sql=true # 是否打印SQL语句


3. 创建实体类

定义一个与数据库表对应的实体类。使用@Entity注解标记该类为JPA实体,并使用@Table注解指定对应的数据库表名。使用@Id@GeneratedValue注解来标记主键。

import javax.persistence.*;@Entity@Table(name = "users")public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String email;// 省略getter和setter方法...}


4. 创建Repository接口

创建一个继承自JpaRepository的接口,用于定义数据访问方法。Spring Data JPA允许你通过定义接口来自动创建数据访问方法,而无需实现它们。

import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User, Long> { 
// 这里可以定义自定义查询方法,例如: 
// List<User> findByName(String name); 
}


5. 使用Repository

在你的服务类或者控制器中,注入并使用UserRepository来访问数据。

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;@Servicepublic class UserService {private final UserRepository userRepository;@Autowiredpublic UserService(UserRepository userRepository) {this.userRepository = userRepository;}public List<User> getAllUsers() {return userRepository.findAll();}// 其他业务逻辑方法...}


6. 运行和测试

运行你的Spring Boot应用程序,并确保数据库已正确配置且可访问。然后,你可以通过调用UserService中的方法来访问和操作数据。

7. 注意事项和扩展

  • 确保数据库已正确安装并运行。
  • 根据需要调整spring.jpa.hibernate.ddl-auto的设置,以避免数据丢失或不必要的表结构更改。
  • 可以使用@Query注解在Repository接口中定义自定义的JPQL或SQL查询。
  • 可以使用@Modifying@Transactional注解来执行更新和删除操作。
  • 对于复杂查询或操作,可以考虑使用EntityManagerJdbcTemplate

通过遵循上述步骤,你可以成功地将Spring Data JPA集成到你的Spring应用程序中,从而简化数据访问操作。


2.3 使用Spring Boot简化应用程序配置

Spring Boot 旨在简化 Spring 应用程序的初始搭建、开发、测试和部署过程。它通过一系列自动配置和约定优于配置(Convention Over Configuration)的原则,极大地减少了开发人员的配置工作量。下面是一个使用 Spring Boot 简化应用程序配置的实例。

1. 初始化项目

使用 Spring Initializr(https://start.spring.io/)来初始化一个 Spring Boot 项目。选择你需要的依赖项,比如 Web、JPA、MySQL 等,然后下载生成的项目结构。

2. 添加依赖

在 pom.xml 文件中(如果你使用的是 Maven),你将看到已经自动添加了必要的依赖。这些依赖通常包括 Spring Boot 的核心库、Spring MVC(用于构建 Web 应用)和可能的数据库依赖(如 H2、MySQL 等)。

3. 编写配置

在 Spring Boot 中,大部分配置都是可选的,因为 Spring Boot 会根据添加的依赖项自动配置你的应用程序。但是,你仍然可以在 application.properties 或 application.yml 文件中添加自定义配置。

例如,如果你正在使用 MySQL 数据库,你可以在 application.properties 文件中添加以下配置:

spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTCspring.datasource.username=your_usernamespring.datasource.password=your_passwordspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialectspring.jpa.hibernate.ddl-auto = update


这些配置会自动被 Spring Boot 的自动配置机制所使用,来创建和配置数据源、JPA 实体管理器和事务管理器。

4. 创建实体类

根据你的数据库结构创建 JPA 实体类。Spring Boot 将使用这些实体类来与数据库表进行映射。

5. 创建仓库接口

使用 Spring Data JPA 创建仓库接口来访问你的实体类。例如,一个用于 User 实体的基本仓库接口可能如下所示:

import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {// 可以添加自定义查询方法}


6. 创建服务类

在服务类中,你可以注入你的仓库接口,并使用它来执行数据库操作。Spring Boot 会自动管理这些依赖项的注入。

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class UserService {private final UserRepository userRepository;@Autowiredpublic UserService(UserRepository userRepository) {this.userRepository = userRepository;}// 添加业务逻辑方法}


7. 创建控制器类

在控制器类中,你可以注入你的服务类,并创建处理 HTTP 请求的方法。Spring Boot 会自动将这些方法映射到相应的 URL 上。

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class UserController {private final UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}@GetMapping("/users")public Iterable<User> getAllUsers() {return userService.getAllUsers();}}


8. 运行和测试

在 IDE 中运行你的 Spring Boot 应用程序,或者使用 Maven/Gradle 命令来构建和运行它。然后,你可以使用浏览器或 Postman 等工具来测试你的应用程序的 REST API。

通过使用 Spring Boot,你可以专注于编写业务逻辑和实现功能,而不是花费大量时间配置和管理底层的基础设施。Spring Boot 的自动配置和约定优于配置的原则使得这个过程变得更加简单和高效。


2.4 集成Spring Security进行安全控制

Spring Security 是一个功能强大且高度可定制的安全框架,它提供了身份验证、授权、加密和防止常见安全漏洞的功能。在 Spring 应用程序中集成 Spring Security 可以轻松地为应用程序添加安全性。以下是一个简单的 Spring Boot 应用程序集成 Spring Security 进行安全控制的实例。

1. 初始化项目

使用 Spring Initializr(https://start.spring.io/)来初始化一个 Spring Boot 项目,并添加 Spring Security 依赖。

2. 添加依赖

在 pom.xml(Maven)或 build.gradle(Gradle)文件中添加 Spring Security 依赖。

对于 Maven,添加如下依赖:

<dependency> 
<groupId>org.springframework.boot</groupId> 
<artifactId>spring-boot-starter-security</artifactId> 
</dependency>


3. 配置 Spring Security

创建一个配置类来配置 Spring Security。通常,你可以通过继承 WebSecurityConfigurerAdapter 类并重写其中的方法来定制你的安全配置。

import org.springframework.context.annotation.Configuration;import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/home").permitAll() // 允许所有用户访问 "/" 和 "/home".anyRequest().authenticated() // 其他所有请求都需要身份验证.and().formLogin() // 使用表单登录.loginPage("/login") // 登录页面.permitAll() // 允许所有用户访问登录页面.and().logout() // 登出配置.permitAll(); // 允许所有用户访问登出页面}// 你可以在这里配置内存中的用户(仅用于演示)或连接数据库中的用户// ...}


4. 创建控制器

创建一些控制器来处理用户请求。

import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;@Controllerpublic class HomeController {@GetMapping("/")public String home() {return "home";}@GetMapping("/login")public String login() {return "login";}// 其他控制器方法...}


5. 创建 Thymeleaf 模板(可选)

如果你使用的是 Thymeleaf 作为模板引擎,你可以创建 HTML 模板来显示登录页面和主页。

例如,src/main/resources/templates/login.html 和 src/main/resources/templates/home.html

6. 运行和测试

启动你的 Spring Boot 应用程序,并尝试访问不同的 URL。你应该会看到,当你访问需要身份验证的页面时,Spring Security 会自动将你重定向到登录页面。你可以通过填写默认用户名(user)和生成的密码(在控制台日志中显示)来登录。

7. 自定义身份验证和授权

在实际应用中,你可能需要从数据库中获取用户信息来进行身份验证和授权。你可以通过实现 UserDetailsService 接口来提供用户详细信息,并通过配置 AuthenticationManagerBuilder 来设置身份验证管理器。

8. 启用 HTTPS(可选)

对于生产环境,你可能还希望使用 HTTPS 来加密用户的数据传输。你可以配置 Spring Boot 来使用 SSL 证书,并启用 HTTPS。

9. 自定义登录页面和错误页面

你可以通过创建自定义的 HTML 页面来替换默认的登录页面和错误页面。这些页面应该放在你的模板目录中,并通过配置类中的 formLogin() 和 exceptionHandling() 方法来指定。

10. 启用 CSRF 保护(可选)

跨站请求伪造(CSRF)是一种常见的安全漏洞。Spring Security 默认启用了 CSRF 保护。你可以通过配置类中的 csrf() 方法来定制 CSRF 保护的行为。

通过遵循上述步骤,你可以很容易地在 Spring Boot 应用程序中集成 Spring Security 来提供基本的安全性功能。然后,你可以根据需要进一步定制和扩展这些功能。

三、Spring框架的最佳实践


        详见《Spring框架的原理及应用详解(七)

四、总结与展望


        详见《Spring框架的原理及应用详解(七)

五、结语


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

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

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

相关文章

[DDR4] DDR4 相对 DDR3差异与优势

依公知及经验整理,原创保护,禁止转载。 传送门: 总目录 1 差异总览 出处: https://www.kingston.com.cn/en/memory/ddr4-overview Description 描述DDR3DDR4Advantage 优势电压1.5V1.2V降低内存功耗需求容量512Mb-8Gb4Gb-16Gb更大的 DIMM 容量数据速率800Mb/s – 2133Mb/s1…

C#——结构和类问题总结

C#——结构和类问题总结 前言一、结构体是什么&#xff1f;1&#xff09;定义2&#xff09;特点 二、类&#xff08;对象&#xff09;是什么&#xff1f;1&#xff09;定义2&#xff09;特点 三、两者的差异性与选择环境&#xff1f;1&#xff09;差异性2&#xff09;选择环境 …

推荐一款WPF绘图插件OxyPlot

开始 使用 NuGet 包管理器添加对 OxyPlot 的引用(如果要使用预发布包,请参阅下面的详细信息)向用户界面添加PlotView在代码中创建一个PlotModel绑定到你的属性PlotModelModelPlotView例子 您可以在代码存储库的文件夹中找到示例。/Source/Examples NuGet 包 最新的预发布包由…

前端工程师不是软件工程师?

在当前的技术生态系统中&#xff0c;前端工程师与软件工程师这两个角色经常被混淆。尽管它们在某些方面有重叠&#xff0c;但实际上存在显著的差异。尤其是在前端工程师培训班出身的背景下&#xff0c;这种差异更为明显。本文将探讨为什么前端工程师不应被简单地归类为软件工程…

CyberDAO:引领Web3时代的DAO社区文化

致力于Web3研究和孵化 CyberDAO自成立以来&#xff0c;致力于推动Web3研究和孵化&#xff0c;吸引了来自技术、资本、商业、应用与流量等领域的上千名热忱成员。我们为社区提供多元的Web3产品和商业机会&#xff0c;触达行业核心&#xff0c;助力成员捕获Web3.0时代的红利。 目…

C语言---------深入理解指针

目录 一、字符指针 二、指针数组&#xff1a; 三、数组指针&#xff1a; 1、定义&#xff1a; 2、&数组名和数组名区别&#xff1a; 3、数组指针的使用&#xff1a; 四、数组参数&#xff0c;指针参数&#xff1a; 1、一维数组传参&#xff1a; 2、二维数组传参&am…

后端防接口被刷

1&#xff09;防火墙 防火墙也是互联网安全攻防中重要的屏障&#xff0c;我们通过配置访问规则&#xff0c;可以限制只有被允许的IP才可以进行访问。 防火墙还可以识别和阻止DDoS攻击&#xff0c;通过识别并过滤恶意流量请求&#xff0c;防火墙可以有效的防御&#xff0c;保护…

模拟电子技术基础(二)--PN结

PN结的本质 芯片都是由硅晶体制成&#xff0c;单个硅原子最外层有带有4个电子 在纯硅当中这些电子会两两形成共价键&#xff0c;此时周围形成非常稳定的八电子结构 在一个回路中&#xff0c;灯泡不亮&#xff0c;不导通&#xff0c;因为电池无法吸引其中的电子离开&#xff0c…

面向对象程序设计》第5章 多态(选择 判断 填空)

1-1 在类的定义中,前面有virtual关键字的成员函数就是虚函数。 T F | 参考答案 答案 T 2分 1-2 通过基类指针调用基类和派生类中的同名虚函数时,若该指针指向一个基类的对象,那么被调用的是基类的虚函数。 T F | 参考答案 答案 T 2分 1-3 通过基类指针调用…

Zombie Animations Set

僵尸动画合集,包括成对攻击/抓取、各种移动方式、爬行、击中反应、死亡动画等。 生产说明 动画总数:99(包括22个位置变化) 配对动画:36 攻击次数:6次 爬网:9 命中反应:6 空转:14 行程2 跑步次数:9次 短跑:2 匝数:3 步行次数:12次 免责声明 任何游戏玩法蓝图都不包…

【JavaScript】MDN

一、初识 1.1 基础 1.1.1 语言速成课 1.1.1.1 变量 ​ 变量是存储值的容器。首先用let关键字声明一个变量&#xff0c;后面跟着你给变量的名字 ​ 变量命名区分大小写 ​ 分号在JavaScript中是用来分隔语句的&#xff0c;但是如果语句后面有一个换行符(或者在{block}中只…

力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 521.最长特殊序列 I【简单】 题目&#xff1a; 给你两个字符串 a 和 b&am…

【猫狗分类】Pytorch VGG16 实现猫狗分类4-开始训练

背景 现在&#xff0c;我们已经完成了&#xff0c;数据集的清洗&#xff0c;标签的制作&#xff0c;也把VGG16的模型建立好了。那接下来&#xff0c;我们应该把数据&#xff0c;放到我们搭建的vgg16的模型里面&#xff0c;让模型针对这些猫和狗的图片&#xff0c;去进行训练&a…

面试题 17.17. 多次搜索

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; class Solution { private:struct Trie {Trie() {end false;index -1;next.resize(26);}bool end;int index;std::vector<std::unique_ptr<Trie>> next;};void insert_trie(int in…

5.3.2_1 线索二叉树的概念

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

接口和抽象类:如何使用普通类模拟接口和抽象类

目录 1.引言 2.抽象类和接口的定义与区别 3.抽象类和接口存在的意义 4.模拟实现抽象类和接口 5.抽象类和接口的应用场景 1.引言 在面向对象编程中&#xff0c;抽象类和接口是两个经常被提及的语法概念&#xff0c;也是面向对象编程的四大特性&#xff0c;以及很多设计模式…

借报告Team ID错误谈谈Mac app文件签名与公证

文章目录 目的起因流程熟悉本地证书、认证证书申请在钥匙串中创建要公证app的profile(公证的时候会用到)程序打包后App文件进行app签名压缩打包公证公证变化在WWDC19, 苹果在MacOS 10.14之后引入了公证(Notarization)这一机制来提升安全性. 主要分以下几步新的公证workflow公…

使用KVM制作镜像

资源列表 操作系统 IP Centos7&#xff0c;桌面版 192.168.10.57 安装KVM 安装软件包 yum -y install qemu-kvm qemu-kvm-tools qemu-img bridge-utils libvirt virt-install virt-manager 检查有否支持虚拟化 grep -e vmx -e svm /proc/cpuinfo #VMX是英特尔版本&…

【CT】LeetCode手撕—88. 合并两个有序数组

目录 题目1- 思路2- 实现⭐88. 合并两个有序数组——题解思路 2- ACM实现 题目 原题连接&#xff1a;88. 合并两个有序数组 1- 思路 模式识别 模式1&#xff1a;两个有序数组合并 ——> 双指针模式2&#xff1a;返回结果填充到 nums1[mn] ——> 需要开辟新的数组空间 …

lxml库在爬虫领域的贡献及应用

重头戏lxml库里面的xpath 一段代码给各位开开胃 这段代码首先导入了lxml库中的etree模块&#xff0c;然后定义了一个包含HTML内容的字符串html。接着&#xff0c;我们使用etree.HTML()函数解析这个HTML字符串&#xff0c;得到一个表示整个HTML文档的树形结构。最后&#xff0c;…