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)的技术实践 ImmutableList<String> imlist=ImmutableList.copyOf(list); 常见集合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
 1 @RequestMapping("/image/{url}")
 2     public void getImage(@PathVariable String url, HttpServletResponse response)
 3             throws ClientProtocolException, IOException {
 4         String realurl = new String(Base64.decodeBase64(url));
 5 
 6         InputStream instream = FileWSManagerUtil.getImage(realurl);
 7         OutputStream outputStream = null;
 8         response.setContentType("image/jpeg");
 9         try {
10             outputStream = response.getOutputStream();
11             byte[] buffer = new byte[8192];
12             int count;
13             while ((count = instream.read(buffer)) > 0) {
14                 outputStream.write(buffer, 0, count);
15             }
16         } finally {
17             FileIO.close(outputStream);
18             FileIO.close(instream);
19         }
20     }
21 
22 private static InputStream get(String targetURL) {
23         HttpGet request = new HttpGet(targetURL);
24         request.setHeader("Authorization", "Basic " + authorization);
25         try {
26             HttpResponse response = HttpClients.createDefault().execute(request);
27             if (response.getStatusLine().getStatusCode() == 200)
28                 return response.getEntity().getContent();
29         } catch (Exception ex) {
30             logger.warn("图片获取失败", ex);
31         }
32         return null;
33     }

通常json操作:com.alibaba.fastjson.JSONObject; 

对象映射工具:modelmapper 

静态代码分析工具:sonarlint,在eclipse中通过http://eclipse.sonarlint.org/ 安装,之后创建对应的server设置好用户名密码即可。

本文所有demo内容请详见:Github中javaDemo项目。

最后,推荐一个知乎问题和一篇赞赞的博文(中文翻译)

目前流行的前端框架有哪些?(完成java学习后,就开始全面的前端学习,基本达到一个互联网工程师的水平再考虑下一步的plan)

2017 年你应该学习的编程语言、框架和工具

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT笔记

JAVA工作三年面试(三)

经过前面两次的面试,这里就马上转到第三家公司了的面试了,这里简称 B,工作地点和上一篇所讲述的 W 公司在一个城市,是面完 W 之后第二天去的,说出名字的话大多...

4146
来自专栏牛客网

58到家java开发面经2018.5.18

1640
来自专栏喔家ArchiSelf

一行Python代码

自从08年接触Python,就有爱不释手的感觉,逐渐地,有些不忍地疏远了Perl 和Shell编程,因为python 的优雅么? 不全是,主要是可以高效开发吧。

1964
来自专栏一枝花算不算浪漫

[Java]Java日期及时间库插件 -- Joda Time.

40511
来自专栏码匠的流水账

聊聊flink的TimeCharacteristic

flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/Time...

3922
来自专栏一个会写诗的程序员的博客

光剑评注:其实,说了这么多废话,无非就是: 一切皆是映射。不管是嵌套 XML,还是 Lisp 嵌套括号,还是 XXX 的 Map 数据结构,一切都是树形结构——映射。Lisp的本质(The Natur

http://www.defmacro.org/ramblings/lisp.html

1712
来自专栏我是攻城师

Java时间处理神器之Joda-Time

4525
来自专栏恰童鞋骚年

设计模式的征途—9.组合(Composite)模式

树形结构在软件中随处可见,比如操作系统中的目录结构,公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题。组合模式通过一种巧妙的设...

1424
来自专栏ml

HDUOJ----1234 开门人和关门人(浙江大学考研题)

开门人和关门人 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J...

2675
来自专栏Golang语言社区

Go 语言的演化历程

9、hello.c,标准C89 #include <stdio.h> main(void) //译注:与上面hello.c相比,多了个void { pr...

3318

扫码关注云+社区

领取腾讯云代金券