深入理解 Java 异常
深入理解 Java 异常 异常框架ThrowableThrowable 是 Java 语言中所有错误(Error)和异常(Exception)的超类。在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。 Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。 主要方法: fillInStackTrace - 用当前的调用栈层次填充 Throwable 对象栈层次,添加到栈层次任何先前信息中。 getMessage - 返回关于发生的异常的详细信息。这个消息在 Throwable 类的构造函数中初始化了。 getCause - 返回一个 Throwable 对象代表异常原因。 getStackTrace - 返回一个包含堆栈层次的数组。下标为 0 的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。 printStackTrace - 打印 toString() 结果和栈层次到 System.err,即错误输出流。 ...
深入理解 Java 注解
深入理解 Java 注解 本文内容基于 JDK8。注解是 JDK5 引入的,后续 JDK 版本扩展了一些内容,本文中没有明确指明版本的注解都是 JDK5 就已经支持的注解。 简介注解的形式Java 中,注解是以 @ 字符开始的修饰符。如下: 12@Overridevoid mySuperMethod() { ... } 注解可以包含命名或未命名的属性,并且这些属性有值。 12345@Author( name = "Benjamin Franklin", date = "3/27/2003")class MyClass() { ... } 如果只有一个名为 value 的属性,那么名称可以省略,如: 12@SuppressWarnings("unchecked")void myMethod() { ... } 如果注解没有属性,则称为标记注解。如:@Override。 什么是注解从本质上来说,注解是一种标签,其实质上可以视为一种特殊的注释,如果没有...
JDK8 入门指南
JDK8 入门指南 JDK8 升级常见问题章节是我个人的经验整理。其他内容基本翻译自 java8-tutorial 📦 本文以及示例源码已归档在 javacore 关键词:Stream、lambda、Optional、@FunctionalInterface Default Methods for Interfaces(接口的默认方法)Java 8 使我们能够通过使用 default 关键字将非抽象方法实现添加到接口。这个功能也被称为虚拟扩展方法。 这是我们的第一个例子: 1234567interface Formula { double calculate(int a); default double sqrt(int a) { return Math.sqrt(a); }} 除了抽象方法 calculate ,接口 Formula 还定义了默认方法 sqrt。具体类只需要执行抽象方法计算。默认的方法 sqrt 可以用于开箱即用。 123456789Formula formula = new Form...
Java 编程规范
Java 编程规范 编程规范就是 Java 开发的最佳实践。帮助开发人员少走弯路。 Effective Java 第 2 章 创建、销毁对象 第 1 条:考虑用静态工厂方法代替构造器 第 2 条:遇到多个构造器参数时要考虑用构建器 第 3 条:用私有构造器或者枚举类型强化 Singleton 属性 第 4 条:通过私有构造器强化不可实例化的能力 第 5 条:避免创建不必要的对象 第 6 条:消除过期的对象引用 第 7 条:避免使用终结方法 第 3 章 对于所有对象都通用的方法 第 8 条:覆盖 equals 时请遵守通用约定 第 9 条:覆盖 equals 时总要覆盖 hashCode 第 10 条:始终要覆盖 toString 第 11 条:谨慎地覆盖 clone 第 12 条:考虑实现 Comparable 接口 第 4 章 类和接口 第 13 条:使类和成员的可访问性最小化 第 14 条:在公有类中使用访问方法而非公有域 第 15 条:使可变性最小化 第 16 条:复合优先于继承 第 17 条:要么为继承而设计,并提供文档说明,要么就禁止继承 第 18 条:接口优...
Spring 之 JDBC
Spring 之 JDBCJDBC 是 Java 语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了增、删、改、查数据库的方法。 JDBC 入门示例JDBC 的工作步骤大致如下: 创建实体类。 声明数据库读写接口的 DAO 接口。定义 DAO 的好处在于对于数据层上层的业务,调用 DAO 时仅关注对外暴露的读写方法,而不考虑底层的具体持久化方式。这样,便于替换持久化方式。 创建一个 DAO 接口的实现类,使用 Spring 的 JDBC 模板去实现接口。 最后,定义一个 DAO 接口的实现类的 JavaBean,并将数据源注入进去。 假设,我们要通过 Spring + JDBC 访问一张 Mysql 数据表 user,user 表的数据结构如下: 123456789101112131415-- 创建用户表CREATE TABLE `user` ( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` VARCHAR(255) ...
Spring 之 JPA
Spring 之 JPAJPA 为对象关系映射提供了一种基于 POJO 的持久化模型。 简化数据持久化代码的开发 为 Java 社区屏蔽不同持久化 API 的差异 快速入门(1)在 pom.xml 中引入依赖 1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency> (2)设置启动注解 123456789101112// 【可选】指定扫描的 Entity 目录,如果不指定,会扫描全部目录@EntityScan("io.github.dunwu.springboot.data.jpa")// 【可选】指定扫描的 Repository 目录,如果不指定,会扫描全部目录@EnableJpaRepositories(basePackages = {"io.githu...
SpringBoot 之属性加载详解
SpringBoot 之属性加载详解加载 property 顺序Spring Boot 加载 property 顺序如下: Devtools 全局配置 (当 devtools 被激活 ~/.spring-boot-devtools.properties). 测试环境中的 @TestPropertySource 注解配置 测试环境中的属性 properties:@SpringBootTest 和 测试注解. 命令行参数 SPRING_APPLICATION_JSON 属性 ServletConfig 初始化参数 ServletContext 初始化参数 JNDI attributes from 通过 java:comp/env 配置的 JNDI 属性 Java 系统属性 (System.getProperties()) 操作系统环境比那里 RandomValuePropertySource 加载 random.* 形式的属性 jar 包外的 application-{profile}.properties 或 application-{profile...
Spring IoC
Spring IoCIoC 简介IoC 是什么IoC 即控制反转(Inversion of Control,缩写为 IoC)。IoC 又称为依赖倒置原则(设计模式六大原则之一),它的要点在于:程序要依赖于抽象接口,不要依赖于具体实现。它的作用就是用于降低代码间的耦合度。 IoC 的实现方式有两种: 依赖注入(Dependency Injection,简称 DI):不通过 new() 的方式在类内部创建依赖类对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类使用。 依赖查找(Dependency Lookup):容器中的受控对象通过容器的 API 来查找自己所依赖的资源和协作对象。 理解 Ioc 的关键是要明确两个要点: 谁控制谁,控制什么:传统 Java SE 程序设计,我们直接在对象内部通过 new 进行创建对象,是程序主动去创建依赖对象;而 IoC 是有专门一个容器来创建这些对象,即由 Ioc 容器来控制对象的创建;谁控制谁?当然是 IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。 为何是...
Spring Bean
Spring Bean在 Spring 中,构成应用程序主体由 Spring IoC 容器管理的对象称为 Bean。Bean 是由 Spring IoC 容器实例化、装配和管理的对象。 Bean 以及它们之间的依赖关系反映在容器使用的配置元数据中。 Spring Bean 定义BeanDefinitionSpring IoC 容器本身,并不能识别配置的元数据。为此,要将这些配置信息转为 Spring 能识别的格式——BeanDefinition 对象。 BeanDefinition 是 Spring 中定义 Bean 的配置元信息接口,它包含: Bean 类名 Bean 行为配置元素,如:作用域、自动绑定的模式、生命周期回调等 其他 Bean 引用,也可称为合作者(Collaborators)或依赖(Dependencies) 配置设置,如 Bean 属性(Properties) BeanDefinition 元信息BeanDefinition 元信息如下: 属性(Property) 说明 Class 全类名,必须是具体类,不能用抽象类或接口 Name Bea...
SpringBoot 之应用 EasyUI
SpringBoot 之应用 EasyUI EasyUI 是一个简单的用户界面组件的集合。由于 EasyUI 已经封装好大部分 UI 基本功能,能帮用户减少大量的 js 和 css 代码。所以,EasyUI 非常适合用于开发简单的系统或原型系统。 本文示例使用技术点: Spring Boot:主要使用了 spring-boot-starter-web、spring-boot-starter-data-jpa EasyUI:按需加载,并没有引入所有的 EasyUI 特性 数据库:为了测试方便,使用 H2 简介什么是 EasyUI? easyui 是基于 jQuery、Angular.、Vue 和 React 的用户界面组件的集合。 easyui 提供了构建现代交互式 javascript 应用程序的基本功能。 使用 easyui,您不需要编写许多 javascript 代码,通常通过编写一些 HTML 标记来定义用户界面。 完整的 HTML5 网页框架。 使用 easyui 开发你的产品时可以大量节省你的时间和规模。 easyui 使用非常简单但功能非常强大。 Sprin...