为了实现依赖注入 DI 而引入,Java 提供 javax.annotation.Resource , javax.inject.Inject 注解,Spring 框架提供了 org.springframework.beans.factory.annotation.Autowired 。依赖注入(Denpendency Injection,DI), 控制反转(Inversion of Control, IoC),主要的目的是去除代码耦合。具体可参考其他资料。
使用
Spring 注入的方式有多种,可以写在 field 上,可以写在 setter 方法
Read more ...
Spring的Interceptor(拦截器)与Servlet的Filter有相似之处,都能实现权限检查、日志记录等。不同的是:
Filter
Interceptor
Summary
Filter 接口定义在 javax.servlet 包中
接口 HandlerInterceptor 定义在org.springframework.web.servlet 包中
Filter 定义在 web.xml
Read more ...
@Component, @Service, @Controller 和 @Repository 四个注解在 Spring 中等同于在XML中定义 <bean> 标签,他们注解的对象都是 Spring 的 Bean。@Service,@Controller 和 @Repository 本质上就是 @Component。 @Controller,@Service,@Repository 他们在功能上几乎相同,主要的功能是用来给应用分层。
@Controller: 处理对应的请求,对应表现层(控制层),使用 @RequestMapping
Read more ...
一般在开发网站时使用 session 或者 cookie 来处理用户登陆等等权限问题,而在移动应用中要验证用户身份采用登录时给用户生成一个 token(令牌)的方式。每次用户发出需要身份认证的请求时,就需要验证一次 token 是否有效,无效的情况包括 token 无法被解析等。在向不可信环境发送数据时,确保数据经过签名,使用只有自己知道的密钥来签名数据,加密后发送,在取回数据时,确保没有人篡改过。
Python 有个 itsdangerous 包含了很多安全校验 token 验证相关的方案。 itsdangerous 就是这样一个签名校验的工具,内部
Read more ...
能否使用 == 来针对 enum 来比较?
答案是:YES, 枚举谨慎的实例化管理允许使用 == 来进行比较,JLS 8.9 Enums 中有Java 语言的规范定义:
枚举类型除了定义时的枚举常量外没有其他实例
如果显示的实例化枚举类型,会产生编译时异常。final clone 方法保证了 Enum 变量不会被 clone, 序列化的机制也保证了重复的实例在反序列化时不会创建额外的枚举变量。通过反射实例化 Enum 类型是被禁止的。所有这四种方式确保了 enum 类型不存在额外的实例,除了定义时的常量
因为每一个枚举常量只有一个实
Read more ...
Ubuntu 16.04 LTS 或者 Ubuntu 17.04 下可以通过 PPA 来安装 Cinnamon,感谢维护者
命令如下:
sudo add-apt-repository ppa:embrosyn/cinnamon
sudo apt update && sudo apt install cinnamon
当安装完成之后,Log out 或者 重启,在登录界面选择 Cinnamon 来使用。
我在使用一段时间之后才发现没有安装 Nemo 的插件,以至于右击都没有压缩的选项,通过一下步骤安装 Nemo 以及相关套件。
Read more ...
之前有写过 Git alias 的文章, 不过已经过去了很多时间,现在对 Git 命令越来越熟悉就希望更快的提高输入效率,也越来越感受到 alias 的重要性,不管是直接在 bash 中的 alias 还是 Git 的 alias。所以准备找一些合适的 alias 添加到自己的 gitconfig 文件中长期使用。
添加 alias
使用命令的方式添加
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias
Read more ...
split 命令可以用来分割文件,支持按文本分割,也支持二进制分割。常见的格式
split [OPTION]... [FILE [PREFIX]]
输出的结果为多个文件 PREFIXaa,PREFIXab … 默认的大小是 1000 行,默认的 PREFIX 是 x。
如果没有 FILE 文件,或者当 FILE 参数是 - 时,会从标准输入读取。
举例
按文件大小
-C 指定分割文件大小:
split -C 10M large_file.mp4 small
将大文件 large_file.mp4 按照 10M 大小进行分割,并指定分割
Read more ...
日志是每一个编程语言必备的模块,借助日志不仅可以监控在线服务的状态,也可以在出问题之后迅速的定位问题。
基本使用
# -*- coding: utf-8 -*-
import logging
import sys
# 获取 logger 实例,如果参数为空则返回 root logger
# 最基本的入口,该方法参数可以为空,默认的 logger 名称是 root,如果在同一个程序中一直都使用同名的 logger,其实会拿到同一个实例,使用这个技巧就可以跨模块调用同样的 logger 来记录日志
logger = logging.getLogger
Read more ...
If you write something, and you want to share with the world. And let others use through pip install, you can upload your package to pypi.
Create project layout
Put your code in some fold like douban. Write your own setup.py to give basic info about this lib or package. And you
Read more ...