Spring注解@Resource、@Autowired区别

简介

Spring注解@Resource的作用相当于@Autowired,只不过@AutowiredbyType自动注入,而@Resource默认按 byName自动注入罢了。

@Resource有两个属性是比较重要的:

  • name
  • type

Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

@Resource装配顺序:

  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

Spring注解@Component、@Repository、@Service、@Controller区别

简介

Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 、@Controller。

在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这 3个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。所以,如果 Web应用程序采用了经典的三层分层结构的话,最好这么分层使用:

  • @Repository 持久层DAO
  • @Service 业务层Service
  • @Controller 控制层Controller
  • @Component 对那些比较中立的类

cache 最佳实践

简介

Web开发中,性能一直都是被大家所重视的一点,然而判断一个网站或系统的性能最直观的就是看网页打开或接口访问的速度。其中提高系统反应速度的一个有效方式就是使用缓存。一个优秀的缓存策略可以大大降低请求响应时间,提高性能。那么下面我结合所负责的系统(日PV10亿+),来谈谈服务器端缓存使用的一些实践。

Web缓存分为很多种,比如数据库缓存、内存缓存、应用缓存、代理服务器缓存、还有我们熟悉的CDN缓存,以及浏览器缓存。其中代理服务器缓存、还有我们熟悉的CDN缓存,以及浏览器缓存属于偏前端的缓存,这里我们主要关注服务器端的缓存:

  • DB缓存
  • 内存缓存,如Redis、memcache
  • 应用缓存

Python魔法方法

Python魔法方法

魔术方法是你可以自定义并添加“魔法”到类中的特殊方法。它们被双下划线环绕(比如__init____lt__)。

类的构造与初始化

最基本的“魔法”方法是__init__。我们可以在初始化一个类时定义一些行为。然而当我执行 x = ClassA()时, __init__ 不是第一个被执行的。事实上,第一被执行的的方法是__new__,它会创建一个实例,然后在构造器创建时传递一些参数。

在一个object的生命周期的另一端的方法是__del__

让我们仔细看看这3个“魔法”方法:

  • __new__(cls, [...)

    __new__ 是一个类的初始化过程中第一个被执行的方法。它创建了类,然后把一些参数传递给__init____new__ 很少被使用,特别是当我们用一些不可变类型的子类时(像tuple ,string),我不想关心__new__的太多的细节,因为那是没有用的。但它有它存在的意义,例如在元类的使用中,便会用到。

  • __init__(self, [...)

    当初始构造方法被执行(例如,我们执行 x = ClassA(10,'foo')),__init__ 就会获得 10 和 ‘foo’ 作为参数。__init__ 在python类的定义中经常被使用。

  • __del__(self) 若果 __new____init__ 形成一个类的构造函数,__del__ 是就是析构函数。它不实现语句 del x 的行为(这样代码就不会转换为 x.__del__())。它定义了一个被垃圾回收的行为。它在类消除的时后需要做一些额外的行为时是非常有用的,就像 sockets 和 file 类。注意,当编译器还在运行,如果类还存活着,这里不能确保__del__一定会被执行。所以__del__ 不能替代一些良好的编程习惯(比如连接用完了将其关掉),事实上__del__很少被使用,因为它的调用是非常不稳定的;请谨慎使用!

MySQL添加索引原则

简介

MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。一般的WEB系统,通常是读大于写,所以一般插入和更新操作很少出现性能问题,出现问题的往往是一些复杂的查询操作,高并发访问的系统,往往经常会被一些slow query拖垮整个系统,这不是危言耸听,我所在的公司项目中就出现过多次这种事故,显然查询语句的优化非常重要。下面就来介绍下查询优化中常用的通过索引的优化,重点介绍建索引原则。

索引

索引的目的在于提高查询效率,例如一本字典,你要查一个单词”word”,你一般是通过目录,找到W,再找到o,然后是r,再然后是d,找到word单词所在页码之后,再翻到那一页查看word。而如果没有索引,你需要翻遍整本字典去查找word这个单词,效率非常低。

索引的结构

MySQL的InnoDB引擎默认的索引结构类型是B+Tree。InnoDB存储引擎的数据存储结构是聚簇索引,其主键索引树的叶子节点存放着数据,而其他索引则是通过二级索引的方式,另开一个索引树,叶子节点存放主键。查找的时候,通过二级索引找到主键,再通过主键查找主键索引树找到需要的数据。

git subtree 基本操作

介绍

有时候多个项目的代码会依赖一些公共的库,一般会把公共的库提取出来单独建一个仓库做版本控制,而对于这些公共的库,我们可能会有这些需求:

  • 如何在其他git项目中以子目录的形式导入这些公共的git仓库?
  • 如何在其他项目中修改,然后推送回被导入git仓库?
  • 如何获取被引用库的最近更新?

前面一篇git submodule 基本操作的文章,我们介绍了通过submodule的方式,来解决这些问题,用过的但不够熟悉的同学可能会发现submodule不好用,如果拉取最新代码之后,忘记执行git submodule update更新子目录仓库代码,会导致子目录代码未更新成最新,若直接在上面修改代码,再提交,则会出现问题。由于一些同学对git submodule不熟悉,我所在的公司之前就出现过一些代码合并错误导致的事故。

强大的git提供了另一种subtree的方式来解决这些问题,下面简单介绍下基本使用。