Skip to content

为什么使用Spring #15

@superstonne

Description

@superstonne

相对于EJB,Spring 是一个轻量级的企业级Java技术。它可以使得普通的Java Bean在没有EJB或者其他企业级Java技术的帮助下,也可以拥有强大的能力。使用Spring可以使得Java开发变得更加简单。

轻量级并且最少的侵入POJOs

一个简单的Java对象,它不需要继承任何Spring提供的对象,即可作为Spring应用的一个组件,同时它也可以被应用于一个非Spring的应用。Spring相对于一些老的技术(EJB,Struts),不会强制Java对象继承自己提供的对象,达到非侵入式编程。

package org.jinlong.study.spring;

public class HelloPOJO {
    public void helloPOJO(){
        System.out.println("Hello Spring!");
    }
}

通过依赖注入和面向接口编程来达到低耦合

通常一个应用不可能只使用一个Java对象就能完成功能,都需要通过组装来使得简单的Java Bean的功能变得丰富。假如我们有一个Nest对象,它组装了一个动物类型。如下

package org.jinlong.study.spring;

public class Nest {
    private Animal animal;

    public Nest() {
        this.animal = new Dog();
    }

    public void sayName() {
        animal.sayName();
    }
}
package org.jinlong.study.spring;

public abstract class Animal {
    public abstract void sayName();
}

package org.jinlong.study.spring;

public class Dog extends Animal {
    public void sayName() {
        System.out.println("I am dog!");
    }
}

如上的代码设计虽然完成了窝和动物对象的组装的功能,但是窝和动物紧紧的耦合在一起,这样的代码不可以重用,扩展性差,并且不方便测试。因此引入依赖注入的概念,更改代码如下:

package org.jinlong.study.spring;

public class Nest {
    private Animal animal;

    public Nest(Animal animal) {
        this.animal = animal;
    }

    public void sayName() {
        animal.sayName();
    }
}

这样Nest并不知道组装的Animal的具体实现类是什么,只有在使用的时候注入以后才知道。使用依赖注入的编程思想,可以使得代码易于扩展,重用性强,并且可以通过Mock来方便的进行测试,Spring的IOC容器就是对依赖注入思想的封装,它可以使得我们更加容易的组装bean,方便的使用依赖注入思想来编程。

通过约定和切面来达到声明式编程

在应用中有一些功能是横跨多个业务模块的,例如日志,安全认证,事务控制等功能。如果在每个模块中直接加入这些功能,会使得我们的代码中有很多重复类似的代码,另外这些代码并不是这些模块核心的业务的代码,却与核心业务耦合在一起。业务模块除了实现自己的核心功能,并且不得不去关心日志,安全,事务等问题。
面向切面的编程思想将这些功能从业务中隔离出来,以横切面的形式插入到各个业务模块中,可以使得业务模块专心完成核心业务逻辑的实现,而不必去关心日志,安全,事务的问题。
Spring的AOP完成了这种编程思想的封装,可以使得面向切面的编程变得更加简单。

通过切面和模板来减少样板代码

在应用经常有一些功能的实现步骤是固定的,例如JDBC,JMS,JNDI等。
它们的实现通常是,加载驱动,建立连接,业务操作,释放资源等。这样的模板代码,每次操作基本是一样的,Spring的模板编程,为我们封装了这些繁琐相同的步骤,我们利用模板编程,只需要去关心业务逻辑,对JDBC的使用,我们无需去关心驱动的加载,链接的建立和资源的释放等模板操作,这样使我们的编程更加方便简单。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions