0%

什么是面向切面编程

AOP 是一种编程范式,并非是 Spring 的独创,它与语言无关,是一种编程思想。AOP 可以帮助我们将通用的逻辑从业务逻辑中分离出来。从项目角度来讲,有一些逻辑散布于程序的各个地方,但它们的逻辑又是千篇一律的相同。比如:我们需要打印每个请求的 URL、请求参数、IP地址,最简单的做法是在每一个 Controller 中去打印出这些信息。如果使用 AOP,我们能够更加轻松的处理这些问题。打印日志并不是使用 AOP 的唯一场景,我们还可以通过切面去统一处理 声明式事务、缓存、应用安全 等等。

阅读全文 »

Spring IOC 容器的依赖注入工作可以分为两个阶段。第一个阶段可以认为是构建和收集 Bean 定义的阶段,在这个阶段中,我们可以通过 xml 或者 Java 代码的方式定义一些 Bean,然后通过手动组装或者让容器基于某种规则自动扫描的形式,将这些 Bean 定义收集到 IOC 容器中。下面是以XML配置的形式来注册一些 Bean

阅读全文 »

因为Http协议是无状态的,服务端不知道用户上一次做了什么操作或者请求了什么接口。简单来说就是浏览器发送了两次请求,服务端是无法识别这两次请求是否来自同一个用户。这也是为什么会有 SessionCookie 的原因,它们的作用就是用来维持客户端与服务端的会话。更简单的说,就是让服务端知道每一个请求都是来自于哪个用户。

阅读全文 »

权限控制是非常常见的功能,在各种后台管理里权限控制更是重中之重。在 Spring Boot 中使用 Spring Security 构建权限系统是非常轻松和简单的。Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

阅读全文 »

但愿你没有在数据库里直接存储明文密码!为了防治密码被窃取,数据库中存储的始终应该是某种形式的哈希值,而非明文密码。但是,Rails 3.1 之后可以利用 has_secure_password 来实现。这个 Rails 内部的机制充分考虑了密码验证和加密。它需要 model 中有一个 password_digest 字段,用来存储加密后的密码。

阅读全文 »

ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,单大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。ThreadLocal 不能使用原子类型,只能使用 Object 类型。ThreadLocal 的使用比 synchronized 要简单得多。ThreadLocalSynchonized 都用于解决多线程并发访问。但是 ThreadLocalsynchronized 有本质的区别。synchronized 是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而 ThreadLocal 为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而 synchronized 却正好相反,它用于在多个线程间通信时能够获得数据共享。synchronized 用于线程间的数据共享,而 ThreadLocal 则用于线程间的数据隔离。当然 ThreadLocal 并不能替代 synchronized,它们处理不同的问题域。synchronized 用于实现同步机制,比 ThreadLocal 更加复杂。

阅读全文 »

UNION 用于将多个 SELECT 语句的结果合并到结果集中。第一个 SELECT 语句的列名被用作返回结果的列列名。在每个 SELECT 语句的相应位置列出的选定列应该有相同的数据类型。

阅读全文 »

先观察一下下面两个类

1
2
3
4
5
6
7
8
9
10
11
12
13
# app/models/accout.rb
class Account < ActiveRecord::Base
def message(content)
"Message: #{content}"
end
end

# app/models/user.rb
class User < ActiveRecord::Base
def message(content)
"Message: #{content}"
end
end
阅读全文 »

一些说明

MySQL 中通过 GROUP BY 进行分组查询,只会在每个组中出现一条数据。这一条数据并不是从改组中随机抽取的,而是该组结果的第一条数据。

阅读全文 »

RAND() 函数

MySQL RAND() 函数可以被调用,产生一个在 0 和 1 之间的浮点数

1
2
3
4
5
6
7
mysql> SELECT RAND(), RAND(), RAND();
+--------------------+--------------------+--------------------+
| RAND() | RAND() | RAND() |
+--------------------+--------------------+--------------------+
| 0.5983982343211753 | 0.8651665978740589 | 0.5306383171404138 |
+--------------------+--------------------+--------------------+
1 row in set (0.00 sec)
阅读全文 »