分类 Java 相关 下的文章

Java Servlet

Java Servlet 是 Java 的一个 web 组件, 用来产生动态内容, 必须在 Servlet container 里面运行. Servlet container 又叫 Servlet 引擎, 是 web Server的扩展, 提供了 Servlet 运行的环境. 它通过 request/response 报文与客户端通信. request/response 都是基于 MIME 的. Servlet container 必须支持Http (1.0 & 1.1) 协议, https 可选支持.

Servlet 有它的生命周期, Servlet container 负责它生命周期的管理. Servlet 接口中定义了 init, service, destroy 这些方法来诠释它的生命周期.
Servlet 被load 和实例化可能在 container 初始化的时候, 可有可能在第一次这个Servlet 被调用的时候, 据配置/Annotation 而定.
Servlet 通过init 方法被初始化, GenericServlet 实现了 ServletConfig 接口, 这个接口能提供Servlet的一些配置信息和Container的一些相关信息.
Servlet interface 有2个实现类: GenericServlet & HttpServlet.
Servlet 定义了一个service 方法, 用来处理客户的请求. Servlet container 通过多线程并发调用 service 方法来处理并发请求.
在非分布式的环境中, Servlet 在 container 中默认只有一个instance. 如果Servlet 实现了 javax.servlet.SingleThreadModel 接口, 那么为了支持更多的请求, 可能是多个instances. javax.servlet.SingleThreadModel 接口在最新版本中被逐渐废弃.

未完待续

关于 java Phantom Reference 的一些参考文章

Java 里面有4种Reference types, 从强到若, 依次为 Strong, Soft, Weak, Phantom. 其中Java API 暴露出后三种Reference 类型在 JDK 包中. 这些Reference 类型提供了与GC程序的有限的交互.

与之对应的有4种 GC 对内存对象的Reachable:
Strong Reachable:
Soft Reachable:
Weak Reachable:
Phantom Reachable:

参考:
http://javarevisited.blogspot.com/2014/03/difference-between-weakreference-vs-softreference-phantom-strong-reference-java.html
http://docs.oracle.com/javase/6/docs/api/index.html?java/lang/ref/Reference.html
https://weblogs.java.net/blog/2006/05/04/understanding-weak-references
http://www.cnblogs.com/blogoflee/archive/2012/03/22/2411124.html
https://weblogs.java.net/blog/kcpeppe/archive/2011/09/29/mysterious-phantom-reference
http://stackoverflow.com/questions/1599069/have-you-ever-used-phantom-reference-in-any-project
http://java.dzone.com/articles/finalization-and-phantom

SLF4j 一些理解

  1. SLF4J 是什么?
    SLF4j (Simple Logging Facade for Java) 是对常用 logging 框架进项抽象提取之后定义的一个Facade API. 当你编程的时候, 仅使用SLF4j API, 而真正部署的时候可以定义到底使用哪个具体的logging 框架. 常见的logging 框架有: java.util.logging, log4j, logback, 还有一个logging facade 叫 Jakarta Commons Logging.

  2. 如何使用SLF4j?
    pom.xml (以使用maven 为例), 添加如下依赖:


    org.slf4j
    slf4j-api
    1.7.9

  3. 为什么要用 SLF4j?
    作为Application的开发者来说, 很容易定义使用哪个logging框架, 尤其是在开发的时候. 可是如果代码都开发完成了, 想改logging 框架, 就比较麻烦, 如果使用SLF4j 那么就可以在deployment的时候, 随时选择更改logging 框架, 仅仅是替换binding和logging 的框架 jar 文件.
    作为Library的开发者来说, 你不能限定最终的Application的开发者使用哪个logging 框架, 所以最好使用一个SLF4j这种facade API.

  4. SLF4j 的内部是怎么实现的?
    SLF4j 有三层: a) API 层, 就是这个slf4j-api-x.x.x.jar. b) binding 层, 是API和真正的logging 框架之间的adapter. c) 具体的logging 框架层.
    官方的架构图如下:
    请输入图片描述
    logback 是 SLF4j的亲儿子, 所以它是 binding层和具体的logging 框架层合一的, 都在 logback-core 和 logback-classic 这2个jar 文件中.

  5. 其它
    如果你想把现有的原代码迁移到 SLF4j, 可以使用他们提供的这个 迁移工具
    如果你想把现有的二进制代码里面的使用的非SLF4j的代码也改成使用SLF, 看 这里

  6. SLF4j 和 JCL 的实现区别?
    SLF4j 使用 static binding 方式, 它的binding 发现是通过 ClassLoader 查找 org.slf4j.impl.StaticLoggerBinder 类, 然后加载, 找到对应的binding. 这个类是在 api jar中定义的, 却不在这个jar 里面, 而分布在具体的binding jar 里面, 当 SLF4j 第一次初始化的时候, 它会在系统查找, 如果没有发现这个类, 就默认为是 NOP (No Operation), 如果找到一个这个类, 就使用这个binding, 如果找到多个, 就使用算法算出使用具体哪个.

另外, 它避免了JCL的 class loader issue, 提供了参数化的log msg 参数.