锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. Spring的创建和使用

Spring的创建和使用

0
  • 软件开发
  • 发布于 2024-09-19
  • 0 次阅读
黄健
黄健

目录

1.什么是Spring

IoC

2.Spring创建和使用

创建Spring

存取Bean

BeanFactory 和 ApplicationContext的区别

3. 总结


1.什么是Spring

spring官网:spring.io

它的生态是非常完善的

通常所说的Spring指的是Spring Framework(Spring 框架),是一个开源的框架,支持广泛的应用场景可以使Java企业级应用程序开发更简单

Spring Framework 是Spring生态圈中最基础的项目,是其他项目的根基

核心:Spring是包含了众多工具方法的IoC容器

那么什么是IoC容器?

容器:之前学过的List/Map=>数据存储容器,tomcat=>web容器..等都是容器

Spring=>IoC容器

IoC

IoC:Inversion of Control 控制反转,Spring是一个控制反转容器

那IoC具体是什么呢?

这得从我们Java代码的书写现状说起,在传统编程时, 对象之间的耦合度是偏高的

我们写个示例,Test类要依靠A类才能完成任务,A依赖于B才能完成任务

创建A类

A对象是依赖于B对象的,所以会报错

加上B类

此时A类不再报错

也就是A对象要使用B对象时,得new一个B对象.此时,A对象掌握了B对象的控制权,党部在使用时,可以给B设置为null,就被回收了

A依赖于B,那么当B对象的构造方法改动时,A对象也得跟着改动

当B中的构造方法改动后,newB的A也得改动,否则就会报错

改动后

newA的Test也需要改动

可以发现,当最底层发生变化时,整个调用链都需要发生变化

这就体现了代码之间耦合程度比较高的问题,如何解决呢?

我们写一种解耦的写法

此时我们改动B的构造器

前面几个类都不会报错,只是提供它的测试类报错了

这种方法就实现了解耦

传统方式:Test依赖A,A依赖B

解耦方式:B传入A,A传入Test

是一个反转的过程

这些类的生命周期,不是由依赖的类来控制了

总结:

解决办法:解耦,使用对象时,不主动new对象,转为由外部获取

即使下级类参数发生改动,当前类本身也不需要改动,这就是程序的解耦

IoC负责对象的创建,初始化一系列工作,被创建或被管理的对象在IoC容器中统称为Bean

IoC核心思想:对象的创建控制权由程序转移到外部,这种思想称为控制反转

A只管使用B对象,不进行new对象操作,只是使用.B对象由谁创建A并不关心

此时,A对象就没有B对象的控制权了.控制权交出去了,这就是控制反转!

回到Spring这个主题,它是包含了众多方法工具的IoC容器,也就是Spring提供了一个IoC容器,用来充当IoC思想中的"外部”,它具有对象创建和销毁的权利,本身又具备存储对象和获取对象的能力

核心功能:将对象存入到容器,将对象从容器中取出

用Spring存取对象的好处?

将对象放到容器中,相当于将以后可能用的工具都制作好放到仓库了.需要时直接取出使用,用完再放回仓库,new对象方式使用完置空就会被回收,要使用还得重新new.

还需要提到一个概念,Dependency Injection,简称DI,是依赖注入的意思

依赖注入:IoC容器运行期间,动态的将某种依赖关系注入到对象中.

可以看出,IoC是一个指导思想,DI是其具体的实现

2.Spring创建和使用

创建Spring

创建Spring项目分为三步

1.创建一个普通Maven项目

2.添加Spring框架支持

3.添加启动类

1.创建一个普通Maven项目

这样就代表项目已经初始化完成了

2.添加Spring依赖

需要配置好国内源,否则下载非常慢

需要使用大版本号是5的支持和jdk要相匹配

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.26</version>
</dependency>

然后点击刷新

添加依赖成功

3.创建启动类

下来我们将Bean对象存储到Spring中

存取Bean

1.创建Bean

Bean:在Java中如果被使用很多次,就称为Bean

2.将Bean存储到Spring容器中

通过Spring的配置文件配置Bean的信息

3.从Spring中获取到Bean

先获取Spring(上下文)对象,用到的是ClassPathXmlApplicationContext

ClassPathXmlApplicationContext类是实现了ApplicationContext接口的

ClassPathXmlApplicationContext属于 ApplicationContext 的⼦类,拥有 ApplicationContext 的所有功能,是通过 xml 的配置来获取所有的 Bean 容器的

注意”“中的路径一定要写对,和resourses下的.xml文件对应,不然无法找到我们设置的bean

然后就能获取bean了

这个参数内容必须是和.xml中配置的id是一样的才能获取到bean

结果:

没有通过new对象的方式,获取到了bean对象并且使用

还有另外两种获取方式:

这个过程就是通过代码实现的DI, 动态的将依赖关系注入到对象中!

BeanFactory也能获取到Spring的上下文

可以看出,Application Context也是它的子类型,是对其功能的扩展

public class Application2 {
    public static void main(String[] args) {
        //1.得到spring上下文对象
        BeanFactory beanFactory =
                //不推荐使用,是因为早期时内存珍贵,现在内存价格低廉.
                //特征:省内存,调用时加载初始化bean到spring容器,效率不高!
                new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
        //2.从容器中获取对象

        //第一种获取方式:这个写法是有问题的,如果本身是"null",强转会出错

        Student s2 = (Student) beanFactory.getBean("student");
        //3.使用对象
        s2.sayHi();
    }
}

BeanFactory 和 ApplicationContext的区别

那么这两种方式又什么区别呢?

我们再创建一个类

配置Bean信息

我们只调用获取上下文的这行代码

我们可以发现:

ApplicationContext是一次性加载,比较费内存,但是后续读取非常快,会将spring中所有的bean进行初始化,全部实例化到spring中!!饿汉模式

Beanfactory不会,使用的是惰性加载,只有执行到了get bean才会加载对应的bean!!!

从继承关系方面来说:

Spring有两个顶级接口,BeanFactory 和 ApplicationContext,其中BeanFactory提供了基础的访问容器的能力,而ApplicationContext属于BeanFactory的子类,除了继承了BeanFactory之外,还拥有其他特性,添加了对国际化支持,资源访问支持,以及事件传播等方面的支持

  1. 总结

1.创建Spring项目

创建一个Maven项目

添加Spring-context依赖

创建启动类

2.存储Bean

创建Bean对象

通过Spring配置文件(spring-config.xml)

3.读取Bean

得到Spring上下文(BeanFactory 和 ApplicationContext)

通过Spring对象.getBean()方法获取到Bean对象(这个过程是DI)

使用Bean

原文链接: https://blog.csdn.net/chenchenchencl/article/details/130122083

标签: #Spring 84 #软件开发 1171
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.