Spring的作用

  当我们使用一种技术时,需要思考为什么要使用这门技术。而我们为什么要使用Spring呢?从表面上面SSH这三大框架中,Struts是负责MVC责任的分离,并且提供为Web层提供诸如控制转发、数据校验,类型转换等功能。Hibernate负责将二维数据表抽象成实体类,让我们能够从面向数据表转向面向实体类开发即面向对象开发。而Spring在干什么呢?Spring似乎什么都没干,但好像少了它又不行。Spring究竟是做什么的呢?我们首先从Spring的起源来看。

  提到Spring技术,就不得不提到JavaBean技术,而JavaBean组件技术是Java技术的重要规范。在Java刚刚发布时,大量的程序员因为Applet的强大、独特的功能(能够拥有富客户端的特性,能制作炫目的动画效果)而吸引,但是为JavaBean这门组件技术而留下。JavaBean能够定义软件组件模型,使Java对象能够重用,并能构建复杂系统。但随着技术的发展,提交EJB组件技术,由于EJB技术的庞大,复杂,使很多Java程序员感到很不爽,因此Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中提出Spring框架,Spring的终极目标就是:简化Java开发。

  哦,原来Spring是简化Java开发的啊,那Spring究竟采用了什么原则实现的呢?

Spring四大原则

1、基于POJO的轻量级和最小侵入性的编程。

2、通过依赖注入和面向接口实现松耦合。

3、基于切面和惯例进行声明式编程。

4、通过切面和模板减少样板式代码。

Spring的核心技术

  在上面说到Spring的原则,那Spring的核心技术是什么呢?这些技术是怎么做到实现Spring的目标:简化Java开发呢?

  第一种核心技术:依赖注入(Dependency Injection,简称DI),是一个将行为从依赖中分离的技术,简单地说,它允许开发者定义一个方法函数依赖于外部其他各种交互,而不需要编码如何获得这些外部交互的实例。在Spring中即将创建对象的时机交给容器进行处理,无需类在内部创建对象。依赖注入能够使相互协作的软件保存松耦合。 因此在Spring容器中无需自己在类内部实例化具体对象,只需关联对应的接口,然后通过Spring容器注入该接口的实现类的对象即可。

  下面为具体实例:Knight为骑士,BraveKnight为英勇骑士类,骑士有探险的方法(embarkOnQuest)

正常代码:

package com.springinaction.knights;

public class BraveKnight implements Knight {
private SlayDragonQuest quest; //实例化具体对象 public BraveKnight() {
this.quest = new SlayDragonQuest();
} public void embarkOnQuest() throws QuestException {
quest.embark();
}
public static void main(String[] args) {
BraveKnight knight = new BraveKnight();
knight.embarkOnQuest();
}
}

Spring代码:

package com.springinaction.knights;

public class BraveKnight implements Knight {
private Quest quest; //Quest为接口 public BraveKnight(Quest quest) {
this.quest = quest;
}
public void embarkOnQuest() throws QuestException {
quest.embark();
}
}

BraveKnight只需依赖Quest接口,无需依赖具体的实现类,这样能够达到松耦合的目的。

配置文件:

<?xml version="1.0" encoding= "UTF-8"?>
<beans xmlns= "http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> < bean id= "knight" class= "com.springinaction.knights.BraveKnight" >
<constructor-arg ref ="quest" /> <!--构造器注入-->
</ bean> < bean id= "quest" class= "com.springinaction.knights.SlayDragonQuest"/>
</beans>

运行主方法:

package com.springinaction.knights;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class KnightMain {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext( "knights.xml");
Knight knight = (Knight) context.getBean( "knight");
knight.embarkOnQuest();
}
}
}

  第二种核心技术:面向切面编程(Aspect Oriented Programming,简称AOP)。AOP是将遍布应用各处的功能分类形成可重用的组件。这些分布在各处的任务,包括日志,事物管理和安全等功能组件,相比一些普通的功能模块,这些功能分布在各处,但是如果把这些功能在其他组件中实现,就会使出现代码重复和代码混乱等问题。AOP就是一些通用的功能组合在一起,而我们能把这些功能看成覆盖在很多组件上的一个切面,所以称之为面向切面编程。

如图所示:常见的事务管理,日志模块,安全模式分布在各个模块,而将它们组件一个切面。

  下面介绍一个实例,来说明AOP,吟游诗人minstrel人需要记录勇士的故事,所以定义一个切面,在勇士出发前赞美勇士,在勇士完成探险后进行歌颂勇士。

代码:

package com.springinaction.knights;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class KnightMain {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext( "knights.xml");
Knight knight = (Knight) context.getBean( "knight");
knight.embarkOnQuest();
}
}
}

正常代码:

package com.springinaction.knights;

public class BraveKnight implements Knight {
private Quest quest;
private Minstrel minstrel; public DamselRescuingKnight(Quest quest, Minstrel minstrel) {
quest = this.quest;
minstrel = this.minstrel;
} public void embarkOnQuest() throws QuestException {
minstrel.singBeforeQuest(); //这里BraveKnight类必须依赖minstrel,过于耦合
quest.embark();
minstrel.singAfterQuest();
}
}
Spring只需简单的配置即可实现AOP,配置文件如下:
<beans xmlns= "http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> < bean id= "knight" class= "com.springinaction.knights.BraveKnight" >
<constructor-arg ref ="quest" />
</ bean> < bean id= "quest" class= "com.springinaction.knights.SlayDragonQuest" />
< bean id= "minstrel" class="com.springinaction.knights.Minstrel" /> < aop:config>
<aop:aspect ref ="minstrel">
<aop:pointcut id ="embark"
expression= "execution(* *.embarkOnQuest(..))" /> <!--定义一个切面为embark,执行embarkOnQuest方法-> <aop:before pointcut-ref ="embark"
method= "singBeforeQuest"/> <!--声明前置通知--> <aop:after pointcut-ref ="embark"
method= "singAfterQuest"/> <!--声明后置通知-->
</aop:aspect >
</ aop:config>
</beans>

运行结果:

  第三种技术:模板。Spring提供一些常用模板,模板能够消除样式代码,从而能让你更加关注你自身的职责。

实例——JDBC代码:

使用Spring模板后的代码:

总结

  总而言之,Spring提供了依赖注入、面向切面编程,模板等技术,采用面向接口编程思想能够让我们能够使用POJO类即可做到类似EJB的效果,能够简化我们Java的代码,更加关注自己的核心任务。

Spring笔记1——Spring起源及其核心技术的更多相关文章

  1. Spring笔记(6) - Spring的BeanFactoryPostProcessor探究

    一.背景 在说BeanFactoryPostProcessor之前,先来说下BeanPostProcessor,在前文Spring笔记(2) - 生命周期/属性赋值/自动装配及部分源码解析中讲解了Be ...

  2. spring笔记3 spring MVC的基础知识3

    4,spring MVC的视图 Controller得到模型数据之后,通过视图解析器生成视图,渲染发送给用户,用户就看到了结果. 视图:view接口,来个源码查看:它由视图解析器实例化,是无状态的,所 ...

  3. Spring笔记(4) - Spring的编程式事务和声明式事务详解

    一.背景 事务管理对于企业应用而言至关重要.它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性.就像银行的自助取款机,通常都能正常为客户服务,但是也难免遇到操作 ...

  4. Spring笔记(7) - Spring的事件和监听机制

    一.背景 事件机制作为一种编程机制,在很多开发语言中都提供了支持,同时许多开源框架的设计中都使用了事件机制,比如SpringFramework. 在 Java 语言中,Java 的事件机制参与者有3种 ...

  5. spring笔记6 spring IOC的中级知识

    1,spring ioc的整体流程,xml配置 spring ioc初始化的流程结合上图 步骤编号 完成的工作 1 spring容器读取配置文件,解析称注册表 2 根据注册表,找到相应的bean实现类 ...

  6. spring笔记5 spring IOC的基础知识1

    1,ioc的概念 Inverse of control ,控制反转,实际的意义是调用类对接口实现类的依赖,反转给第三方的容器管理,从而实现松散耦合: ioc的实现方式有三种,属性注入,构造函数注入,接 ...

  7. spring笔记4 spring MVC的基础知识4

    //todo 5,spring MVC的本地化解析,文件上传,静态资源处理,拦截器,异常处理等 spring MVC 默认使用AcceptHeaderLocalResolver,根据报文头的Accep ...

  8. spring笔记2 spring MVC的基础知识2

    2,spring MVC的注解驱动控制器,rest风格的支持 作为spring mvc的明星级别的功能,无疑是使得自己的code比较优雅的秘密武器: @RequestMapping处理用户的请求,下面 ...

  9. spring笔记1 spring MVC的基础知识1

    1,spring MVC的流程 优秀的展现层框架-Spring MVC,它最出彩的地方是注解驱动和支持REST风格的url.   流程编号 完成的主要任务 补充 1 用户访问web页面,发送一个htt ...

随机推荐

  1. 加载CDN加速服务地址

    Jquery是个非常流行的JS前端框架,在很多网站都能看到它的身影.很多网站都喜欢采用一些Jquery CDN加速服务,这样网站加载jquery会更快.之前火端网络的一些网站都是使用Google的jq ...

  2. CH5105 Cookies【贪心】【线性dp】

    5105 Cookies 0x50「动态规划」例题 描述 圣诞老人共有M个饼干,准备全部分给N个孩子.每个孩子有一个贪婪度,第 i 个孩子的贪婪度为 g[i].如果有 a[i] 个孩子拿到的饼干数比第 ...

  3. API网关+Kubernetes集群的架构替代了传统的Nginx(Ecs)+Tomcat(Ecs)

    API网关为K8s容器应用集群提供强大的接入能力_最佳实践_API 网关-阿里云 https://help.aliyun.com/document_detail/71623.html 在最后一节,我们 ...

  4. Python中的Numpy

    引用Numpy import numpy as np 生成随机数据 # 200支股票 stock_cnt = 200 # 504个交易日 view_days = 504 # 生成服从正态分布:均值期望 ...

  5. 如何删除Docker中的镜像相关

    1.正常情况下 1.停止所有的container,这样才能够删除其中的images: docker stop $(docker ps -a -q) 如果想要删除所有container的话再加一个指令: ...

  6. shell_01

    定义变量: name='qwer' 不解析任何字符 name="qwer" 会解析$和\特殊字符 name1=123;name2=456 定义多个变量 now_date=`date ...

  7. java爬取网页内容 简单例子(1)——使用正则表达式

    [本文介绍] 爬取别人网页上的内容,听上似乎很有趣的样子,只要几步,就可以获取到力所不能及的东西,例如呢?例如天气预报,总不能自己拿着仪器去测吧!当然,要获取天气预报还是用webService好.这里 ...

  8. 前端 html body 内标签之input

    可以做登录页面 text是文本输入框 <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  9. 本书版权输出到台湾地区,《深入理解Android内核设计思想》诚挚感谢大家一直以来的支持!

  10. vs2010 重新配置帮助文档

    1.VS2010帮助文件不支持重新配置,这个时候打开C:\Program Files\Microsoft Help Viewer\1.0目录,找到“HelpLibManager.exe.config” ...