JavaEE进阶学习:Spring 的创建和使用

Spring 就是⼀个包含了众多工具方法的 IoC 容器。既然是容器那么它就具备两个最基本的功能:

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

接下来使用 Maven 方式来创建一个 Spring 项目,创建 Spring 项目和 Servlet 类似,
在 Java 语言中对象也叫做 Bean,所以后面咱们再遇到对象就以 Bean 著称。

1.创建 Spring 项目

接下来使用 Maven 方式来创建一个 Spring 项目,创建 Spring 项目和 Servlet 类似,总共分为以下3步:

  1. 创建⼀个普通 Maven 项目
  2. 添加 Spring 框架支持(spring-context、spring-beans)
  3. 添加启动类

1.创建一个普通 Maven 项目

在这里插入图片描述

2.添加 Spring 依赖

在项目的 pom.xml 中添加 Spring 框架的支持

<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>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>test-2023-11-15</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

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

</project>

3.创建启动类

在这里插入图片描述

2.将 Bean 对象存储到 Spring (IoC容器)

1.创建一个 Bean 对象

在这里插入图片描述

2.将 Bean 存储到 Spring 中

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

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

接下来,再将 User 对象注册到 Spring 中就可以

<bean id="user" class="com.wjh.demo.UserService"></bean>

在这里插入图片描述

在这里插入图片描述

3.从容器中获取 Bean 对象

1.得到 Spring 上下文对象

在这里插入图片描述

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

2.获取到 Bean 对象

在这里插入图片描述

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

        //2.得到 Bean
        context.getBean("user");
    }
}

3.使用 Bean 对象

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

        //2.得到 Bean [依赖查找 -> IoC 的一种实现]
        UserService userService = (UserService) context.getBean("user");

        //3.使用 Bean 对象
        userService.sayHello();
    }
}

在这里插入图片描述

4.方法2

public class App2 {
    public static void main(String[] args) {
        //1.得到 Spring 上下文对象
        BeanFactory context = new XmlBeanFactory(
                new ClassPathResource("spring-config.xml"));

        //2.获取 Bean
        UserService userService = (UserService) context.getBean("user");

        //3.使用 Bean
        userService.sayHello();
    }
}

在这里插入图片描述

5.ApplicationContext 和 BeanFactory 的区别

保证线程安全问题:
1.使用锁 ( synchronized 锁升级的流程)
2.使用线程安全的容器 (底层锁实现)
3.ThreadLocal (本地线程变量)

相同点 :

  1. 都是容器管理对象,都可以获取到 Bean 对象

不同点:

  1. ApplicationContext 属于 BeanFactory 的子类,ApplicationContext 拥有更多的功能(对国际化支持、资源访问支持、以及事件传播等方面的支持…)
  2. 加载 Bean 机制不同:
    BeanFactory 懒加载,按需加载(使用一个 Bean 加载一个 Bean)
    ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象

我们加入一个 Student 类

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

       /* //2.得到 Bean [依赖查找 -> IoC 的一种实现]
        UserService userService = (UserService) context.getBean("user");

        //3.使用 Bean 对象
        userService.sayHello();*/
    }
}

在这里插入图片描述

public class App2 {
    public static void main(String[] args) {
        //1.得到 Spring 上下文对象
        BeanFactory context = new XmlBeanFactory(
                new ClassPathResource("spring-config.xml"));

/*        //2.获取 Bean
        UserService userService = (UserService) context.getBean("user");

        //3.使用 Bean
        userService.sayHello();
 */
    }
}

在这里插入图片描述

在这里插入图片描述

6.getBean 方法的更多用法

  1. 根据名称获取 Bean

在这里插入图片描述

  1. 根据类型获取 Bean
public class GetBeanExample {
    public static void main(String[] args) {
        //1.得到上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        //2.获取 Bean
        UserService userService = context.getBean(UserService.class);

        //3.使用 Bean
        userService.sayHello();
    }
}

在这里插入图片描述

区别就是:当有⼀个类型被重复注册到 spring-config.xml 中时,只能使用根据名称获取了

  1. 根据 名称 + 类型 获取
public class GetBeanExample {
    public static void main(String[] args) {
        //1.得到上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        //2.获取 Bean
        UserService userService = context.getBean("user", UserService.class);

        //3.使用 Bean
        userService.sayHello();
    }
}

在这里插入图片描述

4.操作流程图

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

淘宝客APP源码/社交电商自营商城源码/前端基于Uniapp开发

淘宝客APP源码&#xff0c;前端基于Uniapp开发的社交电商自营商城源码。Thinkphp的后台&#xff0c;不是很标准&#xff0c;感兴趣的可以自行研究。 商城功能 1、首页基础装修&#xff1b;2、丰富选品库&#xff1b;3、淘口令解析&#xff1b;4、支持京东&#xff1b;5、支持…

免费IDEA插件分享:Apipost-Helper

今天给大家推荐一款IDEA插件&#xff1a;Apipost-Helper-2.0&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;无需安装、打开任何其他软件&#xff1b;写完代码IDEA内一键调试&#xff0c;无需安装、打开任何其他软件&#xff1b;生成API目录树&#xff0c;双击即可快速…

day18_多线程

今日内容 零、 复习昨日 一、作业 二、线程安全的集合 三、死锁 四、线程通信 五、线程池 零、 复习昨日 见晨考 一、线程安全[重点] 1.0 线程不安全 当前线程的数据被其他线程修改 1.1 线程安全 临界资源&#xff1a;共享资源(同⼀个对象)&#xff0c;一次只可以有一个线程操…

cudnn安装

安装地址 cudnn安装地址&#xff1a;https://developer.nvidia.com/rdp/cudnn-download 安装 选择windows版本的下载&#xff0c;我这里选择的这个&#xff1a; 下载之后解压即可。 后续 后续&#xff1a;第一步 把cudnn的bin&#xff0c;include&#xff0c;lib三个文件…

k8s之Helm

理论&#xff1a; 什么是 He lm 在没使用 helm 之前&#xff0c;向 kubernetes 部署应用&#xff0c;我们要依次部署 deployment、svc 等&#xff0c;步骤较繁琐。 况且随着很多项目微服务化&#xff0c;复杂的应用在容器中部署以及管理显得较为复杂&#xff0c;helm 通过打包…

树莓派连接NOKOV接收动作捕捉数据:通过SDK进行

NOKOV度量动作捕捉系统支持通过SDK与树莓派通信&#xff0c;将动作捕捉数据实时传输给树莓派。 一、形影软件设置 1、首先打开形影动捕软件&#xff0c;加载一段后处理数据。这里选择了一段小车飞机的协同数据。 在这个数据里面可以看到&#xff0c;整个场景里面有两个刚体&a…

JS-项目实战-代码优化-事件动态绑定

1、鼠标悬浮和离开事件.js //当页面加载完成后执行后面的匿名函数 window.onload function () {//get:获取 Element:元素 By:通过...方式//getElementById()根据id值获取某元素let fruitTbl document.getElementById("fruit_tbl");//table.rows:获取这个表格…

零代码数字孪生设计平台的功能特点

在当今数字化的时代&#xff0c;企业的转型已经成为必然的趋势。而在这个过程中&#xff0c;3D数字孪生无代码编辑工具正成为企业实现数字化转型的新价值点。客户可以无需任何专业知识和专业软件的支持&#xff0c;仅仅通过互联网和浏览器即可根据购买要求对自己的产品/设备/园…

RGB转Bayer,一个小数点引发的血案

前几天写了一个RGB数据转Bayer格式的函数&#xff0c;经过测试功能正常。后来把这个函数用到一个数据库构建中&#xff0c;结果数据库出来的结果一直是一张黑图&#xff0c;追查了好几个小时&#xff0c;总算把这只虫子找出来了&#xff0c;原来是一个整数后面的小数点作祟。 …

Flume(一)【Flume 概述】

前言 今天实在不知道学点什么好了&#xff0c;早上学了3个多小时的 Flink &#xff0c;整天只学一门技术是很容易丧失兴趣的。那就学点新的东西 Flume&#xff0c;虽然 Kafka 还没学完&#xff0c;但是大数据生态圈的基础组件也基本就剩这倆了。 Flume 概述 生产环境中的数据一…

最佳实践-使用Github Actions来构建跨平台容器镜像

概述 GitHub Actions 是一种持续集成和持续交付 (CI/CD) 平台&#xff0c;可用于自动执行生成、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求&#xff0c;或将合并的拉取请求部署到生产环境。 GitHub Actions 不仅仅是 DevOps&#xff0c;还允许您在存…

【评论送书】十本架构师成长和软件架构技术相关的好书(可以任选)

正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 参与规则 本次送书1~5本参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff08;从评论区…

asp.net core mvc之 过滤器

过滤器允许我们在Action执行之前和执行之后去执行一下业务代码 一、过滤器的作用域 1、全局过滤器&#xff0c; 在Startup.cs文件中注册 2、控制器过滤器&#xff0c; 在控制器类上面使用标注 3、action过滤器 二、全局过滤器使用 1、在 core 目录&#xff0c;添加 TestA…

选择墨西哥专线双清包税前需要了解什么?

选择墨西哥专线双清包税前&#xff0c;需要了解以下几个方面的情况&#xff1a; 1. 墨西哥市场的需求和特点&#xff1a;首先需要了解墨西哥的市场需求和特点&#xff0c;包括消费者对于产品的偏好、消费习惯、购买力等。对于汽配零件行业来说&#xff0c;需要了解墨西哥汽车市…

@postmapping 定义formdata传参方式

背景&#xff1a;feign声明接口&#xff0c;传对象&#xff0c; 但是对象那边没有用requestBody接收&#xff1b; 前端调它也是走的formdata&#xff0c;所以不改变源代码&#xff0c;以及补新接口的情况下&#xff0c;我也需要formdata传参&#xff1b; 不然数据传不过去会为空…

java常用的几个图片处理工具对Tiff文件的支持

ImageMagick 官网 https://imagemagick.org/&#xff0c; 支持多种格式。命令行工具很适合调试。功能很强大. 还有一款工具GraphicsMagick 是从ImageMagick的基础上研发出来的。 OpenCV 官网 https://opencv.org/ &#xff0c; github地址https://github.com/opencv/opencv&…

Python+selenium自动化测试

批量执行完用例后&#xff0c;生成的测试报告是文本形式的&#xff0c;不够直观&#xff0c;为了更好的展示测试报告&#xff0c;最好是生成HTML格式的。 unittest里面是不能生成html格式报告的&#xff0c;需要导入一个第三方的模块&#xff1a;HTMLTestRunner 一、导入HTML…

kubernetes集群编排(12)

目录 istio 部署 部署示例应用 部署遥测组件 流量管理 熔断 istio 官网&#xff1a;https://istio.io/latest/zh/about/service-mesh/ 部署 demo专为测试准备的功能集合 [rootk8s2 ~]# tar zxf istio-1.19.3-linux-amd64.tar.gz [rootk8s2 ~]# cd istio-1.19.3/ [rootk8s2 isti…

总结 MyBatis 的XML实现方法(使用XML使用实现数据的增删改查操作)

MyBatis是一个优秀的持久层框架&#xff0c;它的XML配置文件是实现数据库操作的关键之一。通过XML文件&#xff0c;可以定义SQL语句、映射关系和一些高级功能。下面将探讨下如何使用MyBatis的XML配置文件实现数据的增、删、改、查操作。 1.配置文件 首先要确保 mybatis-confi…