Spring项目的创建和简单使用

目录

一.Spring项目的创建

二.存储Bean

2.1创建Bean对象

2.2Bean注入

三.读取Bean

3.1得到Spring上下文

3.2获取指定Bean对象

3.3为什么不使用new呢?

四.获取Bean的三种方式

4.1 BeanFactory类

 4.2两者区别

4.3获取Bean的优化操作

五.总结


 

一.Spring项目的创建

Spring项目创建分三个步骤:

  1. 创建meven项目
  2. 添加Spring框架支持
  3. 添加启动类

第一步:

第二步:添加框架:

在pom.xml里添加两个依赖: 

Spring 框架的⽀持:spring-context:spring 上下⽂,spring-beans:管理对象的模块。
 <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>

添加依赖之后,如果爆红了,表明正在下载资源,需要等待。

下载成功示例图:

注:由于有些依赖实现基于另外的依赖实现,因此下载的依赖不是一个!!!

第三步:添加启动类

 就是创建一个含有main函数的类

二.存储Bean

        Spring的灵魂就是存储管理Bean。

2.1创建Bean对象

创建一个类,任意的类,这边为一个User类:

public class User {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

2.2Bean注入

        创建成功之后,我们将Bean交给Spring保管!因此我们需要在在resources资源目录下创建一个 Spring 配置⽂件spring-config.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 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
</beans>

我们在配置文件中使用<Bean>标签,将类注入到Spring当中。 

示例图:

注:关于id名,虽然不一定需要和类名相同,将ID命名为与类名相同可能会使代码更加清晰易读。


  

三.读取Bean

3.1得到Spring上下文

        获取Spring上下文,我们可以采取ApplicationContex 类,创建时,配置一下Spring的配置文件!

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
注:ClassPathXmlApplicationContext是实现ApplicationContext接口的类,扫描配置文件(名字一定要一模一样),获取Spring容器的Bean对象

3.2获取指定Bean对象

获取Bean对象的时候,也就是从context当中获取,使用getBean()方法.

User user  = context.getBean("user", User.class);

注意:这个user就是注入到Spring容器的Id名。

3.3为什么不使用new呢?

原因有以下几点: 

  1. 松耦合:通过依赖注入,对象之间的依赖关系不再硬编码在代码中,而是由容器动态注入。这样可以减少对象之间的耦合度,使代码更加灵活、易于维护和测试。

  2. 可测试性:使用依赖注入可以更轻松地进行单元测试。在测试时,可以使用模拟对象(Mock Object)替代真实的依赖对象,从而隔离被测试的对象,使单元测试更加简单、可靠。

  3. 可扩展性:通过依赖注入,可以方便地替换和更新对象的实现,而不需要修改客户端代码。这样在系统需求变化时,可以更容易地进行扩展和修改。

  4. 更好的管理对象生命周期:Spring 容器负责管理 Bean 的生命周期,包括创建、初始化、销毁等过程。通过依赖注入,可以将对象的生命周期交给 Spring 容器管理,确保对象的合理创建和销毁,避免内存泄漏和资源浪费。

  5. AOP 支持:依赖注入是实现 Spring AOP 的基础。通过依赖注入,Spring 可以在运行时动态地创建代理对象,实现面向切面编程,例如事务管理、日志记录等功能。

或许你看不懂,但是在本专栏里,有更好的解释,你只要知道聪明的人都是靠依赖注入获取Bean

四.获取Bean的三种方式

4.1 BeanFactory类

        之前的ApplicationContext就是一种方式,但是我现在说的是另一种。

BeanFactory:

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

获取Bean的执行代码:

public class APP {public static void main(String[] args) {BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));User user  = beanFactory.getBean("user",User.class);}
}

 4.2两者区别

BeanFactoryApplicationContex 的区别:

功能上的区别: 

  • ApplicationContext 在初始化容器时就会实例化所有的 Bean,提前进行依赖注入、初始化和单例模式的创建等操作,因此启动时间相对较长,但对于用户来说,获取 Bean 时速度较快。
  • BeanFactory 在初始化容器时不会实例化所有的 Bean,而是在获取 Bean 时才进行实例化。因此启动时间较短,但是在获取 Bean 时可能会稍微慢一些。

场景上:

  • 如果应用程序需要提前加载所有的 Bean,并且对启动时间没有特别高的要求,可以选择使用 ApplicationContext
  • 如果应用程序的启动时间较为重要,而且有些 Bean 可能很少被使用,可以选择使用 BeanFactory

线程安全性

  • ApplicationContext 是线程安全的,因此可以在多线程环境下共享。
  • BeanFactory 不是线程安全的,如果需要在多线程环境下使用,需要采取额外的措施来保证线程安全性。

4.3获取Bean的优化操作

在使用上述两种类获取Bean情况下,我们可以优化一下。

 User user1  =  beanFactory.getBean("user",User.class);
User user  =  context.getBean("user",User.class);

是的,就是在这个地方优化。

1通过名称获取优化

        User user1  = (User) beanFactory.getBean("user");User user  = (User) context.getBean("user");

注意 :如果容器中没有名为 "user" 的 Bean,或者该 Bean 的类型不是 User,则会抛出 NoSuchBeanDefinitionException 异常。

2.通过类名获取

        User user1  = beanFactory.getBean(User.class);User user = context.getBean(User.class);

五.总结

  1. Spring项目的创建     
    • 创建一个Maven项目
    • 添加Spring框架依赖 【spring-context】
    • 添加启动类 【功能:为后面从Spring容器中读取Bean做准备】
  2. 存储Bean
    • 创建Bean对象
    • 将Bean注册到Spring容器中 【spring-config.xml配置文件】
  3. 读取Bean
    • 得到Spring 对象【ApplicationContext,BeanFactory】
    • 通过Spring 对象的 getBean() 方法获取到Bean对象 【DI操作】
    • 使用Bean对象 【非必须】

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海山数据库(He3DB)Redis技术实践:继承开源Redis精髓,强化升级企业级服务

数字化转型中的企业数据的处理速度和效率直接关系到企业的竞争力&#xff0c;Redis作为业界广泛使用的开源键值对存储系统&#xff0c;以其卓越的性能和丰富的数据结构&#xff0c;成为了众多开发者和企业的首选。然而&#xff0c;近期Redis开源社区对Redis协议进行了变更&…

基于SSM+Jsp+Mysql的快递管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

工作流引擎常见API(以camunda为例)

在Camunda中&#xff0c;API的继承关系主要体现在各个服务接口之间。以下是Camunda中一些常见服务接口的继承关系&#xff1a; ProcessEngineServices 接口&#xff1a; RepositoryService&#xff1a; 负责管理流程定义和部署。RuntimeService&#xff1a; 负责管理流程实例的…

植物大战僵尸Python版,附带源码注解

目录 一、实现功能 二、安装环境要求 三、如何开始游戏 四、怎么玩 五、演示 六、部分源码注释 6.1main.py 6.2map.py 6.3Menubar.py 七、自定义 7.1plant.json 7.2zombie.json 一、实现功能 实施植物&#xff1a;向日葵、豌豆射手、壁桃、雪豆射手、樱桃炸弹、三…

Linux下批量的批量操作

批量删除docker 镜像 docker images | grep ent-form-web |awk ‘{print $3}’ | xargs docker rmi docker images: 列出所有的docker 镜像 docker images | grep ent-form-web : 选取出结果带 ent-form-web的信息 docker images | grep ent-form-web |awk ‘{print $3}’ 选取…

YOLOv5实战记录05 Pyside6可视化界面

个人打卡&#xff0c;慎看。 指路大佬&#xff1a;【手把手带你实战YOLOv5-入门篇】YOLOv5 Pyside6可视化界面_哔哩哔哩_bilibili 零、虚拟环境迁移路径后pip报错解决 yolov5-master文件夹我换位置后&#xff0c;无法pip install了。解决如下&#xff1a; activate.bat中修改…

wsl 2在windows11上的设置

详细参考&#xff1a;Manual installation steps for older versions of WSL | Microsoft Learn 1.系统组件要打开 分别是&#xff1a;Hyper-V、虚拟机平台、适用于Windows的Linux子系统 2.以管理员方式运行命令行&#xff0c;逐步执行下面的命令 update to WSL 2, you must…

js爬虫puppeteer库 解决网页动态渲染无法爬取

我们爬取这个网址上面的股票实时部分宇通客车(600066)_股票价格_行情_走势图—东方财富网 我们用正常的方法爬取会发现爬取不下来&#xff0c;是因为这个网页这里是实时渲染的&#xff0c;我们直接通过网址接口访问这里还没有渲染出来 于是我们可以通过下面的代码来进行爬取: …

PowerJob 分布式任务调度简介

目录 适用场景 设计目标 PowerJob 功能全景 任务调度 工作流 分布式计算 动态容器 什么是动态容器? 使用场景 可维护性和灵活性的完美结合 实时日志&在线运维 PowerJob 系统组件 PowerJob 应用场景 PowerJob 的优势 PowerJob&#xff08;原OhMyScheduler&…

无法用raven-js,如何直接使用TraceKit标准化错误字符串(一次有趣的探索)

引子&#xff1a;网上三年前&#xff08;2020&#xff09;的文章介绍了一个raven-js 简单说就是把堆栈信息格式化兼容各浏览器&#xff0c;便于查看错误来源。 **but&#xff1a;**到处找了一下raven-js&#xff0c;已经没有官方出处了&#xff0c;只在Sentry的源码仓库里发现…

Docker使用— Docker部署安装Nginx

Nginx简介 Nginx 是一款高性能的 web 服务器、反向代理服务器以及电子邮件&#xff08;IMAP/POP3/SMTP&#xff09;代理服务器&#xff0c;由俄罗斯开发者伊戈尔塞索耶夫&#xff08;Igor Sysoev&#xff09;编写&#xff0c;并在2004年10月4日发布了首个公开版本0.1.0。Nginx…

简单了解JVM

一.JVM简介 jvm及Java virtual machineJava虚拟机&#xff0c;它是一个虚构出来的计算机&#xff0c;一种规范。其实抛开这么专业的句子不说&#xff0c;就知道 JVM 其实就类似于一台小电脑运行在 windows 或者 linux 这些操作系统环境下即可。它直接和操作系统进行交互&#…

【VS2019】x64 Native Tools Command Prompt for Vs 2019使用conda命令进入环境

【VS2019】x64 Native Tools Command Prompt for Vs 2019使用conda命令进入环境 安装完VS2019后,打开终端x64 Native Tools Command Prompt for Vs 2019,直接运行conda会出现‘conda’ 不是内部或外部命令,也不是可运行的程序 原因分析:这是因为没有设置anaconda的环境变…

SpringBoot学习笔记四

SpringBoot学习笔记四-监听机制 1. SpringBoot监听器1.1 无需配置1.1.1 CommandLineRunner使用1.1.2 ApplicationRunner的使用1.1.3 CommandLineRunner与ApplicationRunner的区别 1.2 需要创建META-INF文件&#xff0c;并在其中创建spring.factories&#xff0c;配置相关的信息…

apline安装redisjson

安装前的说明 由于redis现在下载redisjson很繁琐&#xff0c;还可能需要科学上网&#xff0c;只能自己编译了 系统是apline&#xff0c; 为什么是这个系统&#xff1f;原因是docker安装redis是用了这个系统 下载地址,按照实际情况选择&#xff0c;如果不行就老老实实自己编译吧…

【漏洞复现】用友畅捷通CRM get_usedspace存在SQL注入漏洞

0x01 阅读须知 “如棠安全的技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供…

2024年最佳网页设计师AI工具

人工智能&#xff08;AI&#xff09;正在改变设计师相当快速的工作方式&#xff0c;为更智能地工作提供新的效率。 人工智能不再只是一个流行词&#xff1b;它改变了游戏规则。但人工智能能为网页设计师做什么呢&#xff1f;新网页设计师AI工具工具可以为从内容创建到图像细化…

Thingsboard PE智慧运维仪表板实例(一)【智慧排口截污实例】

1、仪表板总览 以该实际落地项目为案例,跟着我一起搭建智慧运维大屏!社区版和专业版都通用。本文是致力于快速搭建,所以不会详细去讲Thingsboard的知识点,只讲如何配置和使用部件。 搭建仪表板的整体效果如下: 点击左侧设备列表可以查看设备详细页面: 2、设备 我的设备都…

2024年第十七届 认证杯 网络挑战赛 (C题)| 云中的海盐 | 辐射传输方程 Stefan-Boltzmann分析 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看认证杯 网络挑战赛 (C题&#xff09;&#xff01…

P1090 [NOIP2004 提高组] 合并果子

原题链接&#xff1a;[NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G - 洛谷 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 优先队列。 当堆数大于1时&#xff0c;每次将最小的两个&#xff08;最小堆的堆顶&#xff09;取出&#xff…