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 框架的支持

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>
xml 复制代码
<?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 复制代码
<?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 中就可以

xml 复制代码
<bean id="user" class="com.wjh.demo.UserService"></bean>

3.从容器中获取 Bean 对象

1.得到 Spring 上下文对象

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

2.获取到 Bean 对象

java 复制代码
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 对象

java 复制代码
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

java 复制代码
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 类

java 复制代码
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();*/
    }
}
java 复制代码
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
java 复制代码
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. 根据 名称 + 类型 获取
java 复制代码
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.操作流程图

相关推荐
Magnetic_h11 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
研梦非凡12 小时前
ICCV 2025|从粗到细:用于高效3D高斯溅射的可学习离散小波变换
人工智能·深度学习·学习·3d
limengshi13839213 小时前
机器学习面试:请介绍几种常用的学习率衰减方式
人工智能·学习·机器学习
知识分享小能手13 小时前
React学习教程,从入门到精通,React 组件核心语法知识点详解(类组件体系)(19)
前端·javascript·vue.js·学习·react.js·react·anti-design-vue
周周记笔记14 小时前
学习笔记:第一个Python程序
笔记·学习
优雅鹅14 小时前
ARM、AArch64、amd64、x86_64、x86有什么区别?
arm开发·学习
..过云雨14 小时前
05.【Linux系统编程】进程(冯诺依曼体系结构、进程概念、进程状态(注意僵尸和孤儿)、进程优先级、进程切换和调度)
linux·笔记·学习
咸甜适中15 小时前
rust语言 (1.88) egui (0.32.2) 学习笔记(逐行注释)(二十八)使用图片控件显示图片
笔记·学习·rust·egui
wuxuanok16 小时前
SpringBoot -原理篇
java·spring boot·spring
backordinary17 小时前
微服务学习笔记25版
java·java-ee