花了差不多一天初步了解了下spring2。之前看过Eric谈的关于依赖注入的内容后就想读下spring了,毕竟这个框架也比较成熟,抱着浓厚的兴趣就将其知识点都溜了一遍。
谈谈学习的收获,spring涉及的知识很多,但主要是对于设计模式的应用。spring的主要知识点有两个:IOC和AOP。
由于我学习的目的不在于掌握其使用,而是理解其内部原理,意识到这点,所以我的学习主要偏于对其实现的内部机制的理解。
IOC(Inversion of Control),即控制反转,又称为DI(Dependency Injection),即依赖注入。了解了原理后,我觉得叫做DI比较合适,为什么呢?谈下我的理解。
先说下IOC的作用,主要有两个,一个是帮我们实例化bean(即java类),这就是他叫控制反转的原因。第二个作用是我们将实例化的对象通过外部控制注入到我们需要使用的地方。
说下第一个作用,就不得不感慨spring他的名字真多 = =...其实他小名又叫bean工厂,听到这个名字就可以知道他的作用,我们可以通过配置文件(Xml)和注解(Annotation)两种方式来控制spring为我们实例化对象,然后将他们都放到IOC容器里面,熟悉设计模式的人看到这里就可以理解到他的好处了,通过控制我们就可以不用new来实例化类,这个特性的用处可以巨大的!比如他在OO中的多态中父类对象指向子类时,之类的实例化对象我们可以通过配置文件来指定,最常用到的是我们在数据访问层的时候,我们可以先实现不同的数据库的交互代码,然后再配置文件里要哪个就实例化哪个,多爽~这个在实现代码关注度分离和类之间的解耦的作用可见一斑...下面谈下他的实现机制。
实例化一个类的方法,最基本的就是通过new修饰符,另外一种,熟悉java或C#的人可能对反射这个词不会陌生了,通过反射我们可以动态的来实例化一个类,这个给我们组织设计程序提供了很大的便利。spring的bean工厂就是通过反射机制来实例化我们在配置文件或注解中要求实例化的类,然后将这个些个对象放到IOC容器里面,以后需要用的时候就在容器里面找,而不用再去实例化,由于容器对于数据的组织是通过Map这个集合,满足了(key-value)一一对应的关系,所以寻找对象也是很方便的。这就是spring的bean工厂的大概实现原理。
下面说下spring如何来帮我们将这些对象注入到我们需要的位置里去,主要就是通过读取配置文件(spring里主要是xml)或通过注解(Annotation他是写在源码上的,xml在外部,这就是两者的主要差别)。通过读取配置文件就可以知道要将实例化的对象注入到哪里去,至于注入的方式主要有3种,setter注入,构造方法注入和接口注入。不展开。注解的比较麻烦,他涉及到的是编译器的知识,所以也不是很清楚。
至于AOP,全称为ApsectOrientedPrograming,即面向切片编程,他是对于OOP的一种扩展,所以他依旧遵循的是OO的编程思想和方式。主要用途是需要对于一个事情的某个位置进行操作,最常用到的是日志、权限、测效率、事务等需要在程序的某个位置做些操作这个情况下使用。具体的看下图就能了解。
他可以使得我们独立的编写这些不同类,然后通过xml或Annotation来配置spring从而达到我们的目的,比如说上图,我们需要在程序运行前纪录下日志,完了后在纪录下。通过spring我们就可以独立编写这些操作类,然后通过配置就可以使得完成我们的需求。
至于内部原理,主要是采用了动态代理的机制,不展开,主要是设计模式的运用。
了解了原理后,对于框架的具体应用就会比较清楚。由于应用的时候写法都比较固定,所以实际操作时只要查下范例即差不多了。
通过学习,比较的收获是一句话:知识是靠积累的。spring中的主要原理都主要语言中的几个比较精妙的知识点,如反射、配置文件、注解、设计模式的应用、OO编程思想等。所以,掌握好基础知识并不断积累实践才是王道。