目录
  1. 1. 笔者前言
  2. 2. 1、框架有什么?
  3. 3. 2、为什么使用它?
  4. 4. 3、核心内容:
    1. 4.1. a、管理Bean
    2. 4.2. b、Bean作用域
    3. 4.3. c、面向切面
    4. 4.4. d、“自动装配” 与 “零配置”
  5. 5. 4、ORM与拓展
  6. 6. 5、家族成员
  7. 7. The End
Spring(一):Spring开篇

笔者前言

作为一个Java Developer,Spring我相信是大家都绕不开的一个圈子,又或者你刚好是一位想要或即将成为Java工程师的追梦者,那么这一块的东西你更要给予更多的关注和投入。现在的大部分企业在选择小伙伴的时候不会问你什么是EJB,见面的第一句可能就是:你对Spring掌握到了什么程度。我呢,也是根据我近几年的这开发经验,会梳理下这方面的相关的知识,一个是方便自己后续的查阅,再一个也是和大家共勉。后续文章中如有疑问或者是错误的地方欢迎大家私信我,谢谢!

好了,话不多说了我们还是进入正题,开篇我们讲Spring,其他相关内容可从我的文章中进行检索。

Spring 最初诞生(创建者:RodJohnson)的目的是解决企业应用开发的复杂性,使用JavaBean来完成企业应用的开发,帮助企业开发出更简单、更易于测试和相对松耦合的应用程序。

1、框架有什么?

在这里插入图片描述
最新的框架已经来到了5.x版本了,想要了解框架内更多信息的小伙伴可以上Spring开发者官网(https://spring.io/) 了解下。

  • Core Container(核心容器):最基础的部分。它为我们提供了整套的基于BeanFactory(工厂模式)创建的JavaBean的管理,依赖注入(DI)、控制反转(IOC)的使用将配置和实际代码得以分离。除此之外,容器中还包含有应用的上下文、表达式的支持、以及许多企业组件的支持(需要时进行配置即可)。
  • Aop、Aspects(切面编程):面向切面编程。帮助Spring应用能够进一步的解耦,可以逻辑处理(通用业务、事务、日志等)的进一步抽取,提高代码复用性。
  • Instrmentation:很少使用。给JVM添加添加代理用的,为Tomcat 传递类文件。
  • Message:消息的集成。集成Messaging api以及为消息协议提供支持
  • Data Access(数据访问与集成):数据访问与持久化的支持。无论你是钟情于JDBC、还是习惯ORM、OXM等这些的数据集成方式他都统统囊括,也提供了完备的事务处理。它不仅可以支持主流的数据访问框架,还支持我们自定义我们自己的数据访问的方式,非常人性化。
  • Web:Web组件的支持。很好的和现在主流的MVC组件进行结合,像Structs、JSF、SrpingMvc等等,本身也提供了像远程调用、REST API的支持等。
  • Test:测试模块。重要性对于开发者而言不言而喻了。

2、为什么使用它?

在看过基本的框架组成后,我们再来看看它能给我们带来哪些的改变。

  • 轻量。无论是从大小或开销而言它都是轻量的
  • 非侵入式。应用程序代码对框架的依赖小。
  • 控制反转(IOC)。将对象的创建和依赖的查找都交由容器,不但简化了开发的还降低了组件之间的耦合性。“硬编码”的减少也使得后期的维护性得以提高
  • 面向切面(AOP)。完成对通用逻辑的统一处理,如:事务、日志、安全等方面的处理,使得应用本身只要关注业务逻辑的实现,带来了简洁的代码和高的复用性。
  • 良好的数据持久化支持。打通主流的第三方持久化框架,简化了繁杂的数据访问代码。
  • 开放性。开源且非常良好的开放性使得你可以自由搭配自己想要的组件和内容。
  • 良好的测试支持。易于构建单元测试

3、核心内容:

a、管理Bean

这边我们要知道两个词:依赖注入(Dependency Injection)控制反转(Inverse of Control,IoC)
我想原先我们最常用的建立依赖关系就是通过“硬编码”来实现,但是随着程序复杂度的上升,这种的方式带来的弊端也是非常明显的。那么我们来看看Spring这个Bean大工厂他是怎么做的呢?
首先我们需要为Bean建立相应的配置信息,然后Spring容器会根据我们提供的这些配置信息主动的帮我们去创建这些对象(由IoC容器来控制对象的创建),创建后它再查找以及注入相应的依赖对象,所以在Spring应用程序中的对象只是被动的接受(或被分配)依赖的对象。
这种由容器控制对象(还可以是文件等)的创建再将对象反向提供给所需的对象的方式就叫做“控制反转”,IoC其实不是一种什么技术,它是一种设计的思想或原则,和“好莱坞”法则(Don’t call us,we’ll call you)是一样的道理:不要打电话给我们,我们会电话你(不主动的去创建对象,IoC容器帮对象找到依赖关系并进行注入)。
DI和IoC其实说的是同一件事,只不过他们是从两个不同的角度来看待这个过程的。

让我们通过一些比较实际的说明来对上述两个名词做一个更深入的理解吧。

==LV1==:在我们创建对象的时候原始的做法是:主动通过New的方式来创建对象,然后再调用所创建的对象中的相应的方法。
==LV2==:使用工厂模式后这个过程就变成了:对象的创建在工厂中进行New的方式进行创建,然后我们主动地通过工厂来获取对象,然后再调用相应的方法。
==LV3==:使用IoC的方式:我们只需要声明我们需要的对象而不用做实例的创建,创建会由容器完成并将对象传递给使用者。

Spring常用的注入方式有两种,分别是:
设值注入:是指容器通过成员变量的setter方法来注入被依赖对象。优点:直观、简单(Spring中大量使用)
构造注入:是指通过构造函数进行注入。优点:顺序可以自己在构造函数中决定、无需担心后续代码破坏、
Ps:若依赖关系不会发生变化应采用构造注入,否则应考虑设值注入。

b、Bean作用域

  • singleton: 单例模式,在整个Spring IoC容器中,singleton作用域的Bean将只生成一个实例;(默认使用)
  • prototype: 每次通过容器的getBean方法获取prototype作用域的Bean时,都将产生一个新的Bean实例;(Bean的创建、销毁的对应的开销都较大)
  • request: 对于一次HTTP请求,request作用域的Bean将只生成一个实例,在同一次HTTP请求内,程序每次请求该Bean,得到的总是同一个实例。只有在Web应用中使用Spring时,该作用域才真正有效
  • session:对于一次HTTP会话,session作用域的Bean将只生成一个实例,这意味着,在同一次HTTP会话内,程序每次请求该Bean,得到的总是同一个实例。只有在Web应用中使用Spring时,该作用域才真正有效;
  • global session: 每个全局的HTTP Session对应一个Bean实例。在典型的情况下,仅在使用portlet context的时候有效,同样只在Web应用中有效。

c、面向切面

OOP这个作为程序猿入坑的第一课我们再熟悉不过了,不过它在整个程序设计的过程是纵向的,像继承、抽象、多态等这些更多的是一个子上而下的关系描绘的是一个应用的程序的层级图,真正到应用实现的时候你会发现对于一些系统级的服务或者是通用的业务功能,会充斥在我们每一个层级,一定程度上加重了系统的复杂度。
我们来看一个例子更好的理解面向切面的设计:

案例:一栋10层楼的大厦被一个集团所承包,现在每一层都由该集团的一个子公司入住,共十家子公司,那么就会 变成每一层都会有一个人力部门负责招聘,一个行政部门负责水电,这些部门做着同样的事情但是出现重复的出现了在各个楼层,现在集团为了统一管控,建立统一的行政和财务总管各个公司的事务,并取消各个公司相应的部门,各个公司只要关注自己的核心业务即可。这样的管控就叫做AOP,抽取出各个通用的业务或系统模块统一进行执行,而各个子公司内部的组织结构分层就叫做OOP了。

上述例子为个人拙见,不需要理解的可以直接跳过,那么Spring的AOP长什么样呢,我们一起来看下。

Aop的实现上也可以分成两类:
一、静态的。AOP框架在编译阶段对程序进行修改,即实现对目标类的增强,生成静态的AOP代理类。(较好的性能,但需要使用特殊的编译器)
==》AspectJ为静态AOP的代表,是一个较为主流的AOP框架,提供了强大和丰富的AOP功能,框架内主要帮助我们定义了如何表达、定义AOP编程中的语法规范,通过这套语法规范,可以方便地用AOP来解决Java语言中存在的交叉关注点的问题,以及提供编译、调试工具等。
二、动态的。AOP框架在运行阶段动态生成AOP代理,以实现对目标对象的增强,以Spring AOP为代表。(纯Java,无需特殊编译器,性能较差)

Aop关键术语:

  • 通知/增强(Advice):在特定的切入点执行的增强处理。Spring的通知有5种类型:before、after、after-returning、after-throwing和around这五种类型
  • 切面(Aspect): 可以理解为一个类,在当中多用于定义Advice;
  • 连接点(Joinpoint): 表示在何种操作发生时跳转到相应的切面。比如方法调用时、修改字段时和抛出异常时等等,在Spring AOP中,连接点总是方法的调用;
  • 切入点(Pointcut): 可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点Spring的AOP支持;

Spring中的AOP代理由Spring的IoC容器负责生成、管理,其依赖关系也由IoC容器负责管理。为了在应用中使用@AspectJ支持,Spring需要添加三个库:1、aspectjweaver.jar 2、aspectjrt.jar 3、aopalliance.jar

鉴于AOP的以上特性,所以常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。

d、“自动装配” 与 “零配置”

Spring 检查XML配置文件内容,确定依赖关系,为调用者Bean注入被依赖的Bean。在配置文件中可以通过元素的default-autowire进行指定(配置文件全局指定,全部生效),或是通过元素的autowire进行指定(只对该Bean有效)。

自动装配的方式:

  • no: 不使用自动装配(默认)。依赖必须通过ref元素进行显示的定义。显示的方式能够让我们更加的清晰Bean之间的依赖关系,所以在较大的环境中建议使用
  • byName:通过setter方法名自动装配。Bean的id与setter方法名去掉set后的名称一样时进行注入。若没找到则不会注入。
  • byType: 通过setter方法的参数类型来自动装配。Bean类型与setter方法的参数类型一样时进行注入,若找到多个这样的Bean,就抛出异常,若没有找到则不会注入。
  • constructor:与byType类似,这边是使用构造函数的参数类型。如果容器不能找到一个和构造方法参数类型一样的Bean,则会抛出一个异常;
  • autodetect:由容器自动决定是使用byType还是使用constructor。

Spring的“零”配置是什么意思呢,其实就是将繁杂的编写配置文件工作省略掉,通过配置自动扫描包的地址以及注解来实现所谓的零配置。

首先要在配置文件中指定要自动扫描的包,如:

1
<context:component-scan base-package="com.missxhh.spring.test"/>

其次就是为我们的JavaBean指定Bean的类型(配置类型通过注解Annotation的方式来实现),主要包括以下:

@Component:普通的JavaBean组件类
@Controller:控制器组件类
@Service:业务逻辑组件类
@Repository:DAO组件类

在配置完JavaBean后,可以使用@Resource来进行依赖的配置,这个要卸载setter方法或变量的上面

“零配置”下的自动装配
Spring 很贴心的为我们提供了@Autowired这个注解(Spring2.5后),用来为我们的方法或变量指定自动装配。@Autowired模式在通过byType的方式进行自动装配的(可以结合@Qualifier进行精确的装配).

4、ORM与拓展

Spring 对于数据访问的封装已经很到位了,spring-jdbc提供了对于传统SQL的使用,spring-orm又满足我们对于ORM(对象关系应用)的追求,spring-tx事务处理也可以和上述二者搭配使用。同时Spring也在避免一直地“重复造轮子”,针对数据访问的处理你也可以完全委托给其它的ORM组件,如Hibernate、Mybaits、Jpa等等,基于此由Spring扩展出的像SSH(Struct2 + Spring + Hibernate)、SSM(Spring + SpringMVC + MyBatis)等框架也是被现在很多的企业所认可和使用的

5、家族成员

由于Spring开源的特性,就会涌现出无数的开发者为其添砖加瓦,演变成现在原来越完善的这样的一个生态。那么都有些什么东西呢,以下是我目前接触到的较为实用的一些框架技术,如果有其他好用框架组件可以联系我,大家共同探讨。

SSH、SSM这个上面已经有提过了,这边就不做过多的说明。
Spring Mvc:基于Spring的MVC平台,不过要再结合其他的JDBC或ORM框架才能使得这个框架完备。
Spring Security:支持系统授权、认证的支持。
Spring Mobile:支持对手机设备检测等功能。
Spring Boot:现行主流的微服务平台,后面我也会出专门
Spring Cloud:现行主流的分布式微服务框架。
JEECG:一款基于SpringMvc+MiniDao的开源框架
…未完待续

The End

好了,关于Spring框架的介绍我就先简单的介绍在这边,如果大家有其他需要帮助的地方可以私信(或者关注我们网站获取我的联系方式)与我联系,我们共同探讨,共同进步。后面我会针对SpringMVC单独进行讲解,如果有需要的可以关注相应的文章。

谢谢阅读,您的关注就是对我最大的动力!!!

文章作者: 黄建峰
文章链接: http://missxhh.com/posts/5026f2e9/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 黄建峰

评论