张贤河


  • 首页

  • 分类

  • 归档

  • 标签

  • 书单

  • 关于

Java 8 lambda表达式

发表于 2017-07-13 | 分类于 Java核心技术

Lambda表达式简介

  lambda表达式可以被理解为一个匿名函数的简明表示,它可以被传递,它没有名称,但是它有一个参数列表,一个主体,一个返回类型,也可能是可以抛出的异常列表。

  • 匿名 因为它没有一个明确的名字,不像一个方法,必须有方法名。
  • 函数 因为lambda不是属于某一个特定类的方法,但它和方法一样,lambda有一个参数列表,一个主体,一个返回类型,以及可能抛出的异常。
  • 传递 一个lambda表达式可以作为参数传递给一个方法或存储在一个变量。
  • 简洁 你不需要写很多冗长的代码,就是比写匿名内部类还简洁。
阅读全文 »

Java实现Websocket

发表于 2017-07-09 | 分类于 Java核心技术

Websocket介绍

  在一个 WebSocket应用中, 服务器发布一个 WebSocket端点, 客户端使用这个端点的URI来连接服务器。建立连接之后,websocket协议是对称的;客户端和服务器可以在连接打开的任何时间相互发送消息,而且它们可以在任何时间关闭连接。客户端总是只连接到一 个服务器,而服务器可以接受多个客户端的连接。
  WebSocket协议有两部分: 握手和数据传输。 客户端使用一个 WebSocket端点的 URI向它发送一个请求,发起握手过程。这个握手过程与现有基于 HTTP的基石出设施是兼容的:web服务器把它解释为一个 HTTP连接升级请求。
WebSocket支持文本消息(编码为 UTF-8 )和二进制消息。 WebSocket中的控制帧是close、 ping和pong(对ping帧的响应)。 ping和 pong帧可能还包含应用数据。websocket端点由采用以下形式的 URI表示:

  • ws://host:port/path?query
  • wss://host:port/path?query
    阅读全文 »

Java Servlet异步处理、非阻塞I/O和文件上传

发表于 2017-07-03 | 分类于 Java核心技术

异步处理

  应用服务器中的 web容器通常对各个客户端情求分别使用一个服务器线程。在工作负载很繁重的情况下,容器常要大量线程来为所有客户端请求服务。可扩展性限制包括内存用尽,或容器线程池耗尽。为了创建可扩展的 web应用,必须确保与请求关联的线程不会空闲, 使容器可以用它们处理新的请求。有时与请求关联的线程可能会空闲, 这有两种常见的情况:

  • 线程需要等待一个资源可用,或者在建立响应之前处理数据。例如,应用在生成响应之前可能需要査询一个数据库, 或者要从一个远程 web服务访问数据。
  • 线程生成响应之前需要等待一个事件。例如, 一个应用在生成响应之前可能必须等待一个 JMS消息、 来自另一个客户端的新信息, 或者队列中可用的一个新数据。

  这些情況表示了限制 web应用可扩展性的一些阻塞操作。异步处理是指把这些阻塞操作分配给一个新线程, 而与请求美联的线程立即返回给容器 。

阅读全文 »

Spring Boot启动流程源码分析

发表于 2017-06-29

注解

  在Spring Boot入口类里,会在类名上加@EnableAutoConfiguration或者@SpringBootApplication注解,这两个有什么差别呢?

@EnableAutoConfiguration

@EnableAutoConfiguration注解的源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}

@SpringBootApplication

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
@AliasFor(annotation = EnableAutoConfiguration.class, attribute = "exclude")
Class<?>[] exclude() default {};
@AliasFor(annotation = EnableAutoConfiguration.class, attribute = "excludeName")
String[] excludeName() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};
}

  可以看出@SpringBootApplication相当于是@Configuration,@EnableAutoConfiguration,@ComponentScan这三者的结合。@SpringBootApplication也提供了后面两个注解配置的别名(alias)。
例如exclude排除的类,scanBasePackages扫描的包名等,这些都可以直接该注解上进行配置。

阅读全文 »

Spring Boot快速入门

发表于 2017-06-26

Spring Boot的理解

  以前开发基于SpringMVC的web程序,需要运行在专门的容器里(例如Tomcat),然后从web.xml开始,添加Spring相关的配置。这些配置很多都是固定,或者约定俗成的,但是配置也是比较繁琐。所以Spring Boot就是为了简化这些配置,程序启动时,就创建了一些默认的配置。开发人员只需很少配置,可以直接使用,运行时直接可以用java -jar 方式来运行Spring Boot程序

阅读全文 »

字符集和字符编码Unicode和UTF-8的关系

发表于 2017-06-15

字符集和字符编码的关系

  字符集和字符编码这两个概念容易混淆,很多人可能会认为字符集和字符编码是同一个概念。
其实可以这么理解,字符集就是一部字典,里面的每个字对应的编号,都已经固定了,而字符编码就是要怎么把这些字符在计算机里表示。对于字符编码,存在着同样一个字符,因为采用的编码方式不同,在计算机表示的也不同。

阅读全文 »

Java NIO中的Buffer

发表于 2017-06-13 | 分类于 Java核心技术

简介

  Buffer缓冲区,首先要弄明白的是,缓冲区是怎样一个概念。Buffer是把数据保存在内存中,它本质上用来保存数据的数据结构是数组,例如ByteBuffer是byte数组,IntBuffer是int数组等,对Buffer读写操作,其实是对该数组进行数据存放、读取、清除操作。

  Buffer可以理解成是一个容器,可以往容器里写入数据,也可以从容器中读取数据,可以一个字节一个字节的读写,也可以多个字节读写,可以在写的途中切换为读,读到一半又切换到写,等等。。。

阅读全文 »

MethodHandle

发表于 2017-06-09 | 分类于 Java核心技术

JDK7为间接调用方法引入新的API,在java.lang.invoke包下,可以看作为反射的升级版,但它不像反射API那样显得冗长、繁重

阅读全文 »
12
© 2017 zhangxianhe
由 Hexo 强力驱动
主题 - NexT.Muse