# Java

:一种编译型语言。

  • 通过 JVM 容易实现跨平台运行,因此常用于开发 Web 应用、Android 应用。

# 相关历史

  • 1991 年,Sun 公司的 James Gosling 等人开始研发一种适用于单片机系统的编程语言。
    • 他们将 C++ 语言进行简化,抛弃了多继承、指针等复杂功能,并提高程序的兼容性。
    • 他们将这种语言取名为 Oak ,介绍给硬件厂商,但并没有受到欢迎。
  • 1995 年,Sun 公司发现 Oak 语言在互联网上的应用优势:它容易移植到不同平台上运行。于是将它改名为 Java 重新发布,终于成功推广。
  • Sun 公司设计 Java 编程语言时,最初研发了一款 JVM 程序,但性能差。于是在 1999 年,Sun 公司研发了一款新的 JVM 程序,称为 HotSpot ,性能更好。
  • 2007 年,Sun 公司将 HotSpot 与一些配套软件开源,这个开源项目称为 OpenJDK (opens new window)
  • 2010 年,Sun 公司被 Oracle 公司收购。而 OpenJDK 项目也由 Oracle 公司主导,但依然属于开源社区。

# 相关概念

  • JMX(Java Management Extensions)
    • :一组用于监控、管理 Java 应用的 API ,属于 Java 标准库。
      • 将被管理的对象称为 MBean(Managed Bean)。
      • 基于 RMI(Remote Method Invocation ,远程方法调用)协议进行通信。
    • 在 Java 应用中调用 JMX 库,实现其接口,便可以从外部通过 HTTP 通信等方式监控、管理该 Java 应用。
  • JAAS(Java Authentication and Authorization Service ,Java 认证和授权服务)
    • :一个进行身份认证的 Java 框架,内置在 JRE 中。
  • JDBC(Java Database Connectivity)
    • :Java 程序访问数据库的 API 规范,主要用于关系型数据库。
    • JDBC 通过特定格式的 URL 连接到数据库,配置示例:
      datasource:
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://10.0.0.1:3306/test?characterEncoding=utf8&connectionCollation=utf8mb4_general_ci&autoReconnect=true&useSSL=false
        username: root
        password: ******
      
  • Mybatis
    • :一个 Java 的持久化框架。
    • 用户不需要直接编写 JDBC 代码,而是先在 XML 文件中编写 SQL 语句,然后通过 Java 方法调用。但可读性差。
    • Java 持久化框架还有 Hibernate、JPA 等。
    • 开发 Java Web 项目的常用框架:
      • SSH(Spring + Struts + Hibernate)
      • SSM(Spring + SpringMVC + MyBatis)
  • Java 的日志框架
    • java.util.logging :Java 的标准库,是 JDK 内置的日志框架。
    • Log4j :一个 Apache 开源项目,已停止开发。使用一个配置文件 log4j.properties ,支持自动轮换日志文件。
    • LogBack :重新实现了 Log4j ,大幅优化。
    • Log4j2 :对 Log4j 进行了重构优化。
  • Scala
    • :一种基于 Java 的编译型语言,于 2004 年发布。
    • 将源代码编译成 Java 字节码,然后由 JVM 运行。
    • 支持面向对象编程、函数式编程,属于静态类型语言。

# 关于 Web

  • JSP(Java Server Pages)

    • :一种动态网页开发技术,可以在 HTML 文件中通过特定的标签嵌入 Java 代码。
    • 例:
      <p>
      今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
      </p>
      
  • Servlet

    • :一个提供 Web 应用服务的 Java 程序,本质上是实现了 javax.servlet.Servlet 接口的 Java 类。
    • 可以运行在支持 Servlet 规范的 Web 服务器中,比如 Tomcat、Jetty 。
  • Netty

    • :一个 Java 的 Socket 通信框架,支持 TCP、UDP 等协议,或自定义协议。
    • 采用非阻塞 IO (NIO),并发能力强。

# spring

  • Spring Framework

    • :一个流行的 Java 应用开发框架,于 2002 年发布。
    • 内嵌了一个 Tomcat ,因此可以开发 Web 应用,作为 Web 服务器运行。
    • Spring 中的应用程序由一个或多个 bean 对象组成,由 IoC 容器管理。
    • 编程时不需要主动 new 对象,而是在代码中声明需要的对象,并在 XML 文件中配置。程序运行时,IoC 容器会去自动根据配置创建对象。
      • 对象的控制权从程序员手中,转交给了程序自身,因此称为控制反转(Inversion of Control ,IoC)。
      • 例:
        @Component              // 使用 Component 注解,将该类定义为 Bean 。创建对象时,会根据类名来默认命名(开头小写),比如 phone
        public class Phone {
            ...
        }
        
        @Component
        public class Person {
            @Autowired          // 使用 Autowired 注解,创建对应类型的 Bean 对象并注入该属性
            Phone phone;
        
            ...
        }
        
  • Spring Boot (opens new window)

    • :一个基于 Spring Framework 4.0 的轻量级框架,于 2014 年发布。
    • 增加了一些默认配置,简化了开发流程,可以快速开发单个应用。
  • Spring Cloud

    • :一个基于 Spring Boot 的微服务框架,于 2015 年发布。
    • 包含多个组件:
      • Config :配置管理中心,基于 git 存储配置信息。例:
        @Value("${test.name}")    // 添加注解,将指定的配置参数赋值给该变量
        String name = "Hello";
        
      • Bus :消息总线,用于动态更新配置。
        • 每次修改配置时,会自动发送 HTTP 请求通知使用该配置的所有服务,让它们重新从 Config 读取配置。
      • Eureka :用于服务发现。
      • Ribbon :一个 HTTP 客户端,发出请求时会对服务器进行负载均衡。
      • Feign :一个声明式的 Restful 客户端,简化了访问微服务的过程,并基于 Ribbon 进行负载均衡。例:
        @FeignClient("service1")        // 添加注解,声明要调用的目标服务名
        static interface TestService {
            @GetMapping("/name")        // 添加注解,使得调用该方法时,会发送 GET 请求到目标服务的指定 URL
            public String name();
        }
        
      • Hystrix :断路器,自动进行服务熔断。
      • Zuul :API 网关,用于将服务暴露到集群外,并进行负载均衡、鉴权。