Spring基本应用

一.Spring概述:

1.1:Spring的额概念
Spring是由Rod Johnson组织和开发的一个分成的Java一站式轻量级框架,它以IoC(控制反转)和AOP(面向切面编程)为内核,在Sprig中,它会认为一切Java类都是资源,而资源都是Bean,容纳这些Bean的是Spring所提供的IoC容器,所以Spring是一种基于Bean的编程,它深刻的改变着Java开发世界。

1.2:Spring的优点
Spring作为实现JavaEE的一个全方位应用程序框架,具有一下几个特点:

  • 非侵入式
  • 容器
  • IoC
  • 依赖注入
  • AOP

1.3:Spring的体系结构
Spring框架(Spring Framework)不断在发展和完善,目前Spring框架由20多个功能模块构成。
Spring基本应用_第1张图片

1.4:Spring的下载和结构
组成Spring框架的每个模块(或组件)可以单独存在,或者与其他一个或多个模块联合实现。

  • Core Container,核心容器提供了Spring的基本功能,它主要由Beans模块,Core模块、Context模块和Spring EL模块组成。
  • Data Access/Integration,数据访问/继承层包括JDBC、ORM\OXM\JMS和Transactions模块。
  • Web,Web层包括webSocket\Serblrt\Web和Portlet模块。
  • 其他模块,Spring的其他模块还有AOP、Aspects、Instrumentation以及Test模块。

Spring的最新版本是5.0.4,本次的代码也是在基于该版本的Spring测试通过,建议也下载该版本。
Spring是一个独立的框架,它不需要依赖于任何Web服务器或容器,既可在独立的Java SE项目中使用,当然也可在Java Web项目中使用。下载Spring框架可按如下步骤进行:

二.搭建Spring的入门程序

(1)登录https://repo.spring.io/webapp/#/artifacts/
browse/tree/General/libs-release-local/ 或者登录http://repo.springsource.org/libs-release-local/,依次找到org–>springframework–>spring的路径进入,既可看到Spring框架各版本的压缩包的下载链接,这里我们选择5.0.4 RELEASE的版本,点击spring-framework-5.0.4.RELEASE-dist.zip下载该文件。
(2)下载完成后,将压缩文件解压缩后得到一个名为spring-framework-5.0.4.RELEASE的文件夹,目录结构如图所示。
Spring基本应用_第2张图片
(3)在libs目录中,有四个Spring的基础包,分别对应Spring核心容器的四个模块,分别是spring-core-5.0.4.RELEASE.jar、spring-beans-5.0.4.RELEASE.jar、spring-context-5.0.4.RELEASE.jar、spring-expression-5.0.4.RELEASE.jar。
(4)除此之外,使用Spring开发,除使用自带的jar包外,还要依赖于commons-logging的jar包文件,可通过http://commons.apache.org/proper/commons-logging/download_logging.cgi 网址下载。下载完成得到一个commons-logging-1.2-bin.zip的压缩包。将该压缩包解压后,即可找到commons-logging-1.2.jar。
下面通过示例程序来演示Spring框架的简单应用,只用到了 Spring框架而没有使用其它技术,实现步骤如下所示:
(1) 在Eclipse中,创建一个名为“spring-1”的Java项目。
(2) 复制前面叙述的四个Spring的基础包。
(3) 复制日志包commons-logging-1.2.jar。
(4) 将jar包添加到项目的构建路径中。
(5) 在项目中创建com.ssm包,并创建HelloSpring类。
(6) 在项目src目录下创建applicationContext.xml文件。
(7) 在com.ssm包中创建测试类TestHelloSpring。
(8)在Idea中创建spring项目不需要导入基础包
HelloSpring:

package com.ssm;

public class HelloSpring {
    private String username;

    public void setUserName(String username) {
        this.username=username;
    }

    public void show() {
        System.out.println(username+":欢迎来学习Java spring框架");
    }

}

applicationContext.xml

"1.0" encoding="UTF-8"?>
"http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans

       http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--  配置一个bean,将指定类配置给Spring,让spring创建其对象的实例  -->
    "helloSpring" class="com.ssm.HelloSpring">
<!-- 给属性赋值-->
        "userName" value="温彬"></property>
    </bean>
    

TestHelloSpring

package com.ssm;

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

public class TextHelloSpring {
    public static void main(String[] args){
        //初始化spring容器,加载applicationcontext.xml配置
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        //通过容器获取配置中的helliSpring的实例
        HelloSpring helloSpring= (HelloSpring) context.getBean("helloSpring");
        helloSpring.show();
    }
}

在这里插入代码片## 三.Spring的核心机制:依赖注入/控制反转
3.1依赖注入的概念

  1. Spring的核心机制就是IoC(控制反转)容器,IoC的另外一个称呼是依赖注入(DI),只不过这两个称呼是从两个角度描述的同一个概念。通过依赖注入,Java EE应用中的各种组件不需要以硬编码的方法进行耦合,当一个Java实例需要其他Java实例时,系统自动提供需要的实例,无需程序显式获取。因此,依赖注入实现了组件之间的解耦
  2. 依赖注入和控制反转含义相同,当某个Java对象(调用者)需要调用另一个Java对象(被调用者,即被依赖对象)时,传统的方法是由调用者采用“new 被调用者”的方式来创建对象,这种方式会导致调用者和被调用者之间的耦合性增加,对项目的后期升级和维护不利
  3. 在使用Spring框架后,对象的实例不在由调用者来创建,而是由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用程序代码转移到了Spring容器,控制权发生了反转,这就是Spring的控制反转
  4. 从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,这就相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入
  5. Spring提倡面向接口的编程,依赖注入的基本思想是:明确地定义组件接口,独立开发各个组件,然后根据组件的依赖关系组装运行

3.2依赖注入的类型
(1)构造方法注入:
指Spring容器使用构造方法注入被依赖的实例,构造方法可以是有参数的或者是无参的。在大多数情况下,我们都是通过构造方法来创建类对象,Spring也可以采用反射的方式,通过使用带参数的构造方法来完成注入,每个参数代表着一个依赖,这就是构造方法注入的原理。这种注入方式,如果参数比较少,可读性还是不错的,但参数很多,那么这种构造方法就比较复杂了,这个时候应该考虑属性setter方法注入

package com.ssm.ectity;

public class AdminInfo {
    private int id;
    private String name;
    private String pwd;



    public void setId(int id) {
        this.id = id;
    }

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

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public AdminInfo(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }


    public AdminInfo(){

    }

    public void print(){
        System.out.println(id+" -- "+name+" -- "+pwd);
    }
}

向applicationContext.xml中添加:

"adminInfo" class="com.ssm.ectity.AdminInfo">
    "id" value="5"/>
    -arg name="name" value="admin"></constructor-arg>
    -arg name="pwd" value="120831"></constructor-arg>
</bean>

TestSpringConstructor测试类:

package com.ssm;

import com.ssm.ectity.AdminInfo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpringConstructor {
    public static void main(String[] args){
        //加载applicationContext.xml
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        //获取实例
//        AdminInfo adminInfo= (AdminInfo) context.getBean("adminInfo");
        AdminInfo adminInfo= (AdminInfo) context.getBean("admin");
        adminInfo.print();

    }
}

运行后控制台输出:
5–admin–120831
(2)属性setter方法注入
指Spring容器使用setter方法注入被依赖的值或对象,是常见的一种注入方式,这种注入方式具有高度灵活性。该方式要求Bean提供一个默认的构造方法,并为需要注入的属性提供对应的setter方法。Spring先调用Bean的默认构造方法实例化Bean,然后通过反射的方式调用setter方法注入属性值。这种方式是Spring最为主要的方式,在实际工作中使用广泛
示例:

<!--  p空间命名空间简化注入  -->
    "admin" class="com.ssm.ectity.AdminInfo" p:id="8"
    p:name="yzpc" p:pwd="120831"></bean>
package com.ssm.ectity;

public class AdminInfo {
    private int id;
    private String name;
    private String pwd;



    public void setId(int id) {
        this.id = id;
    }

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

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public AdminInfo(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }


    public AdminInfo(){

    }

    public void print(){
        System.out.println(id+" -- "+name+" -- "+pwd);
    }
}

3.3依赖注入的示例

源码地址

你可能感兴趣的:(Spring基本应用)