关于Spring也大体了解了一下,其原理比较简单,不过思想却是比较复杂,什么IOC,什么DI,什么AOP……
不过这个这些个东西好在以前都有所接触,倒也不觉得头大。
Spring的原理不过就是反射+注入,这样可以让你定义一个接口而不用每次调用接口都固定该接口的实现,而是通过spring帮你把该接口的实现通过配置文件注入进来。那么这就引出来一个问题,它是什么时候帮你把接口的实现注入进来的?
这个要涉及到两方面,一个是非web形式的,另一种是web形式的。
对于非web形式的spring的使用,你在调用含有接口的类的时候你需要先使用spring的BeanFactory和ClassPathXmlApplicationContext来将接口的实现注入。
对于web形式,你需要在web.xml中配置spring的ContextLoaderListener这个监听器,另外也需要配置contextConfigLocation(也就是你的配置文件的路径)。这样在你的tomcat启动时,它就会自动找到你的beans.xml文件,把其中的xml配置或者是spring的注解的内容加载的spring的容器中,注入到你定义接口的类中(其实就是通过反射调用那个类中的set接口的方法)
关于IOC和DI其实是一回事,IOC是控制翻转的意思,控制翻转很好理解,就是本来A应该控制B,但是却是B控制A。(个人理解,不知是否确切,其实用模板方法就可以说明)。而又有某专家称把IOC改为ID更加形象,DI也就是“依赖注入”的意思,也就是实现你不需要确定好依赖(创建需要的实例对象),而是用容器动态的确定依赖关系(你需要某个实例了就告诉容器,容器帮你确定你需要哪个实例)
再说AOP的概念,Aspect Oriented Programming的缩写,意思是面向切面编程。按照我自己的理解其实就是“不负责任”编程。
面向切面编程解决很多问题,其中最基本的就是使得编程不在拘泥于固定的流程。一个简单的例子就是:
你写一个类A,A里面有方法调用B的add方法,B里面又调用C的save方法,这是一个很简单的逻辑,程序按照A——B.add——C.save.执行,这样如果你需要处理事务的话你需要在B.add里面写上事务处理代码,如果仅此一条线也没什么,如果你的项目里面业务量相当大那该怎么办,每一个都写相同的事务处理代码?显然是浪费时间的。
由此引入AOP的概念,还是原来的程序,还是原来的流程,我只需要写一个单独的切面类(xxxInterceptor),写明是对哪个类进行“切割”,然后通过spring设置。这样你程序在执行的时候你的逻辑上是按照原先的A——B.add——C.save。而实际的执行流程已经改变了。
用一个图来形象的表明就是:
通过这个AOP之后,你就可以不用对你要处理的事务或者是日志负责了,因为有人帮你做了。
关于AOP中还有一些概念还是不太清楚。
IOC和AOP基本上就是spring的核心了,spring单独使用起来还是比较简单的。不过当使用spring对hibernate和struts进行整合的时候就比较复杂了。不过现在觉得复杂是因为还没有了解到这个三个框架的真正内涵,也对这三个框架不太熟悉。
剩下的还是需要通过实践来获得真知呀。 - from the5fire.com
----EOF-----
微信公众号:Python程序员杂谈
微信公众号:Python程序员杂谈