spring框架个人理解
【spring框架个人理解】Spring是一个全栈式的框架,也就是可以涉及到各层的一个框架,JavaEE官方规范中推荐,一个结构良好的JavaWeb应用,应该分为三层结构,即:web层(负责处理用户请求),Service层(用来处理程序逻辑),Dao层(用来访问数据库)。像Struts2框架,就是一个web层的框架,而Hibernate框架是一个负责数据库访问的框架,而Spring框架可以涉及到三个层。

Spring中有三个核心概念:IOC,DI,AOP
IOC:控制反转,即将对象创建的权利,由程序员,转移为了Spring框架。
DI:依赖注入,即程序员声明的类型引用,对象由框架来提供。
IOC与DI实际上是工厂设计模式的一种体现,IOC与DI两个概念合起来,组成了Spring框架的最基本功能,即各层之间的解耦与提供对象。在未使用Spring框架之前,web层,Service层与DAO层之间,对象的创建由程序员来创建(Service service = new ServiceImpl()),这样做虽然使用了接口类型,但是对象的类型依然被写死,虽然实现类中可以更改任意方法,但是类型缺依然被写死,如果想要更改实现类型,就需要更改源码。
一个良好的Java程序,他的结构应该是这样的,对象的获取不由程序员来创建,而是由工厂来提供,如果仅是这样的话,其实松耦合也只是进行了一半,比如,在Service层中,声明了DAO接口的引用,对象由Bean工厂来提创建,虽然Service层与DAO解耦了,但是工厂与DAO实现类依然耦合,所以Spring框架利用反射的原理,从配置文件中来获取实现类的具体类型进行对象创建,达到了完全松耦合,实现类的更改只需要在配置文件中进行更改就可以了。
AOP:面向切面编程。
AOP概念的出现,采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存),在未使用Spring框架时,如果在许多类中有相同的代码,之前的方法是采用抽取公共部分作为父类,需要用到的类来继承,但是由于Java是单继承,所以这种方法有局限性。而Spring框架利用了动态代理设计模式,讲类中共同代码抽取出来,如果类需要这些代码,就利用生成代理对象,在代理对象中控制共同代码的运行。
Spring使用的动态代理技术有两种,分别是:JDK的动态代理、Cglib的动态代理。
JDK的动态代理:JDK的动态代理技术需要被代理对象实现某个接口,利用类加载器,需要将类所实现的接口传给Proxy,才能生成代理对象,所产生的代理对象是被代理对象的接口的一个子类,所以两者具有相同方法,达到增强被代理类的作用。
CGlib的动态代理:JDK动态代理技术需要被代理类实现接口,所以便具有了局限性,而CGlib代理,生成的代理对象是被代理对象的子类,所以不需要接口,也能达到具有相同方法的目的。
Spring框架在类实现接口时,会自动采用JDK的动态代理,在没有实现接口时,自动采用CGlib的动态代理。或者在optimize属性设置为true时,强制使用CGLib。
Spring AOP的实现也有两套,即Spring本身的AOP实现,以及AspectJ的AOP实现,在Spring2.0时,Spring开始支持并建议使用AspectJ进行AOP编程。
Spring的AOP编程,一般采用默认切面自动代理,只需在配置文件中使用。
在默认切面自动代理中,切点切面一般使用正则的形式来控制切点的选择,一般一个切面中,只能有一个通知。
AspectJ的AOP实现,并不再是每个切面分开配置,而是配置在中,并且一个切面可以配置多个通知,通过expression属性,利用表达式来控制切点的拦截。
Spring的数据库访问。Spring提供了类似DBUtil的方式来进行数据库的操作,本质上仍然是JDBC的简单封装。
JDBCTemplate在数据库中取出的数据封装进对象时,有两个接口分别是ResultSetExtractor、RowMapper。两者都是用于数据库中取出的数据封装进对象,区别是,在取出的数据是一个集合时,ResultSetExtractor是需要程序员去new一个List进行封装,而RowMapper则是已经new好了List,程序员只需要写单独对象的封装就可以了,本质上都是一个回调函数的形式,在取出数据时,调用写好的回掉函数进行封装。
JDBCTemplate与DBUtil最大的区别就在于数据的封装,DBUtil利用反射机制,只需要提供被封装类的类型,DBUtils就可以自动完成数据的封装,将回调函数的部分也省去。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/3965.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
