栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

【spring的使用方法】

Java 更新时间:发布时间: 百科书网 趣学号

文章目录
  • 一、Spring框架
    • (一)Spring官网
    • (二)Spring框架简介
    • (三)为什么要选择Spring?
      • 优点:
      • 好处:
  • 二、创建Spring应用程序 - 骑士完成任务
    • (一)创建Maven项目
    • (二)修改项目的`Maven`配置
    • (三)添加Spring依赖
    • (三)创建杀龙任务类
    • (四)创建勇敢骑士类
    • (五)采用传统方式让勇敢骑士完成杀龙任务
    • (六)采用Spring框架让勇敢骑士完成杀龙任务
      • 1、创建日志属性文件
      • 2、创建Spring配置文件
      • 3、在Spring配置文件里创建Bean
        • (1)创建杀龙任务Bean
        • (2)创建勇敢骑士Bean
      • 4、创建新勇敢骑士测试类
      • 5、创建两个勇敢骑士Bean
      • 6、修改新勇敢骑士测试类
    • (七)采用构造方法注入方式注入属性值
      • 1、创建救美任务类
      • 2、创建救美骑士类
      • 3、配置救美骑士Bean
      • 4、创建旧救美骑士测试类
      • 5、创建新救美骑士测试类

一、Spring框架 (一)Spring官网
  • 网址:https://spring.io

  • Spring Framework - https://spring.io/projects/spring-framework

  • 目前(2022-6-6)Spring Framework版本是5.3.20
(二)Spring框架简介
  1. Spring的英文翻译为春天,可以说是给Java程序员带来了春天,因为它极大的简化了开发。我得出一个公式:Spring = 春天 = Java程序员的春天 = 简化开发。最后的简化开发正是Spring框架带来的最大好处。

  2. Spring是一个开放源代码的设计层面框架,它是于2003 年兴起的一个轻量级的Java 开发框架。由Rod Johnson创建,其前身为Interface21框架,后改为了Spring并且正式发布。Spring是为了解决企业应用开发的复杂性而创建的。它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。Spring 的理念:不去重新发明轮子。其核心是控制反转(IOC)和面向切面(AOP)。

(三)为什么要选择Spring? 优点:
  1. 方便解耦,简化开发
    通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
  2. AOP编程的支持
    通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
  3. 声明事物的支持
    在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
  4. 方便程序的测试
    可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
  5. 方便集成各种优秀框架
    Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
  6. 降低Java EE API的使用难度
    Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
  7. Java 源码是经典学习范例
    Spring的源码设计精妙、结构清晰、匠心独用,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
好处:

在我们进入细节以前,我们可以看一下Spring可以给一个工程带来的一些好处:

  • Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EE特有APIs的framework,你会发现Spring关注了遗留下的问题。Spring能消除在许多工程上对Singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。
  • Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。倒置控制的使用(在下面讨论)帮助完成这种简化。
  • Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
  • Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
    使用Spring构建的应用程序易于单元测试。
  • Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
  • Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。
  • Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。
  • Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。
    总结起来,Spring有如下优点:
  1. 低侵入式设计,代码污染极低
  2. 独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺
  3. Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
  4. Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用
  5. Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问
  6. Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
二、创建Spring应用程序 - 骑士完成任务 (一)创建Maven项目
  • 这里博主使用的IDEA2022版本搭建的该工程,

  • 创建Maven项目 - SpringDemo,设置项目位置以及组ID

  • 单击【create】按钮,然后生成该项目

(二)修改项目的Maven配置
  • 先打开File -> Settings,进入IDEA的设置界面

  • 按照图片指示依次点击,配置Maven
(三)添加Spring依赖
  • 在Maven仓库里查找Spring框架(https://mvnrepository.com)

  • 查看Spring Core

  • 选择最新版本 - 5.3.20

  • 添加到pom.xml文件的元素里

  • 同理添加其他依赖



    4.0.0

    net.Lee.spring
    SprintDemo
    1.0-SNAPSHOT

    
        8
        8
    


    
        
        
            org.springframework
            spring-core
            5.3.20
        
        
        
            org.springframework
            spring-beans
            5.3.20
        
        
        
            org.springframework
            spring-context
            5.3.20
        
        
        
            org.springframework
            spring-web
            5.3.20
        
        
        
            org.springframework
            spring-webmvc
            5.3.20
        
        
        
            org.springframework
            spring-test
            5.3.20
        
        
        
            junit
            junit
            4.13
            test
        
        
            junit
            junit
            RELEASE
            test
        
    

  • 但是大家可以看到Maven呈现一个红色波浪线的,说明这些依赖包还没有下载到本地仓库

  • 或者如下面这种情况

  • 打开Maven窗口,单击刷新按钮,就会开始自动下载依赖包

  • 下载好依赖包以后Maven仓库就不会在呈现红色波浪线

  • 等待插件与依赖下载完成(第一次下载有点慢,需要耐心等待)

  • 查看本地Maven仓库

  • 可以查看项目下载的有关Spring框架的依赖

(三)创建杀龙任务类
  • 创建net.Lee.spring.lesson01包,然后在包里面创建SlayDragonQuest类
  • 创建完net.Lee.spring.lesson01和SlayDragonQuest的样子
package net.Lee.spring.lesson01;



public class SlayDragonQuest {
    public void embark() {
        System.out.println("执行杀龙任务......");
    }
}
(四)创建勇敢骑士类
  • 在net.huawei.spring.day01包里创建BraveKnight类

package net.Lee.spring.lesson01;



public class BraveKnight {
    //    勇敢骑士姓名
    private String name;
    //    创建杀龙任务对象
    private SlayDragonQuest slayDragonQuest;

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

    

    public void setSlayDragonQuest(SlayDragonQuest slayDragonQuest) {
        this.slayDragonQuest = slayDragonQuest;
    }

    

    public void embarkOnQuest() {
        System.out.print("勇敢骑士[" + name + "]");
        slayDragonQuest.embark(); // 执行杀龙任务
    }
}
  • 回顾一下传统方式怎么使用这两个类。需要我们自己通过new实例化两个类,然后设置勇敢骑士对象的姓名和杀龙任务属性,然后调用勇敢骑士执行任务的方法。
(五)采用传统方式让勇敢骑士完成杀龙任务
  • 在test/java里创建net.Lee.spring.lesson01包,然后在包里面创建TestBraveKnightOld类

package net.Lee.spring.lesson01;

import org.junit.Test;


public class TestBraveKnightOld {
    @Test
    public void testBraveKnight() {
        // 创建杀龙任务对象
        SlayDragonQuest slayDragonQuest = new SlayDragonQuest();
        // 创建勇敢骑士对象
        BraveKnight braveKnight = new BraveKnight();
        // 设置勇敢骑士属性
        braveKnight.setName("罗宾汉");
        braveKnight.setSlayDragonQuest(slayDragonQuest);
        // 调用勇敢骑士执行任务方法
        braveKnight.embarkOnQuest();
    }
}
  • 运行测试方法testBraveKnight()

  • 查看程序运行结果

(六)采用Spring框架让勇敢骑士完成杀龙任务 1、创建日志属性文件
  • 在resources目录里创建log4j.properties

    • 创建好后的样子

log4j.rootLogger=WARN, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

2、创建Spring配置文件
  • 在resources里创建xmlconfig目录,然后在里面创建spring-config.xml

  • 输入Spring配置文件名后,产生文件

  • 单击【Configure application context】(配置应用上下文)

  • 单击【Create new application context…】(创建新的应用上下文),注意应用上下文名称是可以修改的

  • 单击【OK】按钮

  • 现在我们有了生产Bean的车间,下面我们就要在车间里配置产品

3、在Spring配置文件里创建Bean (1)创建杀龙任务Bean
    
    
  • id属性 :对应对象名,可以任取,然后在应用程序里我们可以通过这个id值从Spring容器中获取Bean对象。
  • class属性 :表明Bean对象是基于哪个类来实例化,注意一定要包含包名。
(2)创建勇敢骑士Bean
    
    
          
          
    
  • property元素:给对象设置属性值
  • name属性:Bean对象的属性名
  • ref属性:Bean对象的属性值(引用另一个Bean对象)
  • 勇敢骑士Bean通过元素将杀龙任务Bean注入作为其属性。注意,name属性值一定是BraveKnight类的属性名,ref属性值是已定义的杀龙任务Bean的id值。



    
    

    
    
          
          
    
    

  • 通过Spring配置文件,创建了两个Bean对象,它们之间存在依赖关系,第一个Bean对象是第二个Bean对象的任务属性值。

4、创建新勇敢骑士测试类
  • 在test/java/net.Lee.spring.lesson01里创建TestBraveKnightNew测试类

package net.Lee.spring.lesson01;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class TestBraveKnightNew {
    private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器

    @Before // 每次测试方法执行前都要执行的代码
    public void init() {
        // 基于Spring配置文件创建应用容器
        context = new ClassPathXmlApplicationContext("xmlconfig/spring-config.xml");
        // 提示用户
        System.out.println("Spring应用容器已创建~");
    }

    @Test
    public void testBraveKnight() {
        // 根据名称从应用容器中获取勇敢骑士对象(配置文件里定义勇敢骑士Bean的id是"RobinHood")
        BraveKnight braveKnight = (BraveKnight) context.getBean("RobinHood");
        // 勇敢骑士执行任务
        braveKnight.embarkOnQuest();
    }

    @After // 每次测试方法执行后都要执行的代码
    public void destroy() {
        // 关闭应用容器
        context.close();
        // 提示用户
        System.out.println("Spring应用容器已关闭~");
    }
}

  • 代码说明:首先通过Spring配置文件创建Spring应用容器,然后就可以利用容器的getBean方法通过名称获取容器里的Bean对象,然后调用该对象的方法。
  • 运行测试方法testBraveKnight(),查看结果
5、创建两个勇敢骑士Bean
  • 基于一个类可以创建多个对象,因此,在spring-config.xml文件里,也可以基于同一个类创建多个Bean。
  • 基于BraveKnight类再创建两个Bean,id值分别为Gareth和Galahad。
    
    
          
          
    

    
    
          
          
    
  • 在Spring配置文件里,同一个Bean不能重复定义,也就是说不允许两个Bean有相同的id值
6、修改新勇敢骑士测试类
  • 获取新建的两个勇敢骑士Bean,调用执行任务方法

package net.Lee.spring.lesson01;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.BeansException;
import org.springframework.context.support.ClassPathXmlApplicationContext;



public class TestBraveKnightNew {
    private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器

    @Before // 每次测试方法执行前都要执行的代码
    public void init() {
        // 基于Spring配置文件创建应用容器
        context = new ClassPathXmlApplicationContext("xmlconfig/spring-config.xml");
        // 提示用户
        System.out.println("Spring应用容器已创建。");
    }

    @Test
    public void testBraveKnight() {
        // 根据名称从应用容器中获取勇敢骑士对象(配置文件里定义勇敢骑士Bean的id是“RobinHood”)
        BraveKnight braveKnight = (BraveKnight) context.getBean("RobinHood");
        // 勇敢骑士执行任务
        braveKnight.embarkOnQuest();
        // 根据名称从应用容器中获取勇敢骑士对象(配置文件里定义勇敢骑士Bean的id是“knight1”)
        BraveKnight Gareth = (BraveKnight) context.getBean("Gareth");
        // 勇敢骑士执行任务
        Gareth.embarkOnQuest();
        // 根据名称从应用容器中获取勇敢骑士对象(配置文件里定义勇敢骑士Bean的id是“knight1”)
        BraveKnight Galahad = (BraveKnight) context.getBean("Galahad");
        // 勇敢骑士执行任务
        Galahad.embarkOnQuest();

    }

    @After //每次测试方法执行后都要执行的代码
    public void destroy() {
        // 关闭应用容器
        context.close();
        //提示用户
        System.out.println("Spring容器已关闭");
    }

}

  • 执行testBraveKnight()测试方法,查看结果

  • 勇敢骑士Bean采用属性注入方式将杀龙任务Bean注入作为其属性。

  • 初始化对象其实可以调用有参构造方法来设置属性的初始值,对应到Spring的Bean工厂,就还有一种注入方式,叫做构造方法注入。同样地,我们还是通过案例来演示如何通过构造方法来注入属性值。

(七)采用构造方法注入方式注入属性值 1、创建救美任务类
  • 在net.Lee.spring.lesson01包里创建RescueDamselQuest类

  • Rescue Damsel - 拯救少女

package net.Lee.spring.lesson01;


public class RescueDamselQuest {
    public void embark() {
        System.out.println("执行救美任务……");
    }
}
2、创建救美骑士类
  • 在net.Lee.spring.lesson01包里创建RescueDamselKnight类

package net.Lee.spring.lesson01;



public class RescueDamselKnight {
    private String name;
    private RescueDamselQuest rescueDamselQuest;

    
    public RescueDamselKnight(String name, RescueDamselQuest rescueDamselQuest) {
        this.name = name;
        this.rescueDamselQuest = rescueDamselQuest;
    }

    public void embarkOnQuest() {
        System.out.print("救美骑士[" + name + ']');
        rescueDamselQuest.embark();
    }
}
  • 代码说明:通过构造方法来设置骑士的姓名与要执行的任务。
3、配置救美骑士Bean
  • 在Spring配置文件里创建救美骑士Bean

  • arg: argument 参数

    
    
    
    
        
        
    
4、创建旧救美骑士测试类
  • 在test/java/net.Lee.spring.lesson01包里创建TestRescueDamselKnightOld类
package net.Lee.spring.lesson01;

import org.junit.Test;


public class TestRescueDamselKnightOld {
    @Test
    public void testRescueDamselKnight() {
        // 创建救美任务对象
        RescueDamselQuest rescueDamselQuest = new RescueDamselQuest();
        // 创建救美骑士对象
        RescueDamselKnight rescueDamselKnight = new RescueDamselKnight("格拉海德", rescueDamselQuest);
        // 救美骑士执行任务
        rescueDamselKnight.embarkOnQuest();
    }
}

  • 运行testRescueDamselKnight()测试方法,查看结果
5、创建新救美骑士测试类
  • 在test/java/net.Lee.spring.lesson01包里创建TestRescueDamselKnightNew类
package net.Lee.spring.lesson01;


import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;



public class TestRescueDamselKnightNew {
    private ClassPathXmlApplicationContext context; // 基于类路径XML配置文件的应用容器

    @Before // 每次测试方法执行前都要执行的代码
    public void init() {
        // 基于Spring配置文件创建应用容器
        context = new ClassPathXmlApplicationContext("xmlconfig/spring-config.xml");
        // 提示用户
        System.out.println("Spring应用容器已创建~");
    }

    @Test
    public void testRescueDamselKnight() {
        // 根据名称从应用容器里获取救美骑士对象
        RescueDamselKnight rescueDamselKnight = (RescueDamselKnight) context.getBean("Galahad");
        // 救美骑士执行任务
        rescueDamselKnight.embarkOnQuest();
    }

    @After // 每次测试方法执行后都要执行的代码
    public void destroy() {
        // 关闭应用容器
        context.close();
        // 提示用户
        System.out.println("Spring应用容器已关闭~");
    }
}
  • 运行testRescueDamselKnight()测试方法,查看效果

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/956440.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号