本文试图以最简短的语言解释各个开源项目的架构,图片均来源于网络

  spring

  spring的核心能力来源于ioc和aop。如果要一句话讲清这两个能力,那么可以这么描述,ioc就是一个大工厂,aop就是动态代理。

  spring的核心全是围绕着ioc这个大工厂,这个大工厂为什么这么牛,是因为对象从出生前到出生再到使用前能够做很多事情。比如,出生的状态(单例还是原型),出生的方式(xml配置或是annotation声明),使用前的逻辑,使用后的逻辑等等;另外一个原因是分离了可变和不可变的部分,即使用接口编程(spring中可以做到不必非对接口编程),从而可以返回接口对象的任意子类,这是非常强大的能力,要知道,子类可以随你改变而不需要通知外界是多么牛x的事,这意味着你对子类的改变不需要影响到外界,接口为你隔离了这个变化。

  如果你不敢相信一个工厂模式有这么大的威力,说实话我也不敢相信,但是它发展至今就是如此牛。围绕着如何构建ioc容器,spring有3个核心子项目,分别是bean, context, core。有个比喻比较贴切,bean负责包装对象,core负责给bean提供支持,context则是负责维护bean包装的对象之间的关系。

  而我们平时经常用到的有2个次核心的项目,分别是mvc,mvc提供了解耦视图和模型的能力,transaction则提供了统一各种需要事务操作的能力,如jdbc,jta。围绕着这些核心和次核心项目,有了各种的其他spring子项目。

  

  spring能力一览


  spring mvc

  图片来源于开涛的博客http://sishuok.com/forum/blogPost/list/5160.html

  


  hibernate

  hibernate提供了持久化对象到数据库的全自动的能力。所谓全自动,就是调用方不用告诉hibernate任何额外信息,直接使用blog.save(),甚至简单的地方不需要写sql,hibernate会根据已经配置好映射关系(表映射对象,行映射属性)自动将该对象插入blog表,注意,这里hibernate会自动为你管理一切参数。如果一句话描述其实现原理,就是Map + 反射,Map里装的是{对象名,表名}(当然,每个对象还对应一个Map,装的是{属性名,字段名})

  在hibernate中,session是主要的对象,一个session可以看做一个数据库connection,而session factory可以看做是生产session的工厂。hibernate中query分这么几种方式:一是通过得到session从而调用原生sql;二是通过hql;三是通过criteria

  在hibernate中,有这么几个问题值得研究,一个是hibernate的事务管理,另一个是hibernate的缓存管理(为什么有时候hibernate反而比jdbc更快),最后是hibernate的锁管理(悲观锁和乐观锁)


  mybatis

  mybatis同hibernate一样知名,不同的是,mybatis提供的是半自动的orm,所谓半自动,就是每个已知的CRUD都需要写一个对应的sql来满足实际需要。一句话描述还是Map + sql,不同于hibernate,这里map里装的是{sqlId, sql},执行完毕后通过反射调用将结果装配成对应类的对象(因此必须提供一个类名,你懂的)


  jetty的架构图

  jetty是一个应用服务器,不同于tomcat大而全的层次模型,jetty提供了小而灵活的插件式机制,这里的handler就是一个个插件,这些插件被组织成一个管道的形式,因而可以做各种事情,比如安全过滤,比如session处理,或者servlet处理(这个是根据一个请求的性质来的,请求就是一个可以流动的消息)。

  作为一个应用服务器,最重要的两个能力分别是处理连接以及处理请求,一般处理连接会有一个组件connector,处理请求会有另一个组件request_processor。连接负责监听端口,并将得到的tcp信息转变为HttpServletRequest信息,而processor负责处理request,负责请求的过滤,转化和处理。



 

  log4j2

  log4j2是个高性能的日志类库,据说logback,slf4j和log4j都是一个家伙写的,后来想起一个高性能的方案,于是继续沿用log4j的名字,升级为log4j2。

  log4j2最大的改进和亮点就是性能,号称内部使用disruptor做无锁异步,吞吐量比log4j高10倍以上。log4j2支持灵活的插件机制,将api和实现分离开来,架构更加灵活。

  log4j类设计主要关注Logger,LoggerConfig,Appender和Layout这条主线。他们各司其职,Layout主要负责展示,Appender主要负责输出位置,log4j2增加了很多输出的位置,数据库,文件,控制台都不用说了,其他的诸如JMS,JPA,NOSQL,SMTP,SOCKET等各种想得到的位置,不能单纯用强大来形容,每个Appender会hold住一个Layout;LoggerConfig主要保存一些日志相应的配置,和Configuration比起来,LoggerConfig管的东西更加细致,Appender以Listener的形式监听事件从而实现解耦;Logger则是实际记录日志的类,被缓存在LoggerContext中。

   每次我们取得一个Logger时,首先会从LoggerContext的缓存中中查找Logger,接下来会调用到LoggerConfig中的log方法,实际上是将这件事委托给LoggerConfig来做,接下来LoggerConfig生成LogEvent并调用将该Event通知每个Appender,Appender根据Layout最终完成日志的记录。

   Log4j2最出彩的地方还是类的设计以及职责的分离,非常漂亮;以及后期的性能优化。

  

  

  junit

  junit是我们日常用的单元测试框架,没有之一。

  junit的核心架构非常简单,如下这张图就勾出这个架构。小小的架构,内含经典设计模式的用法。这篇文章比较好的分析了这个结构http://2024486.blog.51cto.com/339445/116650

  

   mysql

   请参考http://www.g78.net/mysql-charts

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐