zoukankan      html  css  js  c++  java
  • 开发必会系列:为什么要用spring

    Spring是于2003 年兴起的一个轻量级的Java 开发框架,开源的,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。


    JavaEE 项目为何使用Spring框架?
    回顾我们之前写过的程序的基本结构:
    Dao、DaoImpl、Factory(其中应用到了单模式)、Service、ServiceImpl 、Action(Struts框架里的,相当于MVC的controller)等等。我们是否想过做法有哪些缺点?

    使用spring前:
    ServiceImpl 中用到了daoImpl 对象,那么 servieImpl 依赖于daoImpl内容, 这是一种依赖关系;Action中用到了serviceImpl,那么action依赖于serviceImpl,他们也有这种依赖关系。

    另外,我们在Dao层操作数据时,hibernate 中的session创建,事务的开启和关闭, 都是我们手动在Dao层来管理的,手动调用hibernate处理事务的方法。
    使用spring后:
    我们可以将对象的创建以及对象之间的依赖关系、Hibernate的事务等,都由Spring框架进行操作,这样实现了程序之间的解耦、高内聚。

    那这种方便具体体现在哪呢?学Spring我们需要了解几个关键的词语:

    IOC:Inversion of Control(控制反转):
      Ioc就是容器控制程序之间的关系,而非传统的程序代码直接控制。所谓控制反转,就是控制权由应用代码中转移到外部容器中,控制权的转移,即所谓的反转。(通俗讲:A类用到了B类中相关方法,此时A依赖于B,那么需要在A类中new实例化B,这是传统的代码控制,但是IOC描述的是控制反转,表示这种A类里面new实例化B对象的权力,不是由A操作的,而是交给Spring实例化B对象,而Spring只需要配置类和类之间依赖关系,告诉程序,A用到了B)

    DI: Dependency Injection (依赖性注入):

    (通俗讲:由Spring事先实例化好指定某些类,通过spring装配他们之间的依赖关系,例如:A用到B中的方法,此时spring会将实例化好的B对象,依赖注入给A,那么A就可以使用这个对象了,这个意思其实跟IOC差不多)
    AOP:Aspect-Oriented Programming(面向切面编程):举个例子,比如B类调用某一个方法时,我想统计这个方法执行了多长时间,但我又懒得在程序中每一处调用B类该方法的地方,加入统计时间的代码,于是我就想,可不可以让系统自动地,在所有执行这个B类方法的地方,都调用我的统计时间的代码呢?AOP就可以。spring中,有两种实现方法,一种是针对方法名的,即:在配置类中,或者配置文件中,指明哪个方法名执行时,会触发我自定义的统计时间的方法;另一种是针对注解的,即:自定义一个注解,在你要统计时间的函数上,加上这个注解,然后在配置类中,对这个注解,定义你要执行的统计时间的代码即可。这就是切面。
    ORM:对象关系映射(hibernate和ibatis框架,将我们的表,对应到vo类,或对应到配置xml文件映射表)

    所以,具体的方便,就体现在Spring的核心——IOC。
    IOC容器提供了Srping的基本功能,其主要组件是BeanFactory,他是工厂模式的实现,BeanFactory使用控制反转(IOC) 模式,将应用程序的配置和依赖性规范与实际的应用程序代码分开(通俗讲:就是将要实例化的对象,由Srping框架事先完成,BeanFactory中存放的就是所有实例化好的对象)。

    我们在代码里,直接用@Resource或@Autowired就能拿到这个bean,这个bean的作用域可以自己设置,有五种,如下图

    最后了解一下Srping源文件包的内容:

    以3.1.4为例,源文件目录结构如下:
    Dist:存放Spring的核心Jar文件、
    Docs:存放源码API和spring框架使用的API等;
    Projects:存放spring实例;
    Src:spring框架的所有源码;

  • 相关阅读:
    三种适配器模式 总结和使用场景
    (面试)Statement和PrepareStatement有什么区别
    知识点:Oracle+表连接方式(内连接-外连接-自连接)+详解 来自百度文库
    (面试题)有关Integer
    sessionId与cookie 的关系(百度文库)
    (面试)将1到100的随机数插入到长度为100的数组中,保证不会有重复元素
    如何通过sql的insert语句插入大量字符串到oracle的clob字段?
    (面试题)synchronized 和 java.util.concurrent.locks.Lock 的异同
    【转】java io 流 设计模式
    (面试题)两个对象值相同 (x.equals(y) == true) ,但却可有不同的 hash code ,这 句话对不对
  • 原文地址:https://www.cnblogs.com/zhaot1993/p/12982471.html
Copyright © 2011-2022 走看看