有关Spring的技术知识分享

有关Spring的技术知识分享
一. Spring的体系结构组成?

对于这个问题我觉得spring的官网中一个图非常的好解释了这个问题,以下附上这张图

在这里插入图片描述

1.首先从图中我们可以看到在最下面是一个Test,这个表示的测试模块,我们在平常的开发过程中可能会写一些小的测试代码片段来测试某一个功能模块,这时就可以用它了;

2.Core Container:表示的是核心容器的意思;我们知道在传统的Java程序中,对象的创建是我们手工实现的;这样的话类和类之间的耦合性太高了,不利于我们后期对程序的维护与扩展。所以Spring的核心容器容器就帮我们管理对象的创建等一系列的操作,从而降低类与类之间的耦合性。有一个Spring的重要的思想IOC(Inverse Of Control),也就是DI(依赖注入)就在此体现的。

  • Beans:有一个BeanFactory就是这个模块提供的,它是工厂模式的体现,我们将Spring容器管理的对象称为一个一个的bean;我们一般在xml中会看到以下这样的代码,这就是Spring容器管理的对象
    在这里插入图片描述

  • Core:Spring的核心部分,IOC(DI)思想的体现。

  • Context:这个词是上下文的意思;我们可以理解为一个应用程序的的全局对象。

  • SpEL:这个是Spring为我们提供的表达式,就是我们在写Spring程序时会用到的,表达式方便简洁,语义明确。

  1. AOP :面向切面编程,它是Spring的另一核心思想,AOP是OOP(面向对象编程思想)的延续利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
    Aspects:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
    Instrumentation :提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
    Messaging:是一些消息的使用的模块

4.Data Access/Integration(数据访问/集成):这个模块的话是帮助我们的应用程序访问数据 库做准备的

5.WEB:指的是在B/S架构的程序中使用的模块

二、使用Spring的好处?

1.最大的好处是方便解耦,降低了类与类之间的耦合性,方便我们后续程序的维护与扩展。
2.可以集成很多的优秀的第三方框架。
3.Spring的aop可以帮助我们解决一些系统日志、系统安全等问题。
4.Spring对Junit4支持,可以通过注解方便的测试Spring程序。

三、RandomAccess接口作用?

我们从源码可以看出它是一个空接口(标识接口),标识实现这个接口的类具有随机访问功能(快速访问功能)。


public interface RandomAccess {
}

我们都知道在List集合中的ArrayList就实现了此接口,源码如下:

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable

ArrayList 实现了 RandomAccess 接口, 而 LinkedList 没有实现。为什么呢?我觉得还是和底层数据结构有关!ArrayList 底层是数组,而 LinkedList 底层是链表。数组天然支持随机访问,时间复杂度为 O(1),所以称为快速随机访问。链表需要遍历到特定位置才能访问特定位置的元素,时间复杂度为 O(n),所以不支持快速随机访问。ArrayList 实现了 RandomAccess 接口,就表明了他具有快速随机访问功能。 RandomAccess 接口只是标识,并不是说 ArrayList 实现 RandomAccess 接口才具有快速随机访问功能的!

有关时间复杂度的比较:O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)

(排在前面的话说明耗费时间少些)

我们都知道二分查找的速度是很快的(时间复杂度:O(log2n)),所以我们通过查看Collections类中的binarySearch() 方法的源码发现:


 public static <T>
    int binarySearch(List<? extends Comparable<? super T>> list, T key) {
        if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
            return Collections.indexedBinarySearch(list, key);
        else
            return Collections.iteratorBinarySearch(list, key);
    }
    //indexedBinarySearch(list, key)方法,
    private static <T> int indexedBinarySearch(List<? extends T> l, T key, Comparator<? super T> c) {
        int low = 0;
        int high = l.size()-1;

        while (low <= high) {
            int mid = (low + high) >>> 1;
            T midVal = l.get(mid);
            int cmp = c.compare(midVal, key);

            if (cmp < 0)
                low = mid + 1;
            else if (cmp > 0)
                high = mid - 1;
            else
                return mid; // key found
        }
        return -(low + 1);  // key not found
    }
    //iteratorBinarySearch(list, key)方法
    private static <T> int iteratorBinarySearch(List<? extends T> l, T key, Comparator<? super T> c) {
        int low = 0;
        int high = l.size()-1;
        
        //注意这里使用了迭代器,会降低性能的
        ListIterator<? extends T> i = l.listIterator();

        while (low <= high) {
            int mid = (low + high) >>> 1;
            T midVal = get(i, mid);
            int cmp = c.compare(midVal, key);

            if (cmp < 0)
                low = mid + 1;
            else if (cmp > 0)
                high = mid - 1;
            else
                return mid; // key found
        }
        return -(low + 1);  // key not found
    }

它要判断传入的 list 是否 RamdomAccess 的实例,如果是,调用indexedBinarySearch()方法,如果不是,那么调用iteratorBinarySearch()方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值