Spring项目创建与Bean的存储与读取(DL)

news2024/11/22 18:35:05

文章目录

  • 一. Spring项目的创建
    • 1. 创建Maven项目
    • 2. 配置国内源
    • 3. 添加spring依赖
    • 4. 创建启动类
  • 二.储存或读取Bean对象
    • 1. 添加spring配置文件
    • 2. 创建Bean对象
    • 3. 读取Bean对象

一. Spring项目的创建

1. 创建Maven项目

第一步,创建 Maven 项目,Spring 也是基于 Maven 的。

img

2. 配置国内源

由于国外源不稳定,可能让下面第二步引入 Spring 依赖会失败,所以这里先介绍如何一下配置国内镜像源。

img

img

img
现成的settings.xml文件链接:gitee

如果你已经有了settings.xml文件,但没有配置mirror,配置内容如下:

<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>        
</mirror>

如果你是在引入相关依赖失败后进行的国内源配置,就要去本地管理jar包的目录将jar包都进行删除,然后重新刷新下载依赖即可。

img

3. 添加spring依赖

第二步,在 Maven 项目中添加 Spring 的支持(spring-context, spring-beans)

pom.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>

刷新等待加载完成。
img

4. 创建启动类

第三步,创建启动类与main方法,用来做简单的测试

java 目录创建类,写代码即可,因为这里只演示怎么创建 Spring 项目和介绍 Spring 的简单使用,不会就上线发布,就不按照 Maven 的模板目录结构来搞了。

img

二.储存或读取Bean对象

1. 添加spring配置文件

右键resources目录,新建一个spring-config.xml配置文件。
img
配置内容如下:

<?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>

2. 创建Bean对象

第一步,创建Bean对象。
比如我们要注入一个Student对象,就先的创建一个Student类。

package com.tr.demo;

public class Student {
    public void sayHi(String name) {
        System.out.println("Hello!" + name );
    }
}

然后将Bean通过配置文件,注入到spring中,即在spring配置文件中通过以下语句注入。

<bean id="student" class="com.tr.demo.Student"></bean>

spring中对象的储存是通过键值对来存储的,其中keyidvaluebeanid一般使用小驼峰命名。

img

3. 读取Bean对象

想要从 Spring 中将Bean对象读取出来,先要得到 Spring 上下文对象,相当于得到了 Spring 容器。

再通过 spring 上下文对象提供的方法获取到需要使用的Bean对象,最后就能使用Bean对象了。

ApplicationContext,也称为控制反转(IoC)容器,是 Spring 框架的核心。

实现类描述
ClassPathXmlApplicationContext(常用)加载类路径下的配置文件,要求配置文件必须在类路径下
FileSystemXmlApplicationContext可以加载磁盘任意路径下的配置文件(必须要有访问权限)
AnnotationContigApplicationContext用于读取注解创建容器
import com.tr.demo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class APP {
    public static void main(String[] args) {
        // 1. 得到上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2. 获取 bean 对象,这里根据 id 获取
        Student student = (Student) context.getBean("student");
        // 3. 使用 bean 
        student.sayHi("张三");
    }
}

运行结果:

img

还可以使用 Bean 工厂(旧)来获取 Bean。

import com.tr.demo.Student;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class APP2 {
    public static void main(String[] args) {
        // 1. 得到 bean 工厂
        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
        // 2. 获取 bean 对象
        Student student = (Student) factory.getBean("student");
        // 3. 使用 bean
        student.sayHi("李四");
    }
}

但实际上并不推荐使用这种方式,算是过时代的方式了,因为旧时期需要考虑内存占用的问题,而现在内存资源没有这样的问题了。

运行结果:

img

此时我们可以发现,ApplicationContextBeanFactory都可以从容器中获取Bean,都提供了getBean方法,最终的效果是一样的。

🍂那么,ApplicationContextBeanFactory有什么区别?
🎯相同点:

  • 都是容器管理对象,都可以从容器中获取Bean,都提供了getBean方法。

🎯不同点:

  • ApplicationContextBeanFactory的子类, BeanFactory只提供了基础访问Bean对象的功能,而ApplicationContext除了拥有 BeanFactory的全部功能,还有其他额外功能的实现,如国际化,资源访问以及事务传播方面等功能的支持。
  • 它们两加载Bean的机制也是不同的,BeanFactory按需加载Bean,属于懒汉方式,使用它程序启动快,在后期获取对象时会慢一些;而ApplicationContext是饿汉方式,在创建时会将一次性将所有的Bean都加载,这种方式启动慢,启动之后获取对象就非常快了。

这里验证一下他们两的加载机制:
我们在 com.tr.demo 目录下再添加一个Teacher类,并完善TeacherStudent类的构造方法,这样当类被构造时会给出一些提示信息,在获取上下文或工厂时根据这些信息我们就可以知道Bean是否会被构造。

package com.tr.demo;

public class Teacher {
    public Teacher() {
        System.out.println("Teacher 已加载!");
    }
    public void sayHi(String name) {
        System.out.println("Hello!" + name );
    }
}

package com.tr.demo;

public class Student {
    public Student() {
        System.out.println("Student 已加载!");
    }
    public void sayHi(String name) {
        System.out.println("Hello!" + name );
    }
}

img

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

public class APP3 {
    public static void main(String[] args) {
        // 1. 得到上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    }
}

运行结果:

程序启动,ApplicationContext创建时,会将所有的Bean对象都构造,类似于饿汉的方式。
img

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class APP4 {
    public static void main(String[] args) {
        // 1. 得到 bean 工厂
        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
    }
}

运行结果:

程序启动,在BeanFactory创建时,结果中没有如何输出,只要不去获取使用Bean就不会去加载,类似于懒汉的方式。

imggetBean方法,其实是有三种使用方式的,具体如下:
1️⃣方式1:根据Bean的名字来获取

Student student = (Student) context.getBean("student");

这种方式返回的是一个Object对象,需要我们去进行强制类型转换。

2️⃣方式2:根据Bean类型获取

Student student = context.getBean(Student.class);

这种方式当beans中只有一个类的实例没有问题,但是个有多个同类的实例,会有问题,即在 Spring 中注入多个同一个类的对象,就会报错。

我们来试一下,首先在 Spring 配置文件,注入多个Student对象:
img
然后我们再通过这种方式来获取对象,运行结果如下:

抛出了一个NoUniqueBeanDefinitionException异常,这表示注入的对象不是唯一的。

img

3️⃣方式3:根据名称 + 类型获取

Student student = context.getBean("student",Student.class);

相比方式1,更加健壮和优雅,也没有方式 2 中的问题

img

总结

通篇下来涉及以下流程:

①创建 Spring 项目

②存储 Bean

  1. 先创建 Bean 对象
  2. 将 Bean 在 pring-config.xml 中进行配置

③取对象

  1. 得到 Spring 上下文,读取 Spring 配置文件
  2. 获取 Bean 对象
  3. 使用 Bean 对象(可选项)
    img

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

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

相关文章

LAZYSYSADMIN1靶机详解

LAZYSYSADMIN1靶机复盘 一个五分钟就能结束的靶机&#xff0c;非常快。 下载地址&#xff1a;https://download.vulnhub.com/lazysysadmin/Lazysysadmin.zip nmap对这个ip进行单独扫描后发现开启的服务挺多。 就直接枚举了一下这个服务器的内容&#xff0c;发现了一个用户名…

试验数据管理平台解决方案-MDM

试验是汽车研发、生产制造和售后保障过程中必不可少的重要环节。试验员曾到过寒区、热区、高原、沙漠和山路等恶劣环境下的场地来对试验车辆进行相关试验。这是因为汽车在不同的道路、地理和气候条件下行驶时&#xff0c;其性能、效率、可靠性和耐久性等技术特性也会发生变化。…

2023四大进销存软件推荐,第一款适合中小商户使用!

在当今竞争激烈的商业环境中&#xff0c;企业或商户迫切需要使用进销存管理软件&#xff0c;来优化库存控制、提高运营效率、降低成本&#xff0c;并加强与供应链合作伙伴之间的协作和沟通。 为了帮助企业选择适合自己需求的进销存软件&#xff0c;我们特别整理了2023年市面上比…

选择适合的接口测试工具,助力高效在线接口测试

选择适合的接口测试工具&#xff0c;助力高效在线接口测试 接口测试工具在软件开发中扮演着重要的角色。本文将重点介绍不同类型的接口测试工具&#xff0c;特别是在线接口测试工具&#xff0c;探讨其优势和适用场景&#xff0c;帮助您选择适合的工具&#xff0c;提高接口测试…

4、深入理解ribbon

一、负载均衡的两种方式 服务器端负载均衡 传统的方式前端发送请求会到我们的的nginx上去&#xff0c;nginx作为反向代理&#xff0c;然后路由给后端的服务器&#xff0c;由于负载均衡算法是nginx提供的&#xff0c;而nginx是部署到服务器端的&#xff0c;所以这种方式又被称为…

【Linux】多线程(二)

文章目录 生产者消费者模型为何要使用生产者消费者模型生产者消费者模型优点基于BlockingQueue的生产者消费者模型条件变量条件变量代码 POSIX信号量基于环形队列的生产消费模型 生产者消费者模型 为何要使用生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和…

qt与opencv学习记录

qtopencv开发入门&#xff1a;4步搞定环境配置-1_哔哩哔哩_bilibili qtopencv开发入门&#xff1a;4步搞定opencv环境配置2_哔哩哔哩_bilibili 文章内容来自上面两个视频&#xff0c;感谢创作者。 ps&#xff1a;配置环境的过程中&#xff0c;遇到了很多问题&#xff0c;我…

UML 图

统一建模语言&#xff08;Unified Modeling Language&#xff0c;UML&#xff09;是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。 UML 从目标系统的不同角度出发&#xff0c;定义了用例图、类图、对象图、状态图、活动图…

网络流量监控分析

网络管理员是维护健全网络基础设施的关键&#xff0c;这通常是一项艰巨的任务&#xff0c;因为管理员需要 24x7 全天候监控和管理网络和服务器。但是&#xff0c;即使进行全天候监控&#xff0c;每个网络也容易受到带宽占用的影响&#xff0c;如果导致关键业务应用程序变慢&…

CSS 实现 Turbo 官网 3D 网格线背景动画

转载请注明出处&#xff0c;点击此处 查看更多精彩内容 查看 Turbo 官网 时发现它的背景动画挺有意思&#xff0c;就自己动手实现了一下。下面对关键点进行解释说明&#xff0c;查看完整代码及预览效果请 点击这里。 简单说明原理&#xff1a;使用 mask-image 遮罩绘制网格&a…

二叉树--C语言实现数据结构

本期带大家一起用C语言实现二叉树&#x1f308;&#x1f308;&#x1f308; 1、二叉树的定义 二叉树是一种特殊的树状数据结构&#xff0c;它由节点组成&#xff0c;每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点 二叉树的链式存储结构是指用 链表 来表示…

公司私服Maven踩坑,项目配置都OK但是包就是下载不下来【已解决】

我的问题是公司的私服Maven下载不下来&#xff0c;因为公司保密协议&#xff0c;这里用阿里云为例&#xff01; 具体的至少参考&#xff1a;(32条消息) 这篇博文只讲MirrorOf_Java软件工程师的博客-CSDN博客 1&#xff1a;Java的Maven爆红了就找到资源库&#xff0c;然后把对于…

2.10messagebox弹窗

2.10messagebox弹窗 messagebox部件 其实这里的messagebox就是我们平时看到的弹窗。 我们首先需要定义一个触发功能&#xff0c;来触发这个弹窗 这里我们就放上以前学过的button按钮 tk.Button(window, texthit me, commandhit_me).pack()通过触发功能&#xff0c;调用messa…

超高性能协议框架fury完爆protostuff(附性能测试对比)

简单介绍: 序列化框架是系统通信的基础组件&#xff0c;在大数据、AI 框架和云原生等分布式系统中广泛使用。当对象需要跨进程、跨语言、跨节点传输、持久化、状态读写、复制时&#xff0c;都需要进行序列化&#xff0c;其性能和易用性影响运行效率和开发效率。 Fury 是一个基于…

3.2.18 DIR函数的补充说明

【分享成果&#xff0c;随喜正能量】人与人之间都是相互的&#xff0c;你给人搭桥&#xff0c;别人为你铺路&#xff1b;你让人难堪&#xff0c;别人给你添堵。。 我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效…

【小梦C嘎嘎——启航篇】C++ 基础中的精华(二)

【小梦C嘎嘎——启航篇】C 基础中的精华&#xff08;二&#xff09;&#x1f60e; 前言&#x1f64c;1、引用的使用场景1.1 做参数1.2 做返回值 2、const修饰 的引用2.1 权限上的探讨2.1.1权限放大2.1.2 权限平移2.1.3 全新缩小 4、函数重载的延伸条件编译&#xff1a; 条件编译…

自定义类型详解(C语言)

自定义类型 一. 结构体1.1 什么是结构体1.2 结构体的声明1.3 特殊的声明1.4 结构体的自引用1.5 结构体变量的定义和初始化1.5.1 结构体变量的定义1.5.2 结构体变量的初始化 1.6 结构体内存对齐1.6.1 为什么存在内存对齐 1.7 修改默认对齐数1.8 结构体传参 二. 位段2.1 什么是位…

PVE安装好后拔显卡后连接不了网络

目录 前因 原因 解决办法 前因 前几天装了个​Proxmox​ ve当做一个服务器7*24开机 但是由于转好系统后&#xff0c;显卡就不需要了 加上它耗电的原因&#xff08;我的gtx650平时空载有10w左右的功耗&#xff09; 我在想拔显卡拔了&#xff0c;我用xshell进行ssh连接不就…

MVCC:多版本并发控制

MVCC 1. MVCC是什么2. 快照读和当前读2.1 快照读2.2 当前读 3. Read View3.1 Read View中含有什么内容3.2 ReadView的规则 4. MVCC整体操作流程 1. MVCC是什么 MVCC&#xff08;Multi Version Concurrency Control&#xff09;&#xff0c;多版本并发控制&#xff1b;MVCC用于…

【数学建模】——相关系数

第一部分&#xff1a;皮尔逊相关系数的计算以及数据的描述性统计 本讲我们将介绍两种最为常见的相关系数&#xff1a;皮尔逊person相关系数和斯皮尔曼spearman等级相关系数。它们可以用来衡量两个变量之间的相关性的大小&#xff0c;根据数组满足的不同条件&#xff0c;我们要选…