Java基础组件快速入门
最近需要上线很多新的JAVA项目,然而很多JAVA的相关库都不太熟悉,项目实现起来遇到了不小阻力,熬了好几天夜。现在手头的工作基本完成了,因此打算好好来归纳下java的相关工具库,将来需要借助你们,好好的在JAVA的汪洋下,乘风破浪。(希望成为电影中如小马一样程序员J)
长风破浪会有时,直挂云帆济苍海—李白
首先通过一张思维导图,来熟悉常用的java基础工具包,掌握好工具是对一个优秀工程师的基本要求哦!J
图中标红星表示必须精通的内容,黄星为需要熟练掌握的内容,其他为补充内容,本文主要会介绍下基础库、框架库和log库的内容。
- Apache Commons Lang
虽然现在推荐使用Guava替代Commons,但同时使用这两个深入人心的基础库也是棒棒哒,下面通过一个表格来熟悉最常用的使用。
功能 |
示例 |
字符串空判断 |
StringUtils.isEmpty(null), StringUtils.isBlank(" ") |
字符串trim |
StringUtils.trim(" abc "), StringUtils.strip(" abc", "xyz") |
字符串分割 |
String[] r01 = StringUtils.split(" abc dd") String[] r02 = StringUtils.split("abc,dd", ",") StringUtils.splitPreserveAllTokens(str4, ",") |
数组元素拼接 |
StringUtils.join(array, ",") |
随机数 |
RandomStringUtils.randomAscii(10) |
数组操作 |
ArrayUtils.clone(arr) ArrayUtils.isEmpty(arr) ArrayUtils.toObject(array10) |
日期 |
DateUtils.parseDate("2010/01/01 11:22:33", new String[]{"yyyy-MM-dd HH:mm:ss"}) |
基本反射工具 |
BeanUtils.getProperty(bean, "name") SampleBean newBean = (SampleBean) BeanUtils.cloneBean(bean); BeanUtils.describe(bean); //获得注解 BeanUtils.populate(bean, map);//填充数据 String[] array = BeanUtils.getArrayProperty(bean, "array");//获取数组 String value = BeanUtils.getNestedProperty(bean, "nestedBean.nestedProperty") BeanUtils.setProperty(bean8, "url", "http://www.google.com/"); DateConverter converter = new DateConverter(); converter.setPattern("yyyy/MM/dd HH:mm:ss"); ConvertUtils.register(converter, Date.class); ConvertUtils.register(converter, String.class); BeanUtils.setProperty(bean9, "date", "2010/12/19 23:40:00"); |
实现equals等方法 |
public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } |
InvokeMethod |
Main main = new Main(); Child child = new Child(); MethodUtils.invokeMethod(main, "pass", child); // OK MethodUtils.invokeExactMethod(child, "pass', child); |
lang.time.* |
FastDateFormat相对于SimpleDateFormat是线程安全的 |
Tip:
关于线程安全,常用的方法有:每次都加上new;加上synchronize;使用thread-local,在线程重用时,减少了new的次数;使用object-pool,共享多个对象。
- Guava
功能 |
示例 |
复写常用Object方法 |
Objects.equal(null, null) Objects.hashCode(person) Objects.toStringHelper(Person.class) ComparisonChain.start().compare(name, other.name).result(); |
Throwables |
Throwable getRootCause(Throwable) List<Throwable> getCausalChain(Throwable) String getStackTraceAsString(Throwable) |
Immutable不可变集合 |
很好的防御编程(defensive programming)的技术实践
常见集合Colletion,List,Set,SortedSet,Map,SortedMap都有其对应类型 |
其他 |
Strings. Range, EventBus, Caches, null值的管理(java的一个痛点) |
常用guava使用示例如下
List<String> orderNumberList = Lists.transform(orderList, new Function<TrainOrderInfo, String>() {
@Override
public String apply(TrainOrderInfo input) {
return input.getOrderNumber();
}
});
Guava官方教程的中文翻译:http://ifeve.com/google-guava/
- Joda-time
这部分是后来补上的,在.NET中时间日期使用非常简单方便,但java中居然是个痛点!!!一些基础的时间日期操作常常被Date,TimeStamp,Calendar等类型搞的相对复杂。可以这么说,掌握了guava,joda-time,最好还有jdk8(生产暂时未普及),基本上代码效率基本上可以回到写c#的水平上。最基础的一个例子,获取某一日期当月第一天的日期部分:DateTime curMonth1 = DateTime.now().dayOfMonth().withMinimumValue().withTimeAtStartOfDay();
官网文档:http://www.joda.org/joda-time/userguide.html
DateTime result = DateTime.now();
System.out.println(result.withTimeAtStartOfDay());
System.out.println(result.plusDays(1).withTimeAtStartOfDay());
System.out.println(result.dayOfWeek().withMinimumValue().withTimeAtStartOfDay());
System.out.println(result.plusWeeks(1).dayOfWeek().withMinimumValue().withTimeAtStartOfDay());
DateTime temp = result.dayOfMonth().withMinimumValue().withTimeAtStartOfDay();
System.out.println(temp);
System.out.println(result.plusMonths(1).dayOfMonth().withMinimumValue().withTimeAtStartOfDay());
System.out.println(new Timestamp(temp.getMillis()));
System.out.println(new Date(temp.getMillis()));
- Spring系列(详情可见Spring系列学习)
其是2003年兴起的一个轻量级java开发框架项目,经过多年发展,已经成为java项目的(事实上)标准化组件,包括很多子项目和相关项目,可以说是非常的棒,大幅简化程序员工作,且稳定高效。(朴实来说,它非常适合现在互联网场景,不需要大而全的超级应用,而是需要不断的迭代快速上线应景的项目,后台通过SOA提供有效的服务。对于个人来说,现在项目除开H5等前端内容,核心就是3扳斧,Web提供用户入口,SOA服务提供核心服务,Job完成各类脏活累活,其他的主要起到辅助作用)
核心功能:Spring-Core,核心就是完成Bean的创建(DI)和管理,比我们自己管理的更加系统合理,且编码美观,思路清晰。
辅助功能:Spring-Aop切面功能,Tx事务功能,RMI远程服务功能,JmsTemplate消息功能等,JDBC数据库连接等功能(整合MyBatis)。
Web支持:SpringMvc,市场份额第一,不解释。
最近两年火热无比的:Spring boot,以rapid applicaition development为宗旨,简化项目开发,但背后和过去的java开发无本质区别。
- 前端框架选型:
angular+bootstrap+jQuery,后台java,基本适用大部分中小项目。针对大型项目,可以参见博主叶小钗大神的浅谈Hybrid技术系列文章。
- 日志
Java非常重视接口与实现的分离,利用接口定义标准,如果说.NET(只有微软一家的实现,曾经的辉煌,也造成了现在业务的萎缩)这是可选项的话,java就是就是必选项。比如spring的aop就只支持使用在接口上,而SLF4J就是一个日志接口标准,无论是log4j2,logback,提供的都是其实现,对开发透明,非常方便的进行插件式管理。这部分需要依赖4个组件,分别是:slf4j-api接口;log4j-api,log4j-core,log4j-slf4j-impl实现
- 服务框架
相对于AXIS,AXIS2,CXF已经成为JAVA SOA服务的实际标准,其轻量化的特点深入人心,此外,其与Spring可以更好的结合。
官方网站:http://cxf.apache.org/
为了兼容老项目axis相关包包括:javax.xml.rpc-api, org.apache.axis, commons-discovery, wsdl4j, dom4j
- job框架
quartz, http://www.quartz-scheduler.org/
- 测试工具
firefox->RESTClient, chrome->boomerang-Soap&REST Client
java调用soap服务(老旧):推荐使用wsimport方式,结合dom4j解析xml。
http://www.cnblogs.com/siqi/archive/2013/12/15/3475222.html, http://www.cnblogs.com/ywjy/p/5196064.html
http://www.blogjava.net/rongxh7/archive/2009/05/21/271982.html
http://www.cnblogs.com/mengdd/archive/2013/06/05/3119927.html
- HttpClient
@RequestMapping("/image/{url}")
public void getImage(@PathVariable String url, HttpServletResponse response)
throws ClientProtocolException, IOException {
String realurl = new String(Base64.decodeBase64(url)); InputStream instream = FileWSManagerUtil.getImage(realurl);
OutputStream outputStream = null;
response.setContentType("image/jpeg");
try {
outputStream = response.getOutputStream();
byte[] buffer = new byte[8192];
int count;
while ((count = instream.read(buffer)) > 0) {
outputStream.write(buffer, 0, count);
}
} finally {
FileIO.close(outputStream);
FileIO.close(instream);
}
} private static InputStream get(String targetURL) {
HttpGet request = new HttpGet(targetURL);
request.setHeader("Authorization", "Basic " + authorization);
try {
HttpResponse response = HttpClients.createDefault().execute(request);
if (response.getStatusLine().getStatusCode() == 200)
return response.getEntity().getContent();
} catch (Exception ex) {
logger.warn("图片获取失败", ex);
}
return null;
}
通常json操作:com.alibaba.fastjson.JSONObject;
对象映射工具:modelmapper
静态代码分析工具:sonarlint,在eclipse中通过http://eclipse.sonarlint.org/ 安装,之后创建对应的server设置好用户名密码即可。
本文所有demo内容请详见:Github中javaDemo项目。
最后,推荐一个知乎问题和一篇赞赞的博文(中文翻译)
目前流行的前端框架有哪些?(完成java学习后,就开始全面的前端学习,基本达到一个互联网工程师的水平再考虑下一步的plan)
Java基础组件快速入门的更多相关文章
- 转: Vue.js——60分钟组件快速入门(上篇)
转自: http://www.cnblogs.com/keepfool/p/5625583.html Vue.js——60分钟组件快速入门(上篇) 组件简介 组件系统是Vue.js其中一个重要的概 ...
- 【个人笔记】003-PHP基础-01-PHP快速入门-03-PHP环境搭建
003-PHP基础-01-PHP快速入门 03-PHP环境搭建 1.客户端(浏览器) IE FireFox CHROME Opera Safari 2.服务器 是运行网站的基本 是放置程序代码的地方 ...
- 【个人笔记】002-PHP基础-01-PHP快速入门-02-PHP语言相关介绍输
002-PHP基础-01-PHP快速入门 02-PHP语言相关介绍 1.PHP是什么 Hypertext Preprocessor超文本预处理器 是一种通用开源脚本语言 Personal Home P ...
- Java程序员快速入门Go语言
这篇文章帮助Java程序员快速入门Go语言. 转载至 开源中国社区. http://www.oschina.net 本文将以一个有代表性的例子为开始,以此让Java程序员对Go语言有个初步认识,随后将 ...
- Objective-C基础语法快速入门
Objective-C基础语法快速入门 2010-11-04 16:32 折酷吧 zheku8 字号:T | T 假如我们对面向对象的思维已经C语言都很熟悉的话,对于我们学习Objective-C将会 ...
- 【个人笔记】001-PHP基础-01-PHP快速入门-01-PHP职业路线及PHP前景
001-PHP基础-01-PHP快速入门 01-PHP职业路线及PHP前景 PHP职业路线 PHP初级工程师 1年以下 3k-6k PHP中级工程师 1-3年6k-10k PHP高级工程师 3年以上 ...
- Vue.js——60分钟组件快速入门(上篇)
组件简介 组件系统是Vue.js其中一个重要的概念,它提供了一种抽象,让我们可以使用独立可复用的小组件来构建大型应用,任意类型的应用界面都可以抽象为一个组件树: 那么什么是组件呢?组件可以扩展HTML ...
- Vue.js——60分钟组件快速入门
一.组件简介 组件系统是Vue.js其中一个重要的概念,它提供了一种抽象,让我们可以使用独立可复用的小组件来构建大型应用,任意类型的应用界面都可以抽象为一个组件树: 那么什么是组件呢?组件可以扩展HT ...
- 【转】Vue.js——60分钟组件快速入门(上篇)
文章作者:keepfool 文章出处:http://www.cnblogs.com/keepfool/ 组件简介 组件系统是Vue.js其中一个重要的概念,它提供了一种抽象,让我们可以使用独立可复用的 ...
随机推荐
- Go_21: Golang 中 time 包的使用二
常量声明: const TimeLayout = "2006-01-02 15:04:05" 这是个奇葩,必须是这个时间点,据说是 go 诞生之日, 记忆方法:6-1-2-3-4- ...
- xgboost入门与实战(原理篇)
sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...
- 第七节 认识SpringMVC中的表单标签
所谓成熟,就是:你要习惯,任何人的忽冷忽热:也要看淡,任何人的渐行渐远: --胖先生 SpringMVC的表单标签 回顾: JSTL标签 --C标签 FMT标签 自学:JSP如何自定义标签[开源社区当 ...
- Redis记录-Redis介绍
Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序. Redis有三个主要特点,使它优越于其它键值数据存储系统 - Redis将其数据库完全保存在内存中, ...
- Dubbo学习笔记5:Dubbo整体框架分析
Dubbo的分层架构 本文将简单介绍Dubbo的分层架构设计,如下图是Dubbo官方的整体架构图: Dubbo官方提供的该架构图很复杂,一开始我们没必要深入细节,下面我们简单介绍下其中的主要模块. 其 ...
- 【两分钟教程】如何更改Xcode项目名称
注意:视频在最后,还少了一个步骤:将Xcode中的名字叫做<企信通>的虚拟文件夹删掉,然后重新从硬盘中添加进来,这样就彻底完成了更改Xcode项目名称的目的.
- opacity设定图片透明度
实例 1 - 创建透明图像 定义透明效果的 CSS3 属性是 opacity. 首先,我们将展示如何通过 CSS 来创建透明图像. 常规图像: 带有透明度的相同图像: 请看下面的 CSS: img { ...
- 第8月第12天 python json.dumps danmu
1.json.dumps return JsonResponse({ 'status': WechatMessage.POST_METHOD_REQUIRED[1], 'status_code': W ...
- HBase笔记之namespace
一.什么是namespace 在RDBMS中有database的概念,用来对table进行分组,那么在HBase中当表比较多的时候如何对表分组呢,就是namespace,可以简单的把namespace ...
- Jmeter如何保持cookie,让所有请求都能用同一个cookie,免去提取JSESSIONID
近期有柠檬班的学生找到华华,问了一个问题,就是利用Jmeter做接口测试的时候,如何提取头部的JSESSIONID然后传递到下一个请求,继续完成当前用户的请求. 其实,关于这个问题有三种种解决方法: ...