zoukankan      html  css  js  c++  java
  • 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     }
    View Code

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

    对象映射工具:modelmapper 

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

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

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

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

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

  • 相关阅读:
    加法图灵机
    Experiment 1
    进制转换
    快速排序
    辗转相除、线段交点、多角形面积公式
    JS如何优雅监听容器高度变化
    解决react和其他框架之间的交互问题
    MacBook Pro触控板手势
    代理 请求登录失效(显示未登录)问题
    Web端 长按事件
  • 原文地址:https://www.cnblogs.com/xiong2ge/p/java_basecomponent_fast.html
Copyright © 2011-2022 走看看