山东青岛安卓培训就业中心 专业Android软件工程师培训,手机软件开发人才就业实训中心0532-85025005

Java的Spi机制研究

   摘要:之前研究过dubbo、spring源码。然后发现大量使用一个叫做spi的东西,发现这确实是一个很好的实现方法,特别是在设计框架中。

一、SPI机制概念

      SPI的全称是Service Provider Interface。简单来说,SPI机制提供了一个表达接口和其具体实现类之间的绑定关系的方案。具体是在JAR包的"META-INF/services/"目录下建立一个文件,文件名是接口的全限定名,文件的内容可以有多行,每行都是该接口对应的具体实现类的全限定名。

      SPI可以理解是为接口寻找服务实现类。现在公司的系统都是进行了模块的划分,系统抽象为多个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。面向的对象的设计里,我们一般推荐模块之间基于接口编程,模块之间不对实现类进行硬编码。一旦代码里涉及具体的实现类,就违反了可拔插的原则,如果需要替换一种实现,就需要修改代码。于是就有了SPI这种服务发现机制。

Tags:

发布: 青软于老师 分类: 未分类 评论: 0 浏览: 17

Java泛型的好处

  Java 泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 

Tags:

发布: 青软于老师 分类: 未分类 评论: 0 浏览: 24

Android网络请求改造之路

 

前言

今天给大家分享的主题是网络请求框架,而今天的两位主角分别是retrofit和rxjava。这是我在我现在的工作项目中所运用的网络请求以及数据处理框架。我也观察到群里很多同学也接触了这两个框架,我分享的是我对这两个框架的浅见和使用心得,有不对和不足的地方希望能引起讨论。欢迎打脸!

Tags:

发布: 青软于老师 分类: 未分类 评论: 0 浏览: 43

Java 并发工具箱之concurrent包

 

Java.util.concurrent  包是专为 Java并发编程而设计的包。

BlockingQueue

此接口是一个线程安全的 存取实例的队列。

Tags:

发布: 青软于老师 分类: 未分类 评论: 0 浏览: 8

全面理解java异常机制

 在理想状态下,程序会按照我们预想的步骤一步一步的执行,但是即使你是大V,你也不可避免出错,所以java为我们提供了异常机制。本文将会从以下几个方面介绍java中的异常机制:

    异常机制的层次结构
    异常的处理过程
    抛出异常
    捕获异常
    异常机制的实现细节

一、异常机制的层次结构
      在java程序设计语言中,所有的异常对象都是派生于Throwable类,一般情况下,如果java中内置的异常类不能满足需求,可以自定义异常类只需要继承与Throwable类即可,下面是java 中的异常层次结构:
1.jpg

Tags:

发布: 青软于老师 分类: 未分类 评论: 0 浏览: 21

Android架构思考(模块化、多进程)

 关于模块化(组件化)这个问题,我想每个开发者可能都认真的思考过。随着项目的开发,业务不断壮大,业务模块越来越多,各个模块间相互引用,耦合越来越严重,同时有些项目(比如我们公司)还伴随着子应用单独包装推广,影子应用单独发布等等需求,重新调整架构迫在眉睫。今天,我们就来聊聊模块化(组件化),这篇文章同时也是我这几年,对项目架构的理解。

Tags:

发布: 青软于老师 分类: 未分类 评论: 0 浏览: 22

Java集合系列---之总体框架

 Java集合是java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*
Java集合主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)、。
Java集合工具包框架图(如下):

Tags:

发布: 青软于老师 分类: 未分类 评论: 0 浏览: 25

使用Java实现单线程模式

 

我们都知道单例模式,有很多种实现方法。今天我们实现一个单线程实例模式,也就是说只能实例化该类的一个线程来运行,不允许有该类的多个线程实例存在。直接上代码:

 

 

[java] view plain copy print?
public class SingletonThread implements Runnable  
{  
    /** 获取access_token 和 expire_in 的url */  
    private static final String accessTokenUrl =   
                  "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="  
                                + ParameterConfig.WX_APPID + "&secret=" + ParameterConfig.WX_APPSECRET;  
      
    /** 这里使用public volatile发布一个共享对象 */  
    private static volatile AccessToken accessToken; // 因为是一个线程写多个线程读,而引用的又是“不可变对象”,  
                              // 所以使用volatile保证“可见性”  
      
    // 保证无法实例化 SingletonThread  
    private SingletonThread(){}  
      
    // 静态类保证thread的初始化是线程安全的,内部类实现了延迟加载的效果  
    private static class SingletonThreadHolder  
    {  
        public static SingletonThread thread = new SingletonThread();  
    }  
      
    public static SingletonThread getInstance()  
    {  
        return SingletonThreadHolder.thread;  
    }  
      
    @Override  
    public void run()   
    {  
        while(true)   
        {  
            try{  
                HttpsURLConnection conn = HttpUtil.initHttpsConnection(accessTokenUrl, "GET");  
                String result = HttpUtil.getHttpsContent(conn, "utf-8");  
                  
                JSONObject json = null;  
                if(result != null)  
                    json = JSON.parseObject(result);  
                  
                if(json != null){  
                    accessToken  = new AccessToken(json.getString("access_token"), json.getLong("expires_in"));  
                }else{  
                    System.out.println("get access_token failed----");  
                }  
            }catch(IOException e){  
                e.printStackTrace();  
            }  
              
            try{  
                if(null != accessToken){  
                    Thread.sleep((accessToken.getExpire_in() - 200) * 1000);    // 休眠7000秒  
                }else{  
                    Thread.sleep(60 * 1000);    // 如果access_token为null,60秒后再获取  
                }  
            }catch(InterruptedException e){  
                try{  
                    Thread.sleep(60 * 1000);  
                }catch(InterruptedException e1){  
                    e1.printStackTrace();  
                }  
            }  
        }  
    }  
    public static AccessToken getAccessToken() {  
        return accessToken;  
    }      
}  

Tags:

发布: 青软于老师 分类: 未分类 评论: 0 浏览: 58

Java异常处理

 

简介

    异常处理是java语言的重要特性之一,《Three Rules for effective Exception Handling》一文中是这么解释的:它主要帮助我们在debug的过程中解决下面的三个问题。
什么出错了
哪里出错了
为什么出错

   java语言可以说是提供了过于完善的异常处理机制,以致于后来《Thinking in java》的作者Bruce Eckel都专门对他进行了论述。java中的异常机制包括Error和Exception两个部分。他们都继承自一个共同的基类Throwable。Error属于JVM运行中发生的一些错误,虽然并不属于开发人员的范畴,但是有些Error还是由代码引起的,比如StackOverflowError经常由递归操作引起,这种错误就是告诉开发者,你一般无法挽救,只能靠JVM。而Exception假设程序员会去处理这些异常,比如数据库连接出了异常,那么我们可以处理这个异常,并且重新连接等。Exception分为两种,检查类型(checked)和未检查类型(unchecked)。检查类型的异常就是说要程序员明确的去声明或者用try..catch语句来处理的异常,而非检查类型的异常则没有这些限制,比如我们常见的 NullPointerException 就是非检查类型的,他继承自RuntimeException。java是目前主流编程语言中唯一一个推崇使用检查类型异常的,至少sun是这样的。关于使用checked还是unchecked异常的论战一直很激烈。下面是一张java语言中异常的类关系图。

Tags:

发布: 青软于老师 分类: 未分类 评论: 0 浏览: 19

Java中的值传递和引用传递

 

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 
    答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。

 


Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通常是相对传址而言)。

Tags:

发布: 青软于老师 分类: 未分类 评论: 0 浏览: 23