spring快速教程(一):为什么要使用spring

小TOT 创建于 2017-02-14

spring改变了传统的编程方式

传统的程序开发,需要我们维护大量的对象,配置大量的对象,对象的创建和消亡都由我们自己来管理。我们注意到,程序的对象tong'c通常都是可以复用的,比如一个保存数据到数据库的dao类,比如一个使用http调用远程服务的对象,这时我们通常采用单例模式,这样可以减少jvm的内存消耗。对于一些复杂的对象,我们使用设计模式的创造模式:比如工厂模式来创建我们需要的对象,这样我们能够根据方便的获取对象。

比起传统的哪里需要对象就在哪里new一个的模式相比,通过设计模式的改造确实是一大进步,但这还不够好,因为创建对象及组装对象间依赖关系由我们在程序内部进行控制,这样会加大各个对象间的耦合,如果我们要修改对象间的依赖关系就必须修改源代码,重新编译、部署。而如果采用Spring,我们能够轻松的完成以上单例和复杂对象的创建工作,并且Spring根据配置文件来进行创建及组装对象间依赖关系,修改对象的依赖关系修改配置文件即可,无需重新编译,这样可以大大的减小对象之间。

对于spring,有一个经典的形容,如果程序是一台运行的计算机,那么spring提供的功能就好比是电脑的主板,上面的器件,如cpu,内存,磁盘就好比是程序中一个个的对象。spring根据xml配置文件(或者其他基于代码的配置,或者注解的配置)实例化好所有的对象,供程序使用。这样的好处在于使得程序的耦合性大大降低,对象的依赖关系由spring来管理,使得程序的开发后维护变得更加简单。

spring封装了常用的javaEE开发模块

spring runtime

上图展示了spring的常见功能,core container提供了spring的核心功能,bean提供了对象(bean)的配置支持,core提供了spring的ioc核心功能,spel提供了spring的表达式语言支持,context帮助我们管理程序上下文。data Access/Integration为我们访问数据库提供了方便,spring不仅提供了一些列模板来简化数据库的访问,也为继承其他orm数据库框架提供了方便。原则上来讲spring可以非常方便的集成所有框架,因为一切程序都是有对象组成,框架也是如此,正好bean的管理是spring的核心功能。spring 还为面向切面编程(aop)提供了方便,比如使用spring的aop能力进行日志记录、性能统计、安全控制、异常处理。还能帮我管理最头疼的数据库事务。不论是web开发的java EE架构,还是java SE,都能使用spring来简化编程。

IOC控制反转

控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)

有个问题需要说清楚什么被反转了。早在2004年,Martin Fowler就提出了“哪些方面的控制被反转了?”这个问题。他总结出是依赖对象的获得被反转了。基于这个结论,他为控制反转创造了一个更好的名字:依赖注入。

IOC作为一种全新的程序设计思想,可以把IoC模式看做是工厂模式的升华,可以把IoC看作是一个大工厂,只不过这个大工厂里要生成的对象都是在XML文件中给出定义的,然后利用Java 的“反射”编程,根据XML中给出的类名生成相应的对象。从实现来看,IoC是把以前在工厂方法里写死的对象生成代码,改变为由XML文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。

第一个spring程序

spring提供了非常多的功能,下面示例来着与spring的quickStart,该示例简单演示一下spring上下文的使用。

  1. 使用maven创建java程序,加入如下依赖:
    <dependencies>
     <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-context</artifactId>
         <version>4.3.6.RELEASE</version>
     </dependency>
    </dependencies>
    
    2,编写接口MessageService.java
package hello;

public interface MessageService {
    String getMessage();
}

MessagePrinter.java

package hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MessagePrinter {

    final private MessageService service;

    @Autowired
    public MessagePrinter(MessageService service) {
        this.service = service;
    }

    public void printMessage() {
        System.out.println(this.service.getMessage());
    }
}

Application.java

package hello;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.*;

@Configuration
@ComponentScan
public class Application {

    @Bean
    MessageService mockMessageService() {
        return new MessageService() {
            public String getMessage() {
              return "Hello World!";
            }
        };
    }

  public static void main(String[] args) {
      ApplicationContext context = 
          new AnnotationConfigApplicationContext(Application.class);
      MessagePrinter printer = context.getBean(MessagePrinter.class);
      printer.printMessage();
  }
}

以上示例展示了最进程的依赖注入示例,MessageService 通过@Autowired将需要的bean绑定到service。这就是依赖注入。

总结

使用spring相较于传统的软件开发方式,优势显而易见。为什么要使用spring无非这几个原因:

  1. ioc依赖注入帮助我们解决对象的创建和依赖的管理,使得程序耦合降低。
  2. aop使得面向切面编程变得更加简单,使得切面逻辑与业务逻辑解耦。
  3. 提供丰富的java EE功能,加快开发。 基于以上几点,使用pring能够快速的编写出简洁高效优雅的代码。

参考

  1. IOC百度百科
  2. spring quick start
  3. 开涛spring教程:spring概述