Spring框架Spring概述及基本应用

Posted 叁 柒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring框架Spring概述及基本应用相关的知识,希望对你有一定的参考价值。

Spring的基本应用

1. Spring 概述

1.1 什么是Spring

Spring是由Rod Johnson组织和开发的一个分层的轻量级框架,它以IoC(控制反转),AOP(面向切面编程)为内核,使用JavaBean来完成工作。

Spring 致力于JavaEE应用各层的解决方案,在表现层它提供了Spring MVC以及与Structs框架的整合功能;在业务逻辑层可以管理事务,记录日志等;在持久层可以整合MyBatis,Hibernate,JdbcTemplate等技术。因此可以说Spring是企业应用开发很好“一战式”选择。虽然Spring贯穿于表现层,业务逻辑层和持久层,但它并不想取代那些已有的框架,而是以高度的开放性与他们进行无缝整合。

1.2 Spring 框架的优点

Spring具有简单、可测试和松耦合等特点,从这个角度出发,Spring不仅可以用于服务器端开发,也可以应用于任何Java应用的开发中。关于 Spring 框架优点的忌结,具体如下。

  • 非侵入式设计
    Spring是一种非侵入式( non-invasive )框架,它可以使应用程序代码对框架的依赖最小化。
  • 方便解耦、简化开发
    Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护工作都交给Spring容器管理,大大地降低了组件之间的耦合性。
  • 支持 AOP
    Spring提供了对 AOP的支持,它允许将一些通用任务,如安全、事务、日志等进行集中式处理,从而提高了程序的复用性。
  • 支持声明式事务处理
    只需要通过配置就可以完成对事务的管理,而无须手动编程。
  • 方便程序的测试
    Spring提供了对Junit4 的支持,可以通过注解方便地测试Spring程序。
  • 方便集成各种优秀框架
    Spring 不排斥各种优秀的开源框架,其内部提供了对各种伏委框架(加Struts. Hibernate、MyBatis、Quartz等)的直接支持。
  • 降低Java EE API的使用难度
    Spring对 Java EE 开发中非常难用的一些API(如JDBC. lavaMail笑)却提供了封装,使这些 API 应用难度大大降低。

1.3 Spring的体系结构

Spring框架采用的是分层架构,它一系列的功能要素被分成20个模块,主要包括以下部分

2. Spring的核心容器

2.1 BeanFactory

BeanFactory由org.springframework.beans.factory.BeanFactory接口定义,是基础类型的IoC容器,就作用来说,BeanFactory就是一个管理Bean的工厂,它主要负责初始化Bean,并调用它们的生命周期方法。

2.2 ApplicationContext

ApplicationContextBeanFactory的子接口,也被称为应用上下文,是另一种常用的Spring容器。

创建ApplicationContext接口实例,通常有两种方法:

  1. 通过ClassPathXmlApplicationContext创建

    ClassPathXmlApplicationContext会从指定的类路径(相对路径)中去找XML配置文件,并装载完成

    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String config);
    
  2. 通过FileSystemXmlApplicationContext创建

    FileSystemXmlApplicationContext会从系统文件路径(绝对路径)去找XML配置文件,并装载完成

    ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String config);
    

3. Spring的入门程序

3.1 在pom下利用maven导入Spring所需要的jar包

<dependencies>
    <!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.1</version>
    </dependency>
    <!-- junit测试 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

3.2 简单搭建起demo结构

注意检查一下Spring的四个jar包是否导入成功

3.3 编写一个简单的JavaBean

package com.atguigu.spring.pojo;


public class HelloWorld 

    public void sayHello()
        System.out.println("hello,spring");
    


3.4 将JavaBean加入到Ioc容器的管理中

编写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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--
        bean:配置一个bean对象,将对象交给IOC容器管理
        属性:
        id:bean的唯一标识,不能重复
        class:设置bean对象所对应的类型
    -->
    <bean id="helloworld" class="com.atguigu.spring.pojo.HelloWorld"></bean>

</beans>

3.5 创建test方法

这里关键在于Ioc容器的获取

package com.atguigu.spring.test;

import com.atguigu.spring.pojo.HelloWorld;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class HelloWorldTest 

    @Test
    public void test()
        //获取IOC容器
        ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取IOC容器中的bean
        HelloWorld helloworld = (HelloWorld) ioc.getBean("helloworld");
        helloworld.sayHello();
    


3.6 启动测试

Spring框架由来及IOC的基本概念

一、Spring框架概述

  Spring框架所倡导的基于pojo(Plain Old Java Object,简单java对象)的轻量级开发理念,就是从实际出发,立足于最基础的pojo。为了能够让这些基础的pojo构建出健壮而强大的应用,Spring框架就好像那包裹地球的大气层一样,为构筑应用的pojo提供了各种服务,进而创造了一套适应用pojo进行轻量级开发的环境。

  从广义上讲,不管Spring框架自发布到现在经过了多少次的版本更迭(从1.X到2.0再到2.5),其本质是始终不变的,都是为了提供各种服务,以帮助我们简化基于pojo的Java应用程序开发。Spring框架为pojo提供的各种服务共同组成了Spring的生命之树

       组成整个Spring框架的各种服务实现被划分到了多个相互独立却又相互依赖的模块当中。正如我们图中所见到的那样,这些模块组成了Spring生命之树的枝和干,说白了也就是它组成了Spring框架的核心骨架。抓住了这幅骨架,也就抓住了Spring框架的学习主线。

  整个Spring框架构建在Core核心模块之上,它是整个框架的基础。在该模块中,Spring为我们提供了一个ioc容器(Ioc Container)实现,用于帮助我们以依赖注入的方式管理对象之间的依赖关系。对Spring的ioc容器的介绍将成为我们此次Spring之旅的第一站。除此之外,Core核心模块中还包括框架内部使用的各种工具类(如果愿意,我们也可以在框架之外使用),比如Spring的基础io工具类等,这些基础工具类我们也会在合适的地方介绍。

  为了简化各种JavaEE服务(像JNDI JMS以及JavaMail等)的使用,Srping框架为我们提供了针对这些JavaEE 服务的继承服务。在Spring的帮助下,这些JavaEE服务现在都变得不再繁琐难用。因为相关的JavaEE服务较多,我们将会选择合适的几种介绍Spring框架给予它们支持。随着航空航天技术的发展,我们现在可以从地球上发送飞船去访问其它星球,使用Spring框架构建基于pojo的应用程序如果也需要远程访问或者公开一些服务的话,Spring的Remoting框架将帮助它完成这一使命。Spring的Remoting框架和Spring对其他JavaEE服务的集成将分别在不同的章节中介绍。

  以上就是对整个Spring框架的总体介绍。在开始愉快的Spring旅程之前,我想带大家先逛一逛“Spring大观园“,这样大家就会发现即将开始的Spring之旅更加值得期待。

注意:不要将Spring看作是一个ioc容器,也不要只将Spring与AOP挂钩。Spring提供的远比这些东西要多得多。Spring不仅仅是一个简化JavaEE开发的轻量级框架,它更应该是一个简化任何Java应用的开发框架。如果你愿意,甚至可以在Java的三个平台上(J2SE、J2EE、J2ME)应用Spring框架。即使当前的Spring框架还不支持相应平台或者相应场景的应用开发,但是只要你掌握了Spring的理念和方法,同样可以让新的“Spring”在相应的场景中发挥作用。

二、Spring大观园

  在1995年Java作为一门计算机语言诞生时,有谁能够想到,短短10多年间,它已经发展成为一个强大的开发平台?对于Spring框架来说,历史又在重演,而且几乎毫无悬念。

  Spring大观园中有一颗参天大树,它得以茁壮成长,主要因为它有一个好的根基,那就是Spring框架。在Spring框架的基础上,Spring家族人丁开始兴旺,不断涌现出一个又一个引入注目的家族成员

三、IOC的基本概念

  IOC是随着近年来轻量级容器(LightweughtContainer)的兴起而逐渐被很多人提起的一个名词,它的全称为Inversion of Control,中文通常翻译为“控制反转”,它还有一个别名叫做依赖注入(Dependency Injection)。好莱坞原则“Don\'t call us,we will call you”恰如其分的表达了“反转”的意味,是用来形容IOC最多的一句话。那么,为什么需要IOC?IOC的具体意义是什么?它到底有什么独到之处?让为破门带着这些疑问开始我们的IOC之旅吧。

  实际上,IOC就是为了帮助我们避免之前的“大费周章”,而提供了更加轻松简洁的方式。它的反转,就反转在让你从原来的事必躬亲,转变为现在的享受服务。你想啊,原来还得鞍马劳顿,是什么东西都得自己去拿。现在是用什么,让别人直接送过来就成。所以,简单点说,IOC的理念就是,让别人为你服务,下图也就是让IOC Service Provider来为你服务!

  通常情况下,被注入对象会直接依赖于被依赖对象。但是,在IOC的场景中,二者之间通过IOC Service Provider 来打交道,所有的被注入对象和依赖对象现在由IOC Service Provider统一管理。被注入对象需要什么,直接跟IOC Service Provider招呼一声,后者就会把相应的被依赖对象注入到被关注对象中,从而达到IOC Service Provider为被注入对象服务的目的。IOC Service Provider在这里就是通常的IOC容器多充当的角色。从被注入对象的角度看,与之前直接寻求依赖对象相比,依赖对象的取得方式发生了反转,控制也从被注入对象转到了IOC Service Provider那里。

  其实IOC就这么简单!原来是需要什么东西自己去拿,现在是需要什么东西就让别人送过来。下图形象的说明了使用IOC模式前后的差别。

构造方法注入

  顾名思义,构造方法注入,就是被注入对象可以通过在其构造方法中声明依赖对象的参数列表,让外部(通常是IOC容器)知道它需要哪些依赖对象。

 构造方法定义

      Ioc Service Provider 会检查被注入对象的构造方法,取得它所需要的依赖对象列表,进而为其注入相应的对象。同一个对象是不可能被构造两次的,因此,被注入对象的构造乃至其整个生命周期,应该是由IOC Service Provider来管理的。

  构造方法注入方式比较直观,对象被构造完成后,即进入就绪状态,可以马上使用。这就好比你刚进酒吧的门,服务生已经将你喜欢的啤酒摆上了桌面一样。坐下就可马上享受一份清凉与惬意。

setter方法注入

  对于JavaBean对象来说,通常会通过setxxx()和getxxx()方法来访问对应属性。这些setxxx()方法统称为setter方法,getxxx()当然就称为getter方法。通过setter方法,可以更改相应的对象属性,通过getter方法,可以获得相应属性的状态。所以,当前对象只要为其依赖对象所对应的属性添加setter方法,就可以通过setter方法将相应的依赖对象设置到被注入对象中。

 

  这样,外界就可以通过调用setNewsListener和setNewPersistener方法为FXNewsProvider对象注入所依赖对象了。

  setter方法注入虽不像构造方法注入那样,让对象构造完成后即可使用,但相对说更宽松一些,可以在对象构造完成后再注入。这就好比你可以到酒吧坐下后再决定要点什么。随意性比较强。

接口注入

  相对于前两种注入方式来说,接口注入没有那么简单明了。被注入对象如果想要IOC Service Provider为其注入依赖对象,就必须实现某个接口。这和接口提供一个方法,用来为其注入依赖对象。IOC Service Provider最终通过这些接口来了解应该为被注入对象注入什么依赖对象,下图就演示了如何使用接口注入为FXNewsProvider注入依赖对象

  接口注入方式最早并且使用最多的是在一个叫做Avaln的项目中,相对于前两种依赖注入方式,接口注入比较死板和繁琐。如果需要注入依赖对象,被注入对象就必须声明和实现另外的接口。

 

以上是关于Spring框架Spring概述及基本应用的主要内容,如果未能解决你的问题,请参考以下文章

Spring事务管理实现原理及MySQL InnoBD引擎行锁概述

spring

Spring 概述及 HelloWorld

Spring--概述及IOC理论推导

Spring 概述

Spring概述