Spring Boot 为什么建议将 main 类放在所有类所在包的顶层 通常建议将应用的 main 类放到其他类所在包的顶层 (root package),并 将 @EnableAutoConfiguration 注解到你的 main 类上,这样就隐式地定义了一个 基础的包搜索路径(search package),以搜索某些特定的注解实体(比如 @Service,@Component 等) 。例如,如果你正在编写一个 JPA 应用,Spring 将 搜索 @EnableAutoConfiguration 注解的类所在包下的 @Entity 实体。 采用 root package 方式,你就可以使用 @ComponentScan 注解而不需要指 定 basePackage 属性,也可以使用 @SpringBootApplication 注解,只要将 main 类放到 root package 中。 @SpringBootApplication 等同于以默认属性使用一下注解: @EnableAutoConfiguration @ComponentScan 扫描所有 Sprin ...
volatile 关键字的 2 层含义: 用 volatile 修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最新的值.作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值. 可见性可见性是指 当一个线程修改了一个共享变量,其他线程能够立刻得知这个修改.这里有必要了解一下 Java 的内存模型 被 volatile 修饰的变量,当线程需要使用这个变量时,回去主内存中读取,然后加载到自己的工作线程中,工作线程中的变量只是主存变量的一个拷贝,当使用完这个变量后,会刷新会主存中. 当数据中主内存复制到工作内存存储时,必须出现两个动作: 由主内存执行的 read 操作 有工作内存执行相应的 load 操作 当数据从工作内存拷贝到主内存时,也会有两个操作: 用工作内存执行的 store 操作 用主内存执行相应的 write 操作 volatile 的特殊规则就是 read、load、use 必须连续出现。assign、store、write 动作必须连续出现。所以使用 volatile 变量能够保证必须先从主内存刷新最新的值,每次修改后必须 ...
如果我们希望输出 com.foo.Bar 的 TRACE 等级的日志,而不像影响其他日志的输出。简单的改变日志等级是不能达到我们想要的目的;但是修改也很简单,只要我们添加一个新的 Logger 定义就可以达到目标。 1234<Logger name="com.foo.Bar" level="TRACE"/><Root level="ERROR"> <AppenderRef ref="STDOUT"></Root> 这个配置达到了我们想要的目标,所有 com.foo.Bar 的日志都会被输出,而其他组件的日志仅仅会输出 ERROR 等级的日志。 在上面的例子,所有 com.foo.Bar 的日志都会被输出到控制台。这是因为为 com.foo.Bar 配置的 Logger 没有设定任何的 Appender。 请看如下的配置 12345678910111213141516<?xml version="1.0" encoding ...
在 Linux 系统中,rm 命令是一个非常强大的工具,它可以永久删除文件和目录。然而,这种强大的能力也带来了风险,因为一旦文件被删除,就很难恢复。为了防止因误操作而丢失重要数据,我们可以创建一个自定义的回收站来保存被删除的文件。以下是实现这一功能的详细步骤和脚本。 背景作为 Ubuntu 的用户,我们经常需要在命令行下执行文件删除操作。但是,命令行下的 rm 命令一旦执行,被删除的文件几乎不可能恢复。为了避免这种情况,我们编写了一个简单的脚本,将删除操作改为移动操作,从而实现了一个类似于 Windows 系统中回收站的功能。 脚本介绍下面提供的脚本 rmtrash 可以作为 rm 命令的替代品。它将用户指定的文件或目录移动到一个特定的“回收站”目录中,而不是直接删除它们。这样,如果需要,用户可以从回收站中恢复这些文件。 脚本功能 移动文件到回收站:而不是直接删除文件,脚本会将它们移动到用户家目录下的 .rmtrash/ 目录。 记录删除操作:脚本会记录所有删除操作的详细信息,包括删除的文件路径和时间,以便于恢复。 恢复文件:可以从回收站中恢复文件到原始位置。 清空回收站:当确 ...
Apache Log4j 2 是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了重大改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。 log4j2 是 log4j 1.x 的升级版,参考了 logback 的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有: 主要特点 异常处理,在的 logback 中,追加程序中的异常不会被应用感知到,但是在 log4j2 中,提供了一些异常处理机制。 性能提升,log4j2 相比于 log4j 1 和 logback 都具有很明显的性能提升,后面会有官方测试的数据。 自动重载配置,参考了的 logback 的设计,当然会提供自动刷新参数配置,最实用的就是我们在生产上可以动态的修改日志的级别而不需要重启应用 - 那对监控来说,是非常敏感的。 无垃圾机制,log4j2 在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的 jvm gc。 一些概念之前看官方文档摘抄了一些概念,这里懒得翻译了,使用的 log4j 的都应该清楚,这里 ...
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,广泛用于构建网络应用程序。它允许开发者使用 JavaScript 来编写服务器端代码。本文将为你提供 Node.js 的入门步骤以及一些实用工具的使用。 安装 Node.js1. 安装 n 模块首先,你需要安装 n 模块,这是一个强大的版本控制工具,可以方便地管理多个 Node.js 版本。 1sudo npm install -g n 2. 更新到最新稳定版使用 n 可以轻松升级到最新的 Node.js 稳定版: 1sudo n stable 3. 升级到最新版本如果你想要安装最新版本的 Node.js,无论是稳定版还是长期支持(LTS)版,可以使用以下命令: 1sudo n latest 4. 安装指定版本n 还允许你安装任意历史版本的 Node.js。你可以使用版本号来升级到特定的版本: 1sudo n v0.10.26 或 sudo n 0.10.26 5. 切换版本要切换到某个特定的 Node.js 版本,可以使用以下命令: 1sudo n 7.10.0 6. 删除指定 ...
在 Linux 系统中,Python 是一个非常流行的编程语言,被广泛应用于 Web 开发、数据分析、人工智能等多个领域。本文将详细介绍如何在 CentOS 操作系统中安装和配置 Python 环境。 安装步骤1. 解压 Python 包首先,你需要下载 Python 的源代码包并将其解压到你的服务器上。由于你要求不使用外部工具安装 Python,我们将手动进行这一步。 12# 假设你已经下载了 Python 的源码压缩包到 /usr/local/src 目录下tar -xzf Python-3.8.x.tar.gz -C /usr/local/src 2. 进入解压后的文件夹接下来,进入 Python 的源代码目录: 1cd /usr/local/src/Python-3.8.x 3. 配置和安装 Python现在,我们可以执行 configure 脚本来配置 Python 的编译选项。如果你需要指定安装目录,可以添加 --prefix 参数。 12./configure --prefix=/opt/python38make && make install ...
Redis 是一个开源的内存数据结构存储系统,它提供了多种数据类型和丰富的操作命令,使得它在处理快速读写和高并发场景下表现出色。下面将详细介绍 Redis 的主要特性和应用场景。 1. 支持持久化RDB 持久化RDB 是 Redis 的本地持久化方式,通过周期性地将内存中的数据写入磁盘来保存数据状态。在 redis.conf 配置文件中,可以通过设置定时任务或手动触发 RDB 快照。 AOF 持久化AOF(Append Only File)是另一种持久化方法,它记录每次写操作到文件中。当 Redis 重启时,它会重新执行这些命令来重建数据状态。开启 AOF 持久化对于防止数据丢失非常有用,但它可能会消耗更多磁盘空间。 2. 丰富的数据类型Redis 支持多种数据类型,包括: String:最简单的键值对存储。 List:列表,可以用于消息队列等场景。 Set:集合,支持成员的唯一性和操作如求交集、并集等。 Sorted Set:有序集合,常用于排行榜应用。 Hash:哈希表,适合用于存储结构化数据。 这些数据类型提供了高效的数据结构和丰富的操作命令,使得 Redis 可以适 ...
RESTful API 是一种网络应用架构风格,强调通过统一的接口和资源操作设计 API。它使用 HTTP 协议中的不同方法来创建、读取、更新和删除资源,让开发者和用户能够直观地理解和操作应用程序。 RESTful API 设计原则1. 资源导向RESTful API 以资源为中心进行设计。每个资源都有一个唯一的 URI,客户端可以通过这个 URI 访问相应的资源。 URL 示例: GET /zoos:查看所有动物园 POST /zoos:创建一个新动物园 GET /zoos/1:获取指定动物园的信息 2. 方法使用RESTful API 使用 HTTP 协议中的不同方法来执行不同的操作: GET:从服务器检索资源。 POST:在服务器上新建一个资源。 PUT:更新资源(客户端提供改变后的完整资源)。 PATCH:部分更新资源(客户端提供改变的属性)。 DELETE:删除资源。 3. 状态码使用RESTful API 使用标准的 HTTP 状态码来表示请求的结果: 200 OK:成功检索数据 201 Created:创建新资 ...
Web 服务器一旦发出响应,一个请求响应过程就结束了.当再次发出请求时,Web 服务器不记得曾就做过的请求,也不记得给用户发出过响应.,这就是 http 的无状态模式 当需要跨多个请求需要保留与客户端会话状态时,我们有 4 种解决方案 表单隐藏字段<input type="hidden" name="userName" value="…">作用: 对用户在网上的访问进行会话跟踪 为服务器提供预定义的输入 存储动态产生的网页的上下文信息 缺点: 只有当每个网页是动态生成的才有效 Cookie将数据已键值对的形式通过响应保存在客户端方法: Cookie(name,value) get/setComment(String comment): 注释 get/setDomain(String domainPattern): 得到/设置应用 Cookie 的域 setMaxAge(int lifetime) 设置过期时间,默认为负数,表示在关闭浏览器后过期 getMaxAge() g ...
APP 服务端的 Token 验证通过拦截器对使用了 @Authorization 注解的方法进行请求拦截,从 http header 中取出 token 信息,验证其是否合法。非法直接返回 401 错误,合法将 token 对应的 user key 存入 request 中后继续执行。具体实现代码: 1234567891011121314151617181920212223242526272829303132public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //如果不是映射到方法直接通过 if (!(handler instanceof HandlerMethod)) { return true; } HandlerMethod handlerMethod = (HandlerM ...
什么是 RESTREST (Representational State Transfer) 是一种软件架构风格。它将服务端的信息和功能等所有事物统称为资源,客户端的请求实际就是对资源进行操作,它的主要特点有: - 每一个资源都会对应一个独一无二的 url - 客户端通过 HTTP 的 GET、POST、PUT、DELETE 请求方法对资源进行查询、创建、修改、删除操作 - 客户端与服务端的交互必须是无状态的 使用 Token 进行身份鉴权网站应用一般使用 Session 进行登录用户信息的存储及验证,而在移动端使用 Token 则更加普遍。它们之间并没有太大区别,Token 比较像是一个更加精简的自定义的 Session。Session 的主要功能是保持会话信息,而 Token 则只用于登录用户的身份鉴权。所以在移动端使用 Token 会比使用 Session 更加简易并且有更高的安全性,同时也更加符合 RESTful 中无状态的定义。 交互流程 客户端通过登录请求提交用户名和密码,服务端验证通过后生成一个 Token 与该用户进行关联,并将 Token 返回给客户端。 客户 ...
作用: 两者都可以用来装配 bean,可以写在字段上或写在 setter 方法上。 默认注入方式: @Autowired (Spring 注解): 默认按类型 (byType) 注入。 @Resource (J2EE 注解): 默认按名称 (byName) 注入。 required 属性: @Autowired: 默认要求依赖对象必须存在,可以设置 required=false 允许 null 值。 @Resource: 默认情况下,找不到匹配的 bean 会抛出异常。 指定名称: @Autowired: 可以结合 @Qualifier 注解指定 bean 的名称。 @Resource: 可以直接在注解中通过 name 属性指定 bean 的名称。 代码示例: 1234567// 使用 @Autowired@Autowired@Qualifier("baseDao")private BaseDao baseDao;// 使用 @Resource@Resource(name="baseDao")private Ba ...
使用 Intellij idea 整合 SpringMVC+Spring+Mybatis 框架,基于 Annotation. intellij 配置1.新建一个 Spring 工程,勾选 SpringMVC 和 Web Application 支持,不选择下载 jar 包,而是自己导入 jar 包 2.新建好项目之后的包结构如下: 3.在 WEB-INF 目录下新建 classes 和 lib 这 2 个文件夹F4 进入项目设置页面.a. 设置编译后的 class 文件输出路径 b. 将 lib 添加到构建路径中 c. 添加 Tomcat jar 包 4.配置 Tomcat 服务器 因为以前设置过默认配置,这里就简单的设置一下就可以了 5.将需要的 jar 包复制到 lib 文件夹下 xml 配置1.在 src 目录下新建: spring-mvc.xml SpringMVC 使用 spring-config.xml Spring 容器使用 mybatis-config.xml Mybatis 配置文件 2.web.xml 的配置 a.配置 SpringMVC 的 ...