Spring简介 - 预习的自我整理

1. What's Spring?

Spring是一个从实际开发中抽取出来的框架,完成了大量开发中的通用步骤,留给开发者仅仅是与特定应用相关的部分,从而提高了企业应用开发的效率。

Spring为企业应用的开发提供了一个轻量级的解决方案,包括:基于依赖注入的核心机制等等。

Spring贯穿表现层、业务层、持久层。

2. Spring的特点

1)低侵入式设计,代码的污染极低;

2)独立于各种应用服务器;

3)Spring的DI容器降低了业务对象替换的复杂性,提高了组件之间的解耦;

4)Spring的AOP (Aspect Oriented Programming,面向方面编程)支持允许将一些通用任务如安全、事务等进行集中式处理,从而提供更好的复用;

5)Spring的ORM和DAO提供了与第三方持久层框架的良好结合,简化底层数据库访问;

6)Spring的高度开放,是开发者可以自己选用Spring框架的部分或者全部。

3. Spring框架结构

Spring框架包含大概20个模型,这些模型可以被分组为Core Container(Spring核心容器)、Data Access/Integration、Web、AOP、Instrumentation和Test,如上图显示。

Core Container提供了框架的基本部件,包括IoC,即DI特性。

IoC:控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转还有一个名字叫做依赖注入(Dependency Injection)。简称DI。

IoC is named by Johnson and DI is named by Marine Fowler.

不管是依赖注入还是控制反转,其含义完全相同:当某个Java实例(调用者)需要另一个Java实例(被调用这)时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。然而在依赖注入的模式下,创建被调用者的工作不再由调用者来完成,因此成为控制反转;创建被调用者实例的工作通常有Spring容器完成,然后注入调用者,所以称为依赖注入。

举个例子:

①原始石器时代

在原始石器时代,需要工具的人只能去自己制造工具,对应Java程序中的情况为:调用者通过new关键字调用构造器创建一个被调用者。

②工业时代

在工业时代,社会有了分工,需要工具的仅仅需要购买工厂中生产的即可,对Java程序中的情况为:调用者通过简单工厂设计模式,只需定位工厂,无须管理被调用者的具体实现。也即面向接口编程。

③共产主义社会

调用者“坐等”社会提供自己需要的被调用者即可。即等待Spring依赖注入。此时,实例之间的依赖关系有IoC容器负责管理。

4. 两种依赖注入方式

依赖入住通常有两种方式:

①投值注入:IoC容器使用属性的setter方法来注入被依赖的实例

②构造注入:IoC容器使用构造器来注入被依赖的实例。

举例说明:

public interface Person{
//定义一个使用斧子的方法
public void useAxe();
} public interface Axe{
//Axe接口里有个砍的方法
public String chop();
} //Spring推荐面向接口编程,这样可以更好的让规范和实现分离,从而提供更好的解耦。

下面是Person类的实现

public class Chinese implements Person
{
private Axe axe;
//设值注入所需的setter方法
public void setAxe(Axe axe)
{
this.axe = axe;
}
//实现Person接口的useAxe方法
public void useAxe()
{
//调用axe的chop()方法,
//表明Person对象依赖于axe对象
System.out.println(axe.chop());
}
}

上面的Chinese类并不知道它要调用的axe示例在哪里,也不知道axe实例是如何实现的,它是需要调用一个axe实例,这个axe实例将由Spring容器负责注入。

下面是Axe的实现类:StoneAxe

public class StoneAxe implements Axe
{
public String chop()
{
return "石斧砍柴好慢";
}
}

当目前为止,程序依然不知道Chinese类和哪个Axe实例耦合,Spring当然也不知道,实际上,Spring需要使用XML配置文件来制定实例之间的依赖关系。

<?xml version="1.0" encoding="UTF-8"?>
<!-- Spring配置文件的根元素,使用spring-beans-3.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 配置chinese实例,其实现类是Chinese -->
<bean id="chinese" class="com.zf.service.impl.Chinese">
<!-- 将stoneAxe注入给axe属性 -->
<property name="axe" ref="stoneAxe"/>
</bean>
<!-- 配置stoneAxe实例,其实现类是StoneAxe -->
<bean id="stoneAxe" class="com.zf.service.impl.StoneAxe"/>
</beans>

在配置文件,Spring配置Bean实例通常会制定两个属性:

①id:指定该Bean的唯一标识,程序通过id属性值来访问该Bean实例;

②class:指定该Bean的实现类,此处不可再用接口,必须使用实现类,Spring会使用XML解析器读取该属性值,并利用反射来创建该实现类的实例。

下面是主程序,简单获取Person实例,并调用该实例的userAxe方法

public class BeanTest
{
public static void main(String[] args)throws Exception
{
//创建Spring容器
ApplicationContext ctx = new
ClassPathXmlApplicationContext("bean.xml");
//获取chinese 实例
Person p = ctx.getBean("chinese" , Person.class);
//调用useAxe()方法
p.useAxe();
}
}

上面程序的两行代码实现了创建Spring容器,并通过Spring实例来获取chinese实例。执行上面程序,就会看到控制台输出

石斧砍柴好慢

从上面的示例中可以看出,依赖注入以配置文件管理Bean实例之间的耦合,让Bean实例之间的耦合从代码层次分离出来。总结一句话:依赖注入是一种优秀的解耦方式。同时,我们还不难发现,Sping IoC容器的三个基本特点

①应用程序的各组件面向接口变成;

②应用程序的各组件不再由程序主动生产,而是由Sping容器来负责生产并初始化;

③Sping采用配置文件,或者Annotation来管理Bean的实现类、依赖关系;Spring容器则根据配置文件,利用反射来创建实例,并为之注入依赖关系。

//-----------------------------2013-11-07 添加 -----------------------------------

昨晚预习中提到的例子,是通过setter方法为目标Bean注入依赖关系的方式,即投值注入。下面用构造注入的方式,实现上面的例子。所谓的构造注入,在构造实例时就已经为其完成了依赖关系的初始化。

对上面的Chinese类做简单的修改:

 public class Chinese implements Person{
private Axe axe;
//默认的构造器
public Chinese(){
}
//构造注入所需的带参数的构造器
public Chinese(Axe axe){
this.axe = axe;
}
//实现Person接口的useAxe方法
public void useAxe(){
//调用axe的chop()方法
//表明Person对象依赖于axe对象
System.out.println(axe.chop());
}
}

此时,并未为Chinese类的axe属性提供setter方法,而是通过一个带有axe参数的构造器,Spring为chniese注入所以来的Bean实例。

构造注入的配置文件也需要进行适当的修改,为了使用构造注入,使用<constructor-arg.../>元素指定构造器的参数。修改之后的配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Spring配置文件的根元素,使用spring-beans-3.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 配置chinese实例,其实现类是Chinese -->
<bean id="chinese" class="com.zf.service.impl.Chinese">
<!-- 使用构造注入,为chinese实例注入stoneAxe实例 -->
<constructor-arg ref="stoneAxe"/>
</bean>
<!-- 配置stoneAxe实例,其实现类是StoneAxe -->
<bean id="stoneAxe" class="com.zf.service.impl.StoneAxe"/>
</beans>

<constructor-arg.../>元素指定了一个构造器参数,该参数的类型是Axe,这指定Spring调用Chinese类里带有一个Axe参数的构造器来创建chinese实例,因为有参数的构造器创建实例,所以当Bean实例被创建完成之后,该Bean的依赖关系已经设置完成,这就是构造注入。

Preview of Spring-framework :Spring框架的预习和自我整理的更多相关文章

  1. Spring Framework(框架)整体架构 变迁

    Spring Framework(框架)整体架构 2018年04月24日 11:16:41 阅读数:1444 标签: Spring框架架构 更多 个人分类: Spring框架   版权声明:本文为博主 ...

  2. 【架构】spring framework核心框架体系结构

    Spring官方文档,用的版本为4.3.11版本. 一.引用官方文档 2.2.1核心集装箱 所述核心容器由以下部分组成spring-core, spring-beans,spring-context, ...

  3. spring framework核心框架体系结构

    很实用,稀里糊涂的我算是看清了. 很多人都在用spring开发java项目,但是配置maven依赖的时候并不能明确要配置哪些spring的jar,经常是胡乱添加一堆,编译或运行报错就继续配置jar依赖 ...

  4. spring framework核心框架体系结构(转载)

    作者:Dreawer 很多人都在用spring开发java项目,但是配置maven依赖的时候并不能明确要配置哪些spring的jar,经常是胡乱添加一堆,编译或运行报错就继续配置jar依赖,导致spr ...

  5. Difference between BeanFactory and FactoryBean in Spring Framework (Spring BeanFactory与Factory区别)

    参见原文:http://www.geekabyte.io/2014/11/difference-between-beanfactory-and.html geekAbyte Codes and Ran ...

  6. 1.Spring Framework 5.0 入门篇

    1.为什么学习Spring? 随着对Java EE的不断接触和理解,你会发现Spring  在各个企业和项目中发挥着越来越重要的作用.掌握Spring 已成为我们IT行业生存必学的本领之一. Spri ...

  7. Benefits of Using the Spring Framework Dependency Injection 依赖注入 控制反转

    小结: 1. Dependency Injection is merely one concrete example of Inversion of Control. 依赖注入是仅仅是控制反转的一个具 ...

  8. Spring Framework 5.0.0.M3中文文档 翻译记录 Part I. Spring框架概览1-2.2

    Part I. Spring框架概览 The Spring Framework is a lightweight solution and a potential one-stop-shop for ...

  9. JavaIOC框架篇之Spring Framework

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

随机推荐

  1. MFC 直线 虚线 折线 圆 椭圆 矩形 弧形

    ****Dlg.h头文件加入: //为project加入画笔.点变量数组 public: CPen m_pen[5]; CPoint m_point[5]; public: void DrawLine ...

  2. jquery实现鼠标焦点十字效果

    系统开发时很多地方需要有焦点效果,例如:鼠标点击聚焦,地图定位,在图片上突出显示,焦点定位页面元素. 本小功能通过jquery和graphics二次开发,实现通过鼠标点击页面任何区域,聚焦当前点击位置 ...

  3. EndNote是一款着名的参考文献管理软件

    EndNote是一款着名的参考文献管理软件,我们可以通过该软件创建个人参考文献库,此外对公司DCC.法务和专 利部门十分的有用,甚至对我们写SOP 也有些帮忙,并且该软件可以在其中加入文本.图像.表格 ...

  4. Oracle百问百答(一)

    Oracle百问百答(一) 01.如何查看oracle的版本信息? 02.如何查看系统被锁的事务信息? 03.怎么获取有哪些用户在使用数据库? 04. 数据表中的字段最大数是多少? 表或视图中的最大列 ...

  5. SQL SERVER CHARINDEX函数

    CHARINDEX函数经常常使用来在一段字符中搜索字符或者字符串.假设被搜索的字符中包括有要搜索的字符,那么这个函数返回一个非零的整数,这个整数是要搜索的字符在被搜索的字符中的開始位数.即CHARIN ...

  6. 搭建自己的XenServer+CloudStack云平台,提供IaaS服务(一)环境搭建

    目标 搭建一个完整的基于XenServer和CloudStack的虚拟化平台,提供IaaS服务. 搭建三台安装了XenServer的服务器 搭建一台安装了CloudStack的服务器用以管理云平台 搭 ...

  7. DL动态载入框架技术文档

    DL动态载入框架技术文档 DL技术交流群:215680213 1. Android apk动态载入机制的研究 2. Android apk动态载入机制的研究(二):资源载入和activity生命周期管 ...

  8. Android 调用谷歌语音识别

    調用谷歌语音识别其实很简单,直接利用 intent 跳转到手机里面的谷歌搜索 代码也很简单,直接调用方法 startVoiceRecognitionActivity() 如果大家手机里面没有谷歌搜索, ...

  9. ad nbetmk57

    http://www.zhihu.com/collection/24337307 http://www.zhihu.com/collection/24337259 http://www.zhihu.c ...

  10. IOS获取来电去电来电归属系统通知达到效果(一)

    这里的原理是获得到呼叫系统通知,然后根据本地呼叫电话号码,相应的电话联系. 一世.   来电显示是不是在地址簿中的联系人, 这是当第一个加入一个临时的联系人在您的电话簿(它是创建一个新的接触,并保存相 ...