关于spring的了解

写java web服务4年了,一直在用spring。不过也正因为上手确实比较简单,写成了习惯,所以也没有深入了解一下spring的体系,对于spring mvc的源码和机制也没仔细研究过。工作中的时间一般都写业务逻辑去了。昨天看了一下框架,还是有好多更新与发展,所以再写个文章记一下自己的理解。

1. Spring要解决的问题

对于Java企业级应用来说,很多开源项目热衷于在做的事情,就是去开发替换主流的J2EE的备选方案,因为J2EE中之前的一些规范例如JSP或者EJB过于复杂了。这其中一个很常见的问题就是如何把一个以数据库为后端的各个不同的团队开发出来的组件放在同一个web控制框架下。而spring就在这方面作了一些尝试,用分层的方式把不同的组件聚合起来。

Spring的优点很多,目前我感受到的有以下一些:
1. 可测试性。就算没有servlet容器,也一样可以对单个模块进行自主的测试;

  1. 一些注解的开发让写controller和service非常简单;

  2. 对于请求处理也加入了路径变量@PathVariable让参数获取更简单;

  3. 另外spring可以只用一部分,而不是要么用要么全部模块都得用的那些框架,例如我现在就只用spring MVC这一部分,ORM我压根没有用spring框架中的,我仍然在service中用new 来产生pojo。

2. 一些概念

2.1 AOP

Aspect Oriented Programming,翻译成中文叫面向切向编程(这是什么鬼翻译呀混蛋)。
理解起来就类似于我在请求来之前先打个日志记录一下reqeust的参数,如果每一个controller自己打的话,会很麻烦,可以做做成了代理或者门面模式,自己做的话,可能会长得有点奇怪。而spring对于AOP的实现是怎么做呢?对,拦截器就是一个比较典型的例子。自己也可以实现自己的切面,例如用@Aspect标签。

2.2 IOC与DI

IOC我的理解是类在编译时,其实我们都不需要知道它是被用来做什么的。只需要负责完成自己的那部分功能就好了。类与类的关系,会经过配置文件来组装在一些。这种编程的思想可以使得耦合更加松散。

DI我理解是专指类的实例化的时候的一种实现。例如典型的构造器实现,set()方法实现和接口参数实现。典型的例子就是,用XML配置文件来管理需要用到的controller,而不是直接的去让a.set(b),a.run(){b.run()},所以在spring中,实例化是被动的,由框架来帮助实现,例如:BeanFacotory来实例化bean

3. spring framework简介

官网

文档

github上的学习项目

3.1 当前的版本

以spring-context为例:这个是一个spring中核心的模块。spring中的模块数量确实太多了。一般来说肯定不会每一个都用上的。

<dependencies>  
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.2.5.RELEASE</version>
    </dependency>
</dependencies>  

3.2 spring的模块

spring framework

  1. spring-core和spring-beans是框架的基础,这里面包括了IOC和DI的实现。spring-context使用了类似JNDI的方式去使用core和bean模块,并提供了国际化以及J2EE的一些特性。而ApplicationContext是spring-context的核心。spring-context-support则提供了一些第三方的工具,例如JCache,JavaMail,Quartz以及模版引擎(例如FreeMarker,velocity)。

  2. spring-aop、spring-aspects则是面向方向编程相关的包。

  3. spring-messaging 可以用于消息发送应用,算是JMS的实现。不过我基本用不上。

  4. spring-jdbc、spring-tx、spring-orm、spring-oxm

  5. spring-web, spring-webmvc, spring-websocket, and spring-webmvc-portlet则是web方面的模块.

3.3 spring的别的项目

spring boot官网

spring boot github

这个是一个让你快速使用spring框架的项目,号称2分钟写一个java web服务。确实只需要

git clone && gradle build && java -jar build/libs/gs-spring-boot-0.1.0.jar

就可以看到hello world了。这个项目把tomcat作为默认的容器放了进来,都压根不用打成war包部署,相当的快。

测试起来也相当的方便。

不过我觉得用的人不多,一方面是压根没有必要为了这一点点方便来改变已有的项目,特别是还得重新依赖一大堆辅助的boot*.jar包。另外对于性能以及容器的调优也还不如分开来做更方便直接。所以我目前也是暂时不使用这种方式来开发线上项目的。这个作为java web开发的项目,感觉只是一下可以让入门的人更加简单的玩具。期待后续有更人性化的修改。

4. 我用到的spring中的部分

主要还是spring webmvc

comments powered by Disqus