【Spring 】项目创建和使用

news2024/11/8 20:00:10

 哈喽,哈喽,大家好~ 我是你们的老朋友:保护小周ღ  


谈起Java 圈子里的框架,最年长最耀眼的莫过于 Spring 框架啦,如今已成为最流行、最广泛使用的Java开发框架之一。不知道大家有没有在使用 Spring 框架的时候思考过这些问题,什么是框架?Spring 是什么?如何理解 Spring ?   loC 和 DI 是什么,有什么区别? Spring 最核心的功能是啥? 本文将为大家讲解,一起来看看叭~


本期收录于博主的专栏:JavaEE_保护小周ღ的博客-CSDN博客

适用于编程初学者,感兴趣的朋友们可以订阅,查看其它 “JavaEE基础知识”。

更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘


一、Spring 的概念

书接上回,Spring : 包含众多工具方法的 IoC 容器。

Spring 的核心 :IoC (控制反转), DI (依赖注入)。

loC (Inversion of Control)翻译成中文就是 “控制反转” 的意思,控制反转一种编程设计思想,将程序的控制流程从传统的主动调用方式转变为被动接收方式(一个类的内部不再实例另一个类,而是告诉程序这个类需要那个类作为参数采用运行),从而实现对象和对象之间的解耦和依赖管理。

DI (Dependency Injection 的缩写——“依赖注入”)“依赖注入” 指的就是由 IoC 容器在运行期间(程序运行期间),动态地将某种依赖关系注入到对象之中。传统的做法是由程序主动去找他所依赖的对象然后进行实例化,而DI则是由容器主动地将依赖关系注入到对象中。这样做的好处是对象之间解耦。
既然 Spring 是一个 loC 容器,那么它就具备两个最基本的功能:

  • 将对象存储到容器(Spring)中
  • 从容器(Spring)中将对象取出来

在 Java 中一个普通的实例化的对象也被称之为 Bean 对象,在框架这一块我们遇到的对象就是以 Bean 对象称呼。

想要了解更多 Spring 概念知识的朋友可以阅读博主的另一篇博客:

【Spring】核心与设计思想_保护小周ღ的博客-CSDN博客


二、创建 Spring 项目

我们在了解 Spring 是啥之后,接下来结合 IDEA (集成开发环境) 演示如何创建一个  Spring 项目。

2.1 创建一个 普通的 Maven 项目(无需使用模板)

来到这个界面就说明创建成功了


2.2 添加 Spring 框架支持

Spring 是一个开源的 Java 框架,由 Rod Johnson 在 2002 年创建。Spring 提供了许多简化 Java 开发的功能,因此它在 Java 开发社区中得到了广泛的应用和认可。Spring 是第三方的资源(框架)是由大佬对已有的功能进行封装拓展,使得程序猿更容易地编写功能,并不属于 JDK 官方 , 所以我们要想使用 Spring 就需要下载第三方依赖。

只需要在项目中地 pom.xml 文档中添加 Spring 框架地支持, xml 配置如

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
</dependencies>

从上述配置中可以看出,添加的框架有 spring-context: spring  上下文, 还有 spring-beans : 管理对象的模块。具体有啥作用下文讲述。


1.3 添加一个启动类

最后在创建好的项目 Java 文件夹下创建一个启动类,包含 main 方法即可:

public class App {
    public static void main(String[] args) {

    }
}

在这个启动类中我们就可以对 Bean 对象进行一系列的操作。


三、将对象存储到 Spring

要想存储 Bean 对象(类实例化后的对象)需要有 2 步操作:

  • 创建一个 bean 对象 —— 需要一个类
  • 将 bean 对象 注册到 Spring 中 【使用 Spring 配置文件进行注册】

3.1 创建 Bean 对象

所谓 Bean 对象就是 Java 中的一个普通的对象。

public class Dog {
    // 狗的属性
    private String name;
    private int age;
    private String sex;
    private String color;


    // 狗的行为
    public void cry() {
        System.out.println(this.name + "汪汪~");
    }

    /**
     * 小狗的做我介绍
     * @return
     */
    @Override
    public String toString() {
        return "Dog{" +
                "我叫做:'" + name + '\'' +
                ", 我今年:" + age +
                "岁, 我的性别是:" + sex +
                ", 我是'" + color + '\'' + "的" +
                '}';
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

常规的做法:

public class App {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("哈巴狗");
        dog.setAge(3);
        dog.setSex("公");
        dog.setColor("白色");
        dog.cry();
        System.out.println(dog.toString());
    }
}


3.2 将 Bean 对象注册到 Spring 

这里介绍一种古老的注册方法——【使用 Spring 配置文件进行注册】

在创建好的项目中添加 Spring 的配置文件 spring-test.xml , 将该文件放到 resources 的根目录下:

这个配置文件 spring-test.xml  文件名可以任意的名称但是必须保证文件后缀为( .xml ),这里的文件名在后续的取 Bean 对象中会使用到。

该文件为 Spring 的配置文件,格式也是固定的(不需要记忆,找个文档保存一下即可):

<?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">
</beans>

接下来,实现如何将 我们自定义的对象(Dog)注册到  Spring 中就可以了,具体的操作在 <beans> 标签中添加的。

<beans xmlns="http://www.springframework.org/schema/beans"
    <bean id="dog" class="Dog"></bean>
</beans>

​如果需要将多个 bean 对象注册到 Spring 中,重复以上操作即可。注意:需要给每个 bean 对象取别名(标识)。


四、从 Spring 获取并使用 Bean 对象 

获取并使用 Bean 对象分为三个步骤:

  • 获取 Spring 上下文对象(该对象维护了所有的 bean 对象),因为对象都交给了 Spring 管理,所以要从 Spring 中获取对象,就需要先得到 Spring 的上下文。
  • 通过 Spring 的上下文,获取某一个指定(通过存储bean 对象的时候设置的标识)的 Bean 对象
  • 返回值是 Bean 对象的实例,所以我们可以直接使用。

如果需要取出 多个 Bean 对象重复以上第 2,3 步骤即可

4.1 创建 Spring 上下文对象

Spring的上下文是指Spring容器中存储Bean对象的数据结构,也可以理解为Spring容器中的环境。

目前 Spring 上下文对象可以使用 ApplicationContext  接口来获取:

Spring框架中的ApplicationContext是一个IoC容器,负责管理应用程序中的Bean对象,它是一个配置文件,提供了Bean对象所需的配置信息,同时也是Bean对象的容器。通过ApplicationContext,开发人员可以将Bean对象存储在容器中,并在其他组件中使用这些Bean对象。

//1. 获取 Spring 上下文对象,创建的时候需要配置 Spring 的配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("spring-test.xml");

 


除了使用 ApplicationContext 之外,我们还可以使用 BeanFactory 接口来获取 Spring 的上下文。

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-test.xml"));

BeanFactory的主要作用是管理Bean的生命周期,包括Bean的创建、销毁和依赖注入等操作。BeanFactory是Spring框架中IoC容器的基础接口,它提供了对Bean对象的注册和获取。

不管是使用 ApplicationContext 还是使用 BeanFactory 获取 Spring 的上下文,二者的效果是一样的。但是他们在方式是有所区别的。

ApplicationContext VS BeanFactory
相同点:

  1. 都可以得到 Spring 的上下文对象
  2. 都是 Spring 容器的顶级接口 (都可以管理 bean 对象)

不同点:

  1. 在继承关系和功能上来说:ApplicationContext 属于 BeanFactory 的子类,BeanFactory 只具备最基础的管理 bean 对象的能力,而ApplicationContext 继承了 BeanFactory 自然就拥有了它的基本功能,除此以外,还拓展了更多的功能,如:国际化的支持、资源访问支持、以及事件传播等方面的支持。
  2. 从性能的角度上来说:ApplicationContext 获取的Spring 上下文对象加载的方式是启动后一次性将 Spring 容器中的所有的 bean 对象全部实例化在内存中,所以在后面获取 Bean 对象的时候非常的快;BeanFactory 获取的Spring 上下文对象加载的方式是在需要某个 Bean 对象的时候,再去加载(实例化)Bean对象,所以在获取  Bean 对象的时候会比较慢。

在Spring框架的历史版本中,从Spring 2.x版本的时候就有了ApplicationContext的接口,但是BeanFactory仍然是一个核心接口,没有被淘汰。

一直到Spring 3.1版本,官方已经开始推荐使用ApplicationContext接口来代替BeanFactory进行Bean的管理和实例化。原因是ApplicationContext在BeanFactory的基础上增加了更多的功能,比如国际化、事件发布、AOP引入、web环境支持等,能够更好地满足开发的需求。

ClassPathXmlApplicationContext 属于 ApplicationContext 的子类,拥有 ApplicationContext 的所有功能,是通过 xml 文件(存储 Bean 对象的文件)的配置来获取所有的 Bean 对象的容器。


4.2 获取指定的 Bean 对象

上一步我们获取了 Spring 的上下文对象,context 这个对象就是用来管理 Bean 对象的,如果我们需要获取某个具体的 Bean 对象,需要在上下文对象的基础上调用 getBean() 方法

getBean()方法是从Spring容器中获取Bean实例的核心方法。

当前给大家介绍的功能是读取Bean 对象:

通过Bean ID或Bean名称从 Spring 容器中获取指定的Bean定义,如果没有找到,则抛出异常。

//1. 获取 Spring 上下文对象,创建的时候需要配置 Spring 的配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("spring-test.xml");
        
//2. 从 Spring 上下文中取出某个 bean 对象
Dog dog = (Dog)context.getBean("dog");// dog是我们给 Dog 类的实例取得的标志(名字)

注意事项:

否则会抛出:NoSuchBeanDefinitionException 异常


4.2.1 getBean() 方法的使用

getBean() 方法有很多种重载的方法,我们也可以使用其他的方法来获取 Bean 对象。

1. 根据 bean 对象的 id (标志)来获取 【上文已经讲过】

// dog是我们给 Dog 类的实例取得的标志(名字)
Dog dog = (Dog)context.getBean("dog");

使用 bean对象的 id 来获取,Spring 上下文对象—— context 的返回值是 Object, 所以需要进行强制类型转换。  

2. 根据类型来获取 Bean 

Dog dog = context.getBean(Dog.class);

因为我们直接使用 bean 对象的类型来获取,所以我们无需手动强制类型转换,在获取的时候会自动强转。

3. 根据 bean 对象的 id (标志)+ 类型 获取 bean

 Dog dog = context.getBean("dog",Dog.class);

第一种方法的第二种方法的区别在于:

当一个类被重复的注册到  spring-test.xml 的配置文件中时,只能使用根据 ID (名称) 来获取。

此时 Spring 容器中存储了 两个 Dog 类的实例(bean 对象)。

我们使用类型来获取 bean 对象并使用时的表现:

所以我们当同类型的对象被注册到 Spring 中多次时就会导致程序报错,此时我们应当使用 bean 对象的 ID (名称) 来获取。但是这种方式的缺陷在于 我们需要手动的进行强制类型转换(返回类型是 Object)

所以我们推荐的写法是使用第三种方法 根据 bean 对象的 id (标志)+ 类型 获取 bean 对象。


4.3 使用 Bean 对象

上文也说到其实 Bean 对像就是普通的实例化的对象,Bean 对象只是一个名字罢了。所以Bean 对象的使用跟我们传统对象的使用并无差异:

public class App {
    public static void main(String[] args) {
        //1. 获取 Spring 上下文对象,创建的时候需要配置 Spring 的配置文件
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-test.xml");

        //2. 使用类型从 Spring 容器中获取 bean 对象
        Dog dog = context.getBean("dog",Dog.class);

        //3. bean 对象的使用
        dog.setName("哈巴狗");
        dog.setAge(3);
        dog.setSex("公");
        dog.setColor("白色");
        dog.cry();
        System.out.println(dog.toString());  
    }
}


五、总结

1. Spring 是一个包含众多工具方法的 loC (控制反转)容器,属于第三方库,所以我们在使用 Spring 的时候需要为项目注入相关依赖,既然是容器就有两个最基本的功能,存储和取出。

2. 存储 Bean 对象

  • 创建 Bean 对象 (就是普通类的实例化对象)
  • 将Bean 对象注册(配置)到:Spring 的配置文件 【.xml 文件】

 

文件名是自定义的,但是尽量保持规范,在从 Spring 中取出 Bean 对象的时需要用到配置文件名。如何注入请看上文解析……

3. 获取 Bean 对象

  • 获取 Spring 上下文对象(管理着 Bean对象)获得的方式有两种:ApplicationContext 接口(官方推荐),Beanfactory (老版本)
  • 从上下文对象中获取某一个对象调用getBean() 方法,该方法有三种获取方式,根据bean 对象的  ID (标识)获取根据 Bean 对象类型获取,缺点:第一个需要强制类型转换,第二个在出现同类型的 Bean 对象的时候程序会报错。所以推荐使用第三种做法: 根据 Bean 对象 ID 和 对象类型获取
  • 获取到 Bean 对象后就可以正常的使用,与我们常规的用法一样

操作流程如下图所示:


好了,到这里,【Spring 】项目创建和使用 博主已经分享完了,希望对大家有所帮助,如有不妥之处欢迎批评指正。 

下期预告:使用注解更简单的使用 Spring 

将 Bean 对象更简单的存储到 Spring :使用注解【类注解 / 方法注解】

感谢每一位观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* 

遇见你,所有的星星都落在我的头上……

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

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

相关文章

强化学习从基础到进阶-常见问题和面试必知必答[5]::梯度策略、添加基线(baseline)、优势函数、动作分配合适的分数(credit)

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

Spring Cloud - Nacos 注册发现、分级模型、配置集群、环境隔离、原理

目录 一、Nacos 安装和配置 二、Nacos 服务注册发现 2.1、将服务注册到 nacos 中 2.2、执行效果 三、Nacos 的服务分级模型及配置 3.1、分级模型 3.2、配置集群 3.3、配置 Nacos 负载均衡策略 3.4、Nacos 服务实例的权重设置 3.5、环境隔离——namespace 四、Nacos注…

真实企业做自动化测试做法,从测试用例到测试报告...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 首先&#xff0c;…

SAP MM 组织结构配置

1.定义公司代码 创建公司代码一般来说是财务去配置&#xff0c;但是我们需要去有一个基本的了解&#xff0c;这样&#xff0c;你才能理清公司代码和MM 组织的关系 配置&#xff1a;SAP IMG Enterprise Structure -》Definition -> Financial Accounting -> Edit, Copy, …

深度学习(26)——YOLO系列(5)

深度学习&#xff08;26&#xff09;——YOLO-v7&#xff08;5&#xff09; 文章目录 深度学习&#xff08;26&#xff09;——YOLO-v7&#xff08;5&#xff09;絮絮叨叨1. conv和BN的融合2. 3*3卷积的替换&#xff08;1&#xff09;1*1卷积有什么作用&#xff1f;&#xff08…

解决方案 | 照明行业数字化营销CRM平台

“数字中国”作为二十大报告的“关键词”&#xff0c;也成为各行各业的高质量发展的主旋律&#xff0c;历史悠久的中国照明产业也积极拥抱“数字化”&#xff0c;以驱动高质量发展 。作为照明行业的领军企业&#xff0c;某照明行业客户很早就意识到企业数字化转型的重要性&…

Spring事务源码详解-spring原码(二)

上篇文章介绍了事务开启&#xff0c;前面介绍了解析adviors。 spring事务源码详解-spring原码&#xff08;一&#xff09;https://blog.csdn.net/ke1ying/article/details/131360060 事务源码 先从缓存里获取&#xff0c;主要是判断循环依赖是否创建动态代理 进去wrapIfNeces…

【MOOC 作业】第3章 传输层

不是标答也不是参考答案 仅从个人理解出发去做题 1、(20分) ‍主机甲和主机乙之间已建立一个 TCP 连接&#xff0c;TCP 最大段长度为 1000 字节&#xff0c;若主机甲的当前拥塞窗口为 5000 字节&#xff0c;在主机甲向主机乙连接发送 2 个最大段后&#xff0c;成功收到主机乙发…

Java微服务金融项目智牛股 项目简介与金融知识介绍及技术特点

项目简介 金融交易平台服务于金融衍生产品&#xff0c; 包含外汇、贵金属、期货、股票。 各产品具有不同属性与交易规则&#xff0c; 本项目对标MT4等大型交易平台&#xff0c; 遵循FIX全球最广泛的金融市场通用协议。 实现从证券注册开户、行情订阅与呈现&#xff0c; 股票撮合…

JAVA 日期类Date SimpleDateFormat Calendar

1、Date日期类 类 Date 表示一个特定的瞬间&#xff0c;精确到毫秒 1.1 Date的构造函数 Date() 分配一个 Date 对象&#xff0c;以表示分配它的时间&#xff08;精确到毫秒&#xff09; Date(long date) 分配一个 Date 对象&#xff0c;表示自从标准基准时间起指定时间的毫秒数…

2023最新AI创作系统/ChatGPT商业运营版网站程序源码+支持GPT4+支持ai绘画(MJ)+实时语音识别输入+免费更新版本

2023最新AI创作系统/ChatGPT商业运营版网站程序源码支持ai绘画支持GPT4.0实时语音识别输入文章资讯发布功能用户会员套餐免费更新版本 一、AI创作系统二、系统介绍三、系统程序下载四、安装教程五、主要功能展示六、更新日志 一、AI创作系统 1、提问&#xff1a;程序已经支持G…

论洗碗哥在CSDN摸滚打爬的256个日夜

目录 机缘 收获 成就 憧憬 机缘 创作初心了为了记录一下自己的日常学习过程&#xff0c;方便自己日后去总结&#xff0c;或者遇到类似的问题的时候就可以翻阅自己的文章了。也可以加深自己的印象。其实一开始我是一个不太善于总结的人&#xff0c;机缘之下&#xff0c;听到…

机器学习之PCA算法

目录 PCA算法 PCA目标 PCA原理推导 基于最大可分性推导 基于最近重构误差推导 PCA算法流程 PCA优点 PCA缺点 基于PCA的人脸识别 PCA算法 PCA&#xff0c;即主成分分析&#xff08;Principal Component Analysis&#xff09;&#xff0c;是一种常用的降维技术&#x…

【博客674】警惕Prometheus 中的重复样本和无序时间戳错误

警惕Prometheus 中的重复样本和无序时间戳错误 1、场景 您的 Prometheus 服务器日志中是否遇到过以下错误&#xff1f; "Error on ingesting out-of-order samples" "Error on ingesting samples with different value but same timestamp" "dupli…

2023最全 Java 高频面试合集,掌握这些你也能进大厂

进大厂是大部分程序员的梦想&#xff0c;而进大厂的门槛也是比较高的&#xff0c;所以这里整理了一份阿里、美团、滴滴、头条等大厂面试大全&#xff0c;对于 Java 后端的朋友来说应该是最全面最完整的面试备战仓库&#xff0c;为了更好地整理每个模块&#xff0c;我也参考了很…

内网隧道代理技术(六)之 PowerCat反弹Shell

PowerCat反弹Shell PowerCat介绍 PowerCat是一个powershell写的tcp/ip瑞士军刀&#xff0c;看一看成ncat的powershell的实现&#xff0c;然后里面也加入了众多好用的功能&#xff0c;如文件上传&#xff0c;smb协议支持&#xff0c;中继模式&#xff0c;生成payload&#xff…

几分钟带你快速了解SpringBoot框架理论知识!

1.什么是SpringBoot SpringBoot其实就是Spring的子项目。它简化了Spring的开发难度&#xff0c;舍弃了一切可以舍弃的xml配置文件&#xff0c;提供了各种启动器&#xff0c;让程序员上手更快&#xff0c;节省了开发时间。 2.SpringBoot的优点 SpringBoot其实就是对Spring的缺…

抖音林客系统定制开发

抖音林客是一款提供旅游攻略和景点推荐的短视频社交平台&#xff0c;主要用户群体为喜欢旅游和分享生活的年轻人。从需求分析角度来看&#xff0c;可以从以下几个方面进行分析&#xff1a; 信息获取需求&#xff1a;抖音林客用户需求获取有关旅游的详细和实用的信息&#x…

Idea快捷键设置(Idea快捷键大全)

目录 友情提醒第一章、IDEA常用快捷键1.1&#xff09;快捷键&#xff1a;查找/提示类1.2&#xff09;快捷键&#xff1a;修改代码类1.3&#xff09;快捷键&#xff1a;光标移动类 第二章、如何修改快捷键2.1&#xff09;修改快捷键的方法2.2&#xff09;我修改的快捷键&#xf…

不容错过!科东软件在2023华南国际工博会等你,一起见证科技的力量!

诚挚邀请 2023年6月27-29日&#xff0c;SCIIF华南国际工业博览会即将在深圳国际会展中心&#xff08;宝安新馆&#xff09;召开。本届华南工博会汇集大批国内外头部大咖&#xff0c;将呈现一系列世界领先的技术和创新理念&#xff0c;为新型工业发展注入新动力。 科东软件作为…