spring快速上手

1.Spring概述

Spring是一个开源框架,它能够降低开发企业应用程序的复杂性,可以使用Spring替代EJB开发企业级应用,而不用担心工作量太大、开发进度难以控制和复杂的测试过程等问题。Spring简化了企业级应用的开发,降低了开发成本,能够整合各种流行框架。它以IoC(控制反转)和AOP(面向切面编程)两种先进的技术为基础,完美的简化了企业级开发的复杂度。

1.1初识Spring

Spring框架主要由七大模块组成,他提供了企业级开发需要的所有功能,而且每个模块都可以单独使用,也可以和其他莫款组合使用,灵活且方便的部署可以使开发的程序更加简洁。

Spring核心模块
  1. 核心模块:Spring Core模块是Spring的核心容器,他实现了IoC模式,提供了Spring框架的基础功能,在模块中包含最重要的BeanFactory类是Spring的核心类,负责对JavaBean的配置和管理。他采用了Factory模式实现了IoC容器,即依赖注入
    2.Context模块:Spring Context模块继承BeanFactory(或者说是Spring核心)类,并且添加了事件处理、国际化、资源装载、透明装载以及数据校验等功能。他还提供了框架式的Bean的访问方式和很多企业级的功能,如JNDI访问、支持EJB、远程调用、集成模板框架、E-mail和定时任务调度等。
    3.AOP模块:Spring集成了所有的AOP功能。通过事务管理可以使任意Spring管理的对象AOP化。Spring提供了用标准Java语言编写的AOP框架,他的大部分内容都是根据AOP联盟的API开发的,他使应用程序抛开EJB的复杂性,但拥有传统EJB的关键功能。
    4.DAO模块:提供JDBC的抽象层,简化了数据库厂商的异常错误,大幅度减少代码的编写,并且提供了对声明式事务和编程式事务的支持。
    5.ORM模块:提供对现有ORM框架的支持,各种流行的ORM框架已经做的非常成熟了,所以没有必要开发新的ORM工具,但是他对Hibernate提供了完美的整合功能,同时也支持其他的ORM工具。
    6.WEB模块:建立在Spring Context基础之上,他还提供了Servlet监听器的Context和Web应用的上下文,对现有的Web框架提供集成。
    7.MVC模块:建立在Spring的核心功能之上,这使得他能拥有Spring框架的所有特性,能够适应多种视图,模块技术、国际化和验证服务,实现控制逻辑和业务逻辑清晰的分离。

2.准备

在开始进行开发之前,我们首先需要获得Spring工具包、commons-logging包。并且我们可以简单的查看一下他们的官方文档。之后,我们就能正常的开展下一步了。

3.第一个Spring实例

笔者在介绍的过程中,先给出一个完整的spring简单实例,可以大体上的了解一些Spring的开发过程,然后,我们再进行介绍里面的原理。
步骤:

  • 首先,我们在eclipse中建立一个JavaProject,并创建SpringDemo工程
  • 其次,在SpringDemo工程的src目录下创建com.bean包,在该包下分别创建Person.java、ChineseImpl.java和AmercianImpl.java 3个文件,编辑代码如下:
    代码清单1:person.java
package com.bean;
public interface Person {
    public void speak();
}

代码清单2:ChineseImpl.java

package com.bean;
public class ChineseImpl implements Person {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public void speak() {
        // TODO Auto-generated method stub
        System.out.println("我是中国人,我的名字是" + this.name + ",                   我今年" + this.age + "岁!");
    }
}

代码清单3:AmercianImpl.java

package com.bean;

public class AmercianImpl implements Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public void speak() {
        // TODO Auto-generated method stub
        System.out.println("我是美国人,我的名字是" + this.name + ",我今年" + this.age + "岁!");
    }

}

上面的代码中,我们定义了一个person接口,通过该接口规定了Person的规范,并且进行了两个实例,在我们进行代码的编写的过程中,我们可以使用接口与实现的分离,这样可以大大的增大代码的重用性以及复用性。
那么,问题来了?在Spring中显然应该让Spring容器来负责调用这两个类的Setter方法以设置实例中属性的值。这在Spring中是如何实现的呢?根据我们在学习Struts2以及Hibernate中的知识我们可以想到应该使用XML配置文件来实现。下面我们在Spring中使用配置文件applicationContext.xml来告知容器应该如何对AmericanImpl和ChineseImpl进行配置

  • 在src目录下创建applicationContext.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    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">

    <!-- 配置chinese实例,其实现类com.bean.ChineseImpl -->
    <bean id="chinese" class="com.bean.ChineseImpl">
        <!-- 将值“小明”注入给name属性 -->
        <property name="name">
            <value>小明</value>
        </property>
        <!-- 将值10注入给age属性 -->
        <property name="age">
            <value>10</value>
        </property>
    </bean>
    
    <bean id="amercian" class="com.bean.AmercianImpl">
        <!-- 将值"Tom”注入给name属性 -->
        <property name="name">
            <value>Tom</value>
        </property>
        <!-- 将值15注入给age属性 -->
        <property name="age">
            <value>15</value>
        </property>
    </bean>
</beans>

上面的XML文件在Spring容器中声明了一个ChineseImpl实例chinese和一个AmercianImpl实例amercian并为其中的set方法进行赋值。

  • Test类
    在src目录下创建com.spring包,在该包下创建Test.java文件。
package com.spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.bean.Person;

public class Test {
    public static void main(String[] args) {
        /*创建spring容器*/
        //当然这里还有beanFactory接口,也能实现这种功能,ApplicationContext增加了更多的企业级应用
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        /*获取ChineseImpl实例的引用*/
        Person person = (Person) context.getBean("chinese");
        //调用ChineseImpl实例的speak()方法
        person.speak();
        person = (Person) context.getBean("amercian");
        person.speak();
    }
}

程序中。我们需要注意的是spring容器的创建,这样就能将applicationContext.xml文件加载进容器中,并且进行实例化,以及调用set方法进行赋值,这样就能为其中实现一个最基本的Spring操作应用了。
**
ChineseImpl和AmericanImpl类的实例并不是main()方法来创建的,而是通过将applicationContext.xml文件加载后,交付给Spring框架,当执行getBean()方法时,就可以得到要创建实例的引用,因此,调用者并没有创建实例,而是通过Spring框架将创建好的实例注入调用者中,这实际上就是Spring的核心控制:依赖注入(DI),而Spring强大的地方就在于他可以使用依赖注入将一个Bean注入到另一个Bean中。
**

4. Spring的IoC容器

Spring的IoC容器是一个提供IoC支持的轻量级容器,IoC容器为管理对象之间的依赖关系提供了基础功能。Spring为我们提供两种容器:BeanFactory和ApplicationContext。
BeanFactory在Spring中的作用至关重要,他实际上是一个用于配置和管理Java类的内部接口。顾名思义,BeanFactory就是一个管理Bean的工厂,它负责初始化各种Bean并调用他们的生命周期方法。
当然,在进行XML文件的配置的时候,我们也可以选择使用annotation(注解)来进行编写里面的配置关系,而且感觉上比使用XML文件来的更加的直接方便。

5.Spring框架的优势

  • Spring框架能够有效的组织中间层对象,Spring框架能够有效的将现有的框架如Struts和Hibernate框架组织起来。
  • Spring框架实现了真正意义上的面向接口编程,可实现组件之间的高度解耦,而面向接口编程是一种良好的编程习惯。
  • Spring所秉承的设计思想就是让使用Spring创建的那些应用都尽可能少地依赖于它的APIs。在Spring应用中的大多数业务对象都不依赖于Spring。
  • 使用Spring构建的应用程序易于进行单元测试
  • Spring提高了代码的可重用性,它尽可能避免在程序中使用硬解码。Spring可以将应用程序中的某些代码抽象出来,然后在其他程序中使用这些代码。
  • Spring为数据存取提供了一个一致的框架,简化了底层数据库的访问方式。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容