Spring 项目的创建和 “使用“

news2024/11/23 22:20:25

目录

1. 创建 Spring 项目

1.1 创键一个 Maven 项目【无需模板】

1.2 添加 Spring 依赖【Spring-context/Spring-beans】

1.3 创建一个启动类

2. 将对象存储到 Spring 中

2.1 创建一个 bean 对象

2.2 将 bean 注册到 Spring 中【使用 Spring 配置文件进行注册】

3. 从 Spring 中取出 bean 对象

3.1 得到 Spring 上下文对象

3.2 从 Spring 上下文对象中获取出 bean 对象

3.2.1 根据名称获取 bean 和 根据类型获取 bean 的弊端

 3.2.2 根据名称和类型一起来获取 bean (bean id + Class 参数)

3.3  使用 bean

4. 总结 Spring 的创建和使用


1. 创建 Spring 项目

1.1 创键一个 Maven 项目【无需模板】

1.2 添加 Spring 依赖【Spring-context/Spring-beans】

大家可以去中央仓库拉取, 也可以直接复制下面代码粘贴到 Spring 项目中 pom.xml 下 <dependency></dependency> 标签中.

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

 【注意事项】

我们在添加完依赖时, 一定要切记点击 IDEA 右边 maven 的 Reload,  如果 IDEA 项目中出现下图中相关依赖信息, 则表示添加依赖成功了.

1.3 创建一个启动类

 

public class App {
    public static void main(String[] args) {
        // 后续实现
    }
}

2. 将对象存储到 Spring 中

2.1 创建一个 bean 对象

 

包名可以自己随意取, 也可以直接在 java 包下直接创建(不方便管理).

public class User {
    public void doUser() {
        System.out.println("do User !");
    }
}

bean : 在 Java 中, 那些会被多次使用的对象就叫做 bean. 在 Spring 当中, 我们的对象要托管到 Spring 中, 就意味着有多个地方需要使用到这些对象, 所以就称之为 bean.

2.2 将 bean 注册到 Spring 中【使用 Spring 配置文件进行注册】

【第一步】创建 Spring 配置文件

我们首先需要在 resource 包下创建一个 spring-config.xml 配置文件, 当然名字随便取, 无所谓, 我只是为了词达意. 然后将以下代码复制粘贴到创建好的 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"
       xmlns:content="http://www.springframework.org/schema/context"
       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 中

<bean id="user" class="com.hl.User"></bean>

1. 一个这样的 bean 标签, 就表示我们要将一个 bean 对象托管到 Spring 中.

2. 此处的 id 就相当于寄快递时填写的电话号码, 因为我可能要托管多个 bean 对象到  Spring 中, 当我去获取对象的时候, 就需要根据这个 id 来取; 然后 class 就相当于是寄包裹时填写的地址. 

id : 标识, 取对象 (bean) 使用        class : 存储 bean 位置 (包名 + 类名 -> 定义到唯一对象)

3. id 的名字可以随便取, 此处是为了词达意, 你取zhangsan, lisi 都没关系, 只是合法不合理.

经过以上操作, 我的 bean 对象是否已经存储到 Spring 中了呢 ?

其实并没有, 上述操作只是声明了我要存储对象到 Spring 当中. 当程序正儿八经的执行的时候, Spring 采用的是懒加载(单例模式中的懒汉模式), 在启动 Spring 项目的时候, 它不会立即的去将 bean 存储到 Spring 中, 这是它实现上的一个策略, 这也是广义上和狭义上的一个区别, 就类似于并和并行两者之间的区别一样, 初学的时候, 站在广义的角度上便于理解.

3. 从 Spring 中取出 bean 对象

3.1 得到 Spring 上下文对象

此处是在 App 类中的 main 方法实现的: 下面这两个类都来自于 Spring 框架. 

ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

【注意事项】 

要 保证括号中的参数 spring-config.xml 要和前面创建的配置文件的名称一样.  

如果不一样, 那么 IDEA 不会报错, 但是程序运行起来就会报错. 

 

除了这种方法可以拿到 Spring 上下文对象之外, 我们还可以使用 BeanFactory 来作为 Spring 上下文对象. 使用 ApplicationContext 或者 BeanFactory 来获取 Spring 上下文对象, 是同样的效果, 只不过 ApplicaitonContext 是 BeanFactory 的一个子类.

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

【ApplicaitonContext 和 BeanFactory 的区别】

相同点: 都是用来获取 Spring 上下文对象的.

不同点: 

  • 继承关系层面分析: ApplicationContext 属于 BeanFactory 的子类, ApplicationContext 具备了 BeanFactory 所有的功能和能力.
  • 功能层面分析: BeanFactory 只具备最基础访问 bean 的能力, 而 ApplicationContext 具备更多能力, 比如: 国际化支持, 资源访问支持....这就好比儿子不仅继承了父亲的商业帝国, 还有一些自己的能力.
  • 性能和加载方式: BeanFactory 是按需加载 (懒加载), 当需要使用 bean 的时候再加载; 而 ApplicationContext 是一次性加载完所有的 bean. 这就好比儿子出国留学后学到了很东西, 接管了父亲的商业帝国后, 有了新的管理方式 (青出于蓝而胜于蓝).  懒加载的好处是节省资源, 而随着时间的推移, 对于程序来说最大的提升就是物理硬件的提升, 当我的资源足够充足时, 我不再去节省那一点资源了, 我要的是性能, 所以选择一次性加载并初始化所有的 bean 对象, 这种方式只有第一次加载比较慢, 当我加载完之后, 以后无论我是第一次访问还是第几次访问, 我的速度都是极快的.相当于是牺牲空间换取时间.

3.2 从 Spring 上下文对象中获取出 bean 对象

User user = new User();  // 传统的方式

// 3.2.1 根据一个 String 参数获取 bean 【根据名称获取 bean 对象】
User user = (User) context.getBean("user");  // 从 Spring 中获取

【注意事项】

getBean()  括号里的 "user" 就是前面在将 bean 注册到配置文件中时, <bean> 标签里面的 id 标识. bean 标识一定要写正确, 否则程序运行时就会报错.

【对比两种获取 bean 的方式】

1. 传统的方式得到 bean 对象, 对象的生命周期只在当前程序有效, 下次调用还得继续 new , 而且获取对象的时候, 还需要跟着构造方法的参数来改变, 很麻烦, 并且存在代码的耦合.

2. 而从 Spring 上下文中获取就可以做到随用随取, 不用 new , 也不用关心参数问题. 

从 Spring 中获取出 bean 对象除了上面这种根据一个String 参数获取 bean 之外, 还有另外两种方式.  先介绍第二种方式:  根据 Class 参数获取 bean 【根据类型获取 bean 对象】

// 3.2.2 根据一个 Class 参数获取 bean
User user = context.getBean(User.class);

3.2.1 根据名称获取 bean 和 根据类型获取 bean 的弊端

前两种方式虽然很简单, 但都有美中不足的地方【弊端】, 怎么说 >>

对于从 Spring 中根据 String 获取 bean 对象的方式, 当张三和李四在同一家公司干活的时候, 假设他俩同时都需要使用到 User 对象, 由于协同开发, 当张三前面在 Spring 配置文件中已经注册了 User bean 对象时, 李四没有几时发现, 由于他也需要使用 User bean 对象, 于是他也在配置文件中存储了 User bean 对象, 并且两个 bean 标识都一样, 此时再根据 String 的方式去获取 User 对象时, 就会抛如下异常:  这种情况虽然可以避免, 但是它的这种强转的写法还是显得不够简单.

 关键异常信息:

 对于从 Spring 中根据 Class 参数获取 bean 对象的方式. 还是刚才那个例子, 张三和李四同时都需要使用 User bean 对象, 他俩都同时在 Spring 配置文件中注册了 User bean 对象, 但是这次李四及时发现了张三也注册了 User bean 对象, 于是他注册 bean 时, 就换了一个标识,叫做 user2 , 此时根据 Class 参数获取 User bean 对象时, 就会抛出如下异常:

 关键异常信息:

 3.2.2 根据名称和类型一起来获取 bean (bean id + Class 参数)

// 根据名称 + 类型来获取 bean 
User user = context.getBean("user", User.class);

这种方式看似和第一种差不多, 但是第三种写法还是更加稳健的, 比如当我们获取到的 bean 对象为 null 时, 第一种方式进行强转就不太合适. 而根据 id + Class 来获取 bean 的写法是有双重保险的.

3.3  使用 bean

此处的使用 bean 是非必须步骤. 使用 bean 我们可以去调用它里面的 doUser() 方法.

user.doUser();

 

4. 总结 Spring 的创建和使用

1. 创建 Spring 项目, 相当于得到容器.

2. 存储 bean 对象

  • 创建 bean
  • 将 bean 对象注册到 Spring 配置文件中 (spring-config.xml)

3. 取对象

  • 拿到 Spring 上下文
  • 获取 bean 对象
  • 使用 bean 对象

基本流程图: 

 


下篇博客将讲解更加简单的读取和存储 bean 对象!!

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

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

相关文章

【树莓派不吃灰】命令篇⑧ 校准树莓派时间

目录1. systemd-timesyncd1.1 systemd-timesyncd 客户端1.2 systemd-timesyncd 服务1.3 systemd-timesyncd 配置文件1.4 timedatectl命令2. 校准时间2.1 查看时间状态2.2 校准时区2.3 没有时钟同步服务器&#xff0c;手工设置时间2.3.1 禁止ntp自动同步2.3.2 设置时间2.3.3 设置…

敏感词检测库ToolGood.Words中IllegalWordsSearch类使用简介

C#开源敏感词检测库ToolGood.Words中的类IllegalWordsSearch为过滤非法词&#xff08;敏感词&#xff09;专用类&#xff0c;可设置跳字长度&#xff0c;支持全角转忽略大小、跳词、重复词、黑名单等功能&#xff0c;本文对照参考文献1&#xff0c;对该类的用法进行简要介绍。 …

k8s资源对象service-四层负载均衡详解

理论 工作原理如图: service的定义:是一组pod的逻辑组合,通过clusterIP和服务端口接收请求,并将这些请求代理至使用标签选择器来过滤符合条件的pod对象。 作用:服务发现和服务访问,为弹性变动且存在生命周期的pod对象提供了一个固定的访问接口。 service的代理类型:…

Vue动态切换class属性:数组法、对象法

需求&#xff1a;在style里创建好不同的属性&#xff0c;后期可以给标签动态绑定这些属性&#xff0c;也可以实现属性的切换方法&#xff1a;对象法、数组法事先创建好class属性&#xff1a; <style>.aa{}.bb{}.cc{} </style> 对象法&#xff1a; <body><…

矩阵(加速)。。。

我限定你在明天中午之前搞定这东西&#xff01;毕竟之前做过了欸。矩阵&#xff0c;一个看起来很神奇的东西&#xff0c;不过我不打算花太多的时间做这个&#xff0c;还是图论和数论好点儿&#xff0c;还要复习一下之前的数据结构和dp呢。那么先谈谈定义&#xff0c;定义一个矩…

kubernetes介绍与资源管理

#kubernetes介绍与资源管理 1应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xff1a;…

CMSC5713-IT项目管理之人力资源管理Human Resources Management

文章目录9.1. Introduction9.1.1. Motivation Theories9.1.2. Influence and Power9.1.3. Motivating Team9.2. Project Human Resource Management9.3. Human Resource Planning9.3.1. Project Organization Charts9.3.2. Responsibility Assignment Matrices9.3.2.1. RACI Ch…

锐捷BFD基础实验配置

目录 BFD与静态路由联动 BFD与静态路由联动&#xff08;单跳&#xff09; BFD与静态路由联动&#xff08;多跳&#xff09; BFD与动态路由联动 配置BFD与OSPF联动 配置BFD与BGP联动 BFD与静态路由联动 BFD联动静态路由注意事项 1、配置需要联动的静态路由时&#xff0c…

Java线程池

自定义线程池 1. 简介 1.1 引入原因 1. 一个任务过来&#xff0c;一个线程去做。如果每次过来都创建新线程&#xff0c;性能低且比较耗费内存 2. 线程数多于cpu核心&#xff0c;线程切换&#xff0c;要保存原来线程的状态&#xff0c;运行现在的线程&#xff0c;势必会更加耗…

idea创建spring boot工程及配置

目录 一、dea 创建spring boot工程 二、打包 三、启动配置文件 一、dea 创建spring boot工程 new project 选择Spring Initializr ,Type&#xff1a;选择Maven&#xff0c;Java 8, Packagin 选择Jar。然后点击next 添加依赖&#xff1a; 选择Sprint Boot版本&#xff0c;选…

差分约束算法

差分约束是为了解决这样一组不等式问题&#xff1a; 这个咋解决》我们来看 对于某个下标k而言&#xff0c;提取出关于其的所有不等式&#xff0c;&#xff08;其中xk在第一个),也就是 xk-x1<m1 xk-x2<m2 xk-x3<m3....对于这些不等式相当于是 xk取min(x1m1,x2m2,x3m3…

面试常问:HTTPS的加密过程 ----- 光明和黑暗的恩怨情仇

目录 关于运营商劫持 &#xff1a; 什么是运营商劫持?? 什么是运营商? 为什么要劫持? 如何劫持? 劫持的危害 互联网公司怎么办? HTTPS 什么是HTTPS 一些概念&#xff1a; HTTPS加密 1. 对称加密&#xff1a; 2. 非对称加密 3. 非对称加密对称加密 4. 加密…

基于java+ssm购物商城网站系统-计算机毕业设计

项目介绍 乐优购物商城是商业贸易中的一条非常重要的道路&#xff0c;可以把其从传统的实体模式中解放中来&#xff0c;网上购物可以为消费者提供巨大的便利。通过乐优购物商城这个平台&#xff0c;可以使用户足不出户就可以了解现今的流行趋势和丰富的商品信息&#xff0c;为…

请求跨域问题

在前端请求接口时&#xff0c;出现跨域是很常见的问题&#xff0c;跨域的解决方法也很多&#xff0c;但是目前通用的是以下两种方式&#xff1a; 开发环境生产环境在服务端配置 CORS在服务端配置 CORS配置开发服务器代理&#xff0c;比如 vite-server.proxy配置生产服务器代理…

Debezium的增量快照

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a; 如常 Debezium Incremental snapshotting Introduction CDC&#xff08;Change-Data-Capture&#xff09;正…

Java之反射相关知识补充

Java之反射一、概述1、静态语言和动态语言1.1 静态语言1.2 动态语言2、Reflection(反射)2.1 介绍2.2 流程2.3 Java反射机制提供的功能2.4 优缺点&#xff08;1&#xff09;优点&#xff08;2&#xff09;缺点2.5 反射相关主要API2.6 示例二、反射相关操作1、获取Class类的实例1…

第十二节:String类【java】

目录 &#x1f4d8;1.1 字符串构造方法 &#x1f4d2;1.2 String对象怎样比较 &#x1f4dc;1.2.1 引用类型 比较的是引用中的地址。 &#x1f4c4;1.2.2 boolean equals(Object anObject) 方法&#xff1a;比较怕两个引用所指的对象当中的内容是否一致 &#x1f4d1;1.2…

企业级nginx使用

企业级nginx使用 nginx实现平滑升级 [rootlnmp nginx-1.16.0]# cd /usr/local/nginx/sbin/ [rootlnmp sbin]# ls nginx nginx.old [rootlnmp sbin]# ./nginx -v nginx version: nginx/1.16.0 [rootlnmp sbin]# ./nginx.old -v nginx version: nginx/1.14.2 [rootlnmp sbin]#操…

物联网开发笔记(49)- 使用Micropython开发ESP32开发板之控制RGB全彩LED模块

一、目的 这一节我们学习如何使用我们的ESP32开发板来控制RGB全彩LED模块。 二、环境 ESP32 RGB全彩LED模块 Thonny IDE 几根杜邦线 1&#xff0c;共阴极接线方法 2&#xff0c;共阳极接线方法 三、代码 1&#xff0c;亮指定的颜色&#xff0c;比如百度蓝。 我们使用取色…

万字长文,精美插图,带你玩转redis

资料下载&#xff1a; 链接: https://pan.baidu.com/s/1ue4Bnv4b4ifp0S0I_yOJ_w?pwdd9x9 提取码: d9x9 Redis学习笔记 1. 认识Redis 1.1 什么是NoSQL&#xff1f; SQL是关系型数据库&#xff0c;NoSQL是非关系型数据库 下面是几种非关系型数据库及其优缺点和应用场景。 分类…