Java研学-spring框架(一)

news2025/1/12 9:55:58

一 概述

1 介绍

  Spring框架是一个开源的Java EE应用程序框架,旨在简化Java企业级应用的开发难度和开发周期,主要通过控制反转(IoC)和面向切面编程(AOP)等技术实现。
  容器(Container):(主要是指IoC容器)是Spring框架的核心技术,主要作用是管理对象的创建及属性的赋值,以及单例对象的销毁回收(管理对象的生命周期)。通过控制反转(IoC)技术,Spring容器负责管理对象之间的依赖关系,降低了程序的耦合度。也就是装对象的的对象,如 Tomcat 就是 Servlet 的容器。在典型的IoC场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。

2 作用

  Spring 提供了 JavaEE 每一层的解决方案。根据职责的划分为:控制层、业务层、持久层,使用不同框架解决不同领域的问题。
解决方案

3 优势

  ① 方便解耦,简化开发:通过IoC容器,Spring可以管理对象间的依赖关系,避免硬编码造成的过度程序耦合。
  ② AOP编程的支持:Spring提供面向切面编程,可以方便地实现对程序进行权限拦截、运行监控等功能。
  ③ 声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无需手动编程。
  ④ 方便程序的测试:Spring对Junit4支持,可以通过注解方便地测试Spring程序。

4 Spring FrameWork 体系

  Spring Framework提供了一个简易的开发方式,这种开发方式,将避免那些可能致使底层代码变得繁杂混乱的大量的属性文件和帮助类。关键特性包括强大的基于JavaBeans的采用控制反转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易。
  Spring Framework总共有十几个组件,其中核心组件只有三个:Core、Context和Beans。每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
Spring FrameWork
① Core(核心容器IOC):提供Spring框架的基本功能,包含有 Beans、Core、Context 和 SpEL 模块。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
② Context(上下文):Spring上下文是一个配置文件,向Spring框架提供上下文信息。所以,可以很容易地使Spring框架管理的任何对象支持AOP。
③ AOP:Spring框架的面向切面编程模块,用于处理跨多个模块的横切关注点,例如日志和事务管理。
④ DAO:提供了一个统一的异常层次结构,以简化数据库访问异常的处理。
⑤ Data Access Integration:提供了集成各种ORM框架(如Hibernate和JDBC)的工具。
⑥ Web:提供了用于构建Web应用程序的工具,包括支持视图技术如JSP和Tiles,以及支持RESTful Web服务的框架。
⑦ MVC:Spring框架的模型-视图-控制器(MVC)实现,用于构建Web应用程序。
⑧ Test:提供了用于单元测试和集成测试的工具。

5 Spring 依赖

官网与版本选择

二 IoC与DI

1 IoC – 控制反转

  在Spring框架中,IoC(Inversion of Control)是一个核心概念,其含义是将对象的设计和创建控制权交给一个外部容器(即IoC容器),而不是由对象本身直接控制。

  这种控制反转的设计原则有助于降低代码之间的耦合度,提高组件的灵活性和可维护性。IoC容器的功能是负责管理对象的生命周期,通过依赖注入的方式装配对象,配置对象,并且管理这些对象的整个生命周期。

2 DI – 依赖注入

  DI的实现主要依赖于IoC容器。它允许容器在运行期间动态地将依赖关系注入到组件中,从而降低了代码之间的耦合度。IoC容器负责创建、配置和管理应用程序中的对象及其依赖关系。当一个对象被创建时,IoC容器可以自动将该对象所依赖的其他对象注入给它。这个过程可以在运行时动态地发生,使得应用程序的组件之间的耦合度大大降低。
  在Spring中,依赖注入通常通过以下几种方式实现:
  ① 构造函数注入:通过类的构造函数将依赖关系注入到对象中。
  ② Setter注入:通过Setter方法对属性进行赋值,实现依赖关系的注入。
  ③ 注解注入:通过反射为属性赋值,实现依赖关系的注入。
  依赖注入的时机通常发生在IoC容器完成Bean定义资源的定位、载入、解析和注册之后。在初始化IoC容器完成之后,非懒加载的BeanDefinition会被实例化和进行依赖注入。对于懒加载的Bean对象,其依赖注入发生在用户第一次调用getBean()方法时。

三 简单demo

1 为Maven项目添加依赖

pom

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
<!--包含了spring所需core中的核心依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.0.8.RELEASE</version>
    </dependency>
</dependencies>

2 实体类

public class Person {
    private  String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void doWork(){
        System.out.println(this.name+"准备出去玩!");
    }
}

3 resources目录

spring-ioc.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">
     <!--使用IOC创建对象: Person person=new Person();-->
    <!--
    id表示创建对象的唯一标识
    class表示对象实体类全类名
    -->
    <bean id="person"  class="cn.tj.Person" >
        <!--
        给变量赋值:person.setName("叶凡");
        name实体类成员变量名称
        value给成员变量设置的值
        -->
        <property name="name" value="叶凡"></property>
    </bean>
</beans>

4 测试方法

    @Test
    public void play_ioc(){
        //加载spring配置文件 这是一个接口
        ApplicationContext context=
                new ClassPathXmlApplicationContext("spring-ioc.xml");
        // 调用获取bean的方法:参数是配置文件设置的bean标签的id值
        // 将返回类型为Object的对象强转为Person 
        // Person person = (Person) context.getBean("person");
        // 推荐使用
        Person person = context.getBean(Person.class, "person");
        // Person person = context.getBean(Person.class);
        //调用对象的成员方法
        person.doWork();
    }

5 ApplicationContext

  BeanFactory是Spring 最底层的接口,提供IoC 功能,负责创建、组装、管理 bean,而ApplicationContext在继承了BeanFactory的同时,还提供 AOP 集成、事件传播、统一资源加载等功能。bean就是Spring IoC 容器管理的对象

6 Spring 配置方式

  ① XML配置:Spring早期主要采用XML方式进行配置,通过编写配置文件来定义Bean以及它们的依赖关系。这种方式易于理解和维护,但在配置文件过于庞大时会降低可读性。

  ② 注解配置:从Spring 3.0开始,注解配置成为可能,它通过Java注解来定义应用程序的组件和依赖关系。注解配置相比XML方式更为简洁,易于阅读和维护,适合用于简单的Bean配置。

  ③ Java Config配置:这是一种灵活的配置方式,通过Java代码来定义应用程序的组件和依赖关系。这种方式提供了一种更直接的方式来配置Bean,使得代码更加清晰和易于理解。

  ④ 基于Java的XML配置:这种方式结合了XML和Java代码的优点,可以在XML文件中定义Bean,同时使用Java代码进行依赖注入。这种方式适用于需要使用XML但同时又希望保持代码简洁的情况。

四 Spring 整合单元测试

1 优势

  ① 高度可控性:使用Spring的测试工具,可以轻松模拟和控制应用程序中的各个组件,从而更好地进行单元测试,减少对外部依赖的影响。

  ② 方便的依赖注入:Spring框架提供了依赖注入的功能,使得测试代码中的依赖关系更加清晰和易于管理。同时,使用Spring的单元测试框架可以自动装配依赖对象,减少了手动创建和配置对象的工作量。

  ③ 对原有单元测试能力的支持:Spring框架对Junit和TestNG等原有的单元测试框架提供了良好的支持,用Spring 容器管理测试代码可以方便地编写和执行测试用例。而传统测试用测试代码管理 Spring 容器每个测试都要重新启动 Spring 容器,十分消耗服务器资源。

  ④ 方便的测试管理:通过Spring的单元测试框架,可以使用各种监听器对测试类的依赖注入、对Spring applicationContext的访问以及事务管理能力进行管理,为使用Spring架构的应用程序的测试带来了极大的便利性。

  综上所述,使用Spring整合单元测试可以提高测试的效率和准确性,降低测试的复杂度和工作量,方便地管理依赖关系和测试数据,以及更好地控制应用程序的行为。

2 demo

① pom 添加依赖

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-test</artifactId>
	<version>5.0.8.RELEASE</version>
	<scope>test</scope>
</dependency>

② 测试方法

//spring整合junit4
@RunWith(SpringJUnit4ClassRunner.class)
//读取项目下的多个配置文件
//@ContextConfiguration(locations = {"classpath:spring-ioc.xml","",""})
//项目下只有一个配置文件读取: ApplicationContext context= new ClassPathXmlApplicationContext("spring-ioc.xml");
//classpath表示从编译后的资源根目录下获取
@ContextConfiguration("classpath:spring-ioc.xml")
//不写locations会去测试类的路径找测试类名-context.xml配置文件
//@ContextConfiguration
public class PersonTestSpring {
    // 使用注解将容器的bean注入到当前类中:相当于 ioc容器.getBean("person");
    @Autowired
    private Person person;
    @Test
    public void hello(){
        // 调用bean的成员方法
        // person.doWork();
        System.out.println(person);
    }
}

③ spring-ioc.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 id="person"  class="cn.tj.domain.Person"  >
<!--        <property name="name" value="叶凡"></property>-->
    </bean>
</beans>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1401627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CVE-2022-22733漏洞复现】

Apache ShardingSphere ElasticJob-UI漏洞 漏洞编号:CVE-2022-22733 文档说明 本文作者:SwBack 创作时间:2024/1/21 19:19:19 知乎:https://www.zhihu.com/people/back-88-87 CSDN:https://blog.csdn.net/qq_30817059 百度搜索: SwBack漏洞描述 Apache ShardingSphere Elast…

Python基础第二篇(Python基础语法)

文章目录 一、字面量二、注释三、变量四、数据类型五、数据类型转换六、标识符七、运算符八、字符串扩展内容&#xff08;1&#xff09;字符串定义&#xff08;2&#xff09;字符串拼接、&#xff08;3&#xff09;字符串格式化&#xff08;4&#xff09;字符串格式化的精度控制…

上位机图像处理和嵌入式模块部署(开篇)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图像处理是现实生活当中很实用的一门技术。工业上一般采用的是机器视觉&#xff0c;以传统算法和光源控制为主&#xff0c;部分采用了深度学习技术…

MySQL的下载、安装、配置、登录,配置(图+文)(超级详细)

一、 软件的下载 1. 下载地址 官网&#xff1a; https://www.mysql.com 2. 打开官网&#xff0c;点击 DOWNLOADS 然后&#xff0c;点击 MySQL Community(GPL) Downloads 3. 点击 MySQL Community Server 4. 在 General Availability(GA) Releases 中选择适合的版本 …

【C语言基础篇】结构控制(下)转向语句break、continue、goto、return

文章目录 一、break语句 1. break在 while 循环中 2. break在 for 循环中 3. break在 do…while 循环中 4. break在 switch 语句中 5. break 总结 二、continue语句 1. continue在 while 循环中 2. continue在 for 循环中 3. continue在 do...while 循环中 4. con…

Kubernetes网络模型概述

Kubernetes网络模型设计的一个基础原则是&#xff1a;每个Pod都拥有一个独立的IP地址&#xff0c;并假定所有Pod都在一个可以直接连通的、扁平的网络空间中。所以不管这些Pod是否运行在同一个Node中&#xff0c;都要求它们可以直接通过对方的IP进行访问。由于Kubernetes的网络模…

C++泛型编程-类模板的项目实战实现基础的Vector的编写

请设计一个数组模板类&#xff08; Vector &#xff09;&#xff0c;完成对 int 、 char 、 float 、 double 以 及任意的自定义类等类型元素进行管理。 需求 a. 实现构造函数 b. 实现拷贝构造函数 c. 实现 cout << 操作 d. 实现下标访问符 [] 的重载操作 …

中仕教育:应届生可以考军队文职吗?有什么要求?

军队文职&#xff0c;涵盖了各个领域&#xff0c;包括行政、管理、人力资源、后勤等工作岗位&#xff0c;作为国家公务员的一种类型&#xff0c;军队文职同样享有稳定的工作和待遇。 虽然军队文职对所有符合条件的人开放&#xff0c;但对于应届生来说&#xff0c;还需满足以下…

企业Oracle1 数据库管理

Oracle的安装 一、基础表的创建 1.1 切换到scott用户 用sys 账户 登录 解锁scott账户 alter user scott account unlock;conn scott/tiger;发现并不存在scott账户&#xff0c;自己创建一个&#xff1f; 查找资料后发现&#xff0c;scott用户的脚本需要自己执行一下 C:\ap…

Spring:StopWatch

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、输出总耗时 二、输出所有任务的耗时和占比 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、输出总耗时 public void stopWatc…

【web 编程技术】基于 B/S 架构的电商平台(java web)

基于 B/S 架构的电商平台&#xff08;java web&#xff09; 课程设计实验目的课程设计实验环境课程设计功能概述课程设计需求分析三层架构图功能列表系统用例图系统活动图-用户端需求分析 课程设计详细设计实现过程数据库BaseServlet 的实现商品显示模块-分页显示所有商品、查看…

【网站项目】基于SSM的274办公自动化管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

安全防御-基础认知

目录 安全风险能见度不足&#xff1a; 常见的网络安全术语 &#xff1a; 常见安全风险 网络的基本攻击模式&#xff1a; 病毒分类&#xff1a; 病毒的特征&#xff1a; 常见病毒&#xff1a; 信息安全的五要素&#xff1a; 信息安全的五要素案例 网络空间&#xff1a…

flutter项目怎么判断是不是web平台?Unsupported operation: Platform._operatingSystem

如果你使用Platform 这个工具来判断的时候&#xff0c;很有可能会报错&#xff1a; Exception caught by widgets library The following UnsupportedError was thrown building MyApp(dirty): Unsupported operation: Platform._operatingSystem The relevant error-causin…

关于索引的最常见的十道面试题

面试题一&#xff1a;索引底层如何实现的&#xff1f; MySQL索引的底层实现是取决于存储引擎的&#xff0c;但是是大部分存储引擎底层都是通过B树实现的&#xff0c;以默认的存储InnoDB为例&#xff0c;底层就是通过B树实现的&#xff0c;如下图所示&#xff1a; B树是一种自平…

为什么C++17要引入std::string_view?

目录 1.引言 2.原理分析 2.1.结构 2.2.构造函数 2.3.成员函数 2.4.std::string_view字面量 3.实例 3.1.std::string_view和std::string的运算符操作 3.2.查找函数使用 3.3.std::string_view和临时字符串 4.总结 1.引言 在C/C日常编程中&#xff0c;我们常进行数据的…

elastic search入门

参考1&#xff1a;Elastic Search 入门 - 知乎 参考2&#xff1a;Ubuntu上安装ElasticSearch_ubuntu elasticsearch-CSDN博客 1、ElasticSearch安装 1.1安装JDK&#xff0c;省略&#xff0c;之前已安装过 1.2创建ES用户 创建用户&#xff1a;sudo useradd esuser 设置密码&…

多线程编程1

一、线程的引入 上节&#xff0c;我们介绍了进程的概念&#xff0c;以及操作系统内核是如何管理进程的&#xff08;描述组织&#xff09;&#xff0c;PCB中的核心属性有哪些&#xff0c; 引入进程这个概念&#xff0c;最主要的目的&#xff0c;就是为了解决“并发编程”这样的…

机器学习周记(第二十六周:文献阅读-DPGCN)2024.1.15~2024.1.21

目录 摘要 ABSTRACT 1 论文信息 1.1 论文标题 1.2 论文摘要 1.3 论文背景 2 论文模型 2.1 问题描述 2.2 论文模型 2.2.1 时间感知离散图结构估计&#xff08;Time-aware Discrete Graph Structure Estimation Module&#xff0c;TADG Module&#xff09; 2.2.2 时间…

【Linux】grub命令行引导进入系统

文章目录 1.grub命令行界面2.设置启动目录3.chainloader加载windows启动文件4.启动5.grub命令行无响应办法 在卸载Linux系统后&#xff0c;有的小白可能会忘记删除Linux的EFI引导。这样的话&#xff0c;下次开机时就会自动进入grub的命令行&#xff0c;连windows系统都进不去了…