轻松上手:Spring环境搭建的实用指南

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: 轻松上手:Spring环境搭建的实用指南

引入依赖

<!-- 引入 Spring -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.4.RELEASE</version>
</dependency>

创建 Spring 的配置文件

Spring 的配置文件可以放在项目的任意位置,没有硬性要求,文件名称也没有要求,但是官方建议叫做:applicationContext.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">
    <!-- id:创建 Bean 的名字,要求唯一 -->
    <!-- name:创建 Bean 别名 -->
    <!-- class:创建 Bean 的全限定名 -->
    <bean name="USER,u1,u2" class="world.xuewei.User"/>
    <bean id="stu" name="student" class="world.xuewei.Student"/>
</beans>
  • id 属性:创建 Bean 的名字,要求唯一。如果这个 Bean 只需要使用一次,那么可以省略配置 id 属性,Spring 会默认分配一个名字,格式为:class属性 + ‘#数字’,数字表示在工厂中相同类型 Bean 的编码,从 0 开始,例如:world.xuewei.User#0,如果没有指定 id,但是指定了 name,那么会将 name(如果是多个 name,那么会取第一个 name)赋予给 id 属性
  • name 属性:创建 Bean 的别名,如果没有指定 name,但是指定了 id,那么会将 id 赋予 name 属性。name 可以同时指定多个,用英文逗号分隔即可:
  • class 属性:创建 Bean 的全限定名

Spring 核心 API ApplicationContext

Spring 的 ApplicationContext 是 Spring 框架中的一个关键接口,用于管理和提供应用程序的配置信息和 Bean 实例。它是 Spring IoC(控制反转)容器的实现之一,负责加载、配置和初始化 Bean,并提供对它们的访问。

ApplicationContext 提供了以下主要功能:

  1. Bean 实例化和管理:ApplicationContext 负责根据配置信息实例化和管理应用程序中的 Bean。它会解析 Bean 的定义,创建 Bean 对象,并在需要时将其注入到其他 Bean 中。
  2. 依赖注入(Dependency Injection):ApplicationContext 实现了依赖注入,即自动将依赖关系通过配置或注解方式注入到对象中。这样可以降低组件之间的耦合度,并提高代码的可维护性和可测试性。
  3. 生命周期管理:ApplicationContext 能够管理 Bean 的生命周期。它在 Bean 实例化之后,可以调用特定的回调方法来执行初始化操作,并在应用程序关闭时销毁 Bean 实例。
  4. 配置元数据的加载和解析:ApplicationContext 负责加载并解析配置文件或配置类中的元数据信息。这些元数据包含了 Bean 的定义、依赖关系、切面配置等信息。
  5. AOP 支持:ApplicationContext 提供了对面向切面编程(AOP)的支持。它可以自动为 Bean 应用切面,并将切面逻辑织入到目标对象中。

Spring 的 ApplicationContext 主要有两个主要实现:

  1. ClassPathXmlApplicationContext:从类路径下的 XML 配置文件加载和初始化应用程序上下文。它会在类路径下搜索并解析 XML 文件,将其中定义的 Bean 实例化并添加到容器中。
  2. AnnotationConfigApplicationContext:基于 Java 注解的配置方式加载和初始化应用程序上下文。它可以扫描指定的包或类,并根据注解配置来创建和管理 Bean。

这两个实现都是 ApplicationContext 接口的具体实现类,提供了不同的配置方式和灵活性,适用于不同的应用场景。

ApplicationContext 是一种重量级资源,需要在启动时加载和初始化大量的 Bean,可能带来一定的性能开销。然而,它同时也是线程安全的,可以在多线程环境中安全地使用。开发者在使用 ApplicationContext 时需要注意处理 Bean 的线程安全性问题。

常用方法测试

package world.xuewei;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Arrays;
/**
 * @author 薛伟
 * @since 2023/9/14 20:51
 */
public class MainTest {
    private ApplicationContext context;
    @Before
    public void before() {
        // 指定配置文件,创建 Spring 工厂
        context = new ClassPathXmlApplicationContext("/applicationContext.xml");
    }
    /**
     * 通过 Spring 的工厂获得对象
     */
    @Test
    public void testGetBean() {
        // 通过 Bean 的 id/name 获取对象
        User user = (User) context.getBean("user");
        // 通过 Bean 的 id/name 获取对象,同时指定 Bean 的类型,省略强转的步骤
        User user1 = context.getBean("USER", User.class);
        // 通过 Bean 的类型获取对象,注意在 Spring 的工厂中只能有唯一一个此类型的 Bean,否则会抛出异常:NoUniqueBeanDefinitionException
        User user2 = context.getBean(User.class);
        System.out.println(user);
        System.out.println(user1);
        System.out.println(user2);
    }
    /**
     * 获取工厂中 Bean 的名字
     */
    @Test
    public void testGetBeanNames() {
        // 返回工厂中所有 Bean 的 id
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        Arrays.stream(beanDefinitionNames).forEach(System.out::println);
        // 返回工厂中指定类型 Bean 的 id
        String[] beanNamesForType = context.getBeanNamesForType(User.class);
        Arrays.stream(beanNamesForType).forEach(System.out::println);
        // 判断工厂中是否存在指定 id 的 Bean的定义(只能判断 id,不能判定 name)
        boolean containsBeanDefinition = context.containsBeanDefinition("user");
        // 判断工厂中是否存在指定 id 的 Bean(既能判断 id,也能判定 name)
        boolean containsBean = context.containsBean("user");
    }
}

Spring 工厂的简单分析:

  1. 首先会根据 ApplicationContext context = new ClassPathXmlApplicationContext("/applicationContext.xml"); 来读取指定配置文件。
  2. 读取配置文件就会得到所有要管理的 Bean 的定义(id、name、class…)
  3. 通过反射创建对象 Class.forName("world.xuewei.User")
  4. 默认调用的是对象的无参构造方法,即使将构造方法定义为私有,反射的方式也可以调用!
相关文章
|
存储 缓存 安全
C++数组全解析:从基础知识到高级应用,领略数组的魅力与技巧
C++数组全解析:从基础知识到高级应用,领略数组的魅力与技巧
652 1
|
关系型数据库 MySQL 数据库
深入探讨MySQL中的幻读现象:原因、影响及解决方案
**导言:** 在数据库领域中,幻读(Phantom Read)是一个常见但容易被忽视的问题。它可能会导致事务的隔离级别无法满足预期,从而引发数据一致性问题。MySQL作为广泛使用的关系型数据库,也不免遇到幻读问题。本文将深入解析MySQL中的幻读现象,探讨其原因、影响以及可能的解决方案。
2454 0
|
7月前
|
SQL 关系型数据库 MySQL
MySQL下载安装全攻略!小白也能轻松上手,从此数据库不再难搞!
这是一份详细的MySQL安装与配置教程,适合初学者快速上手。内容涵盖从下载到安装的每一步操作,包括选择版本、设置路径、配置端口及密码等。同时提供基础操作指南,如数据库管理、数据表增删改查、用户权限设置等。还介绍了备份恢复、图形化工具使用和性能优化技巧,帮助用户全面掌握MySQL的使用方法。附带常见问题解决方法,保姆级教学让你无忧入门!
1085 21
MySQL下载安装全攻略!小白也能轻松上手,从此数据库不再难搞!
|
关系型数据库 MySQL
解决MySQL8.0本地计算机上的MySQL服务启动后停止没有报告任何错误
解决MySQL8.0本地计算机上的MySQL服务启动后停止没有报告任何错误
13901 1
|
Java API 开发者
深入理解Java中的异常处理机制
本文探讨了Java编程语言中异常处理的核心概念,包括异常类型、异常捕获与抛出、以及最佳实践。通过分析常见的异常场景和处理策略,旨在帮助开发者更好地理解和运用异常处理机制,提高代码的健壮性和可维护性。文章不仅涵盖了基本的try-catch结构,还深入讨论了自定义异常的创建与使用,以及finally块的重要性和应用。此外,还将介绍一些高级技巧,如多异常捕获和嵌套异常处理,为读者提供全面的技术指导。
263 0
|
10月前
|
Java Maven 开发者
编写SpringBoot的自定义starter包
通过本文的介绍,我们详细讲解了如何创建一个Spring Boot自定义Starter包,包括自动配置类、配置属性类、`spring.factories`文件的创建和配置。通过自定义Starter,可以有效地复用公共配置和组件,提高开发效率。希望本文能帮助您更好地理解和应用Spring Boot自定义Starter,在实际项目中灵活使用这一强大的功能。
823 17
|
XML Java 数据格式
spring之bean的生命周期以及单例多例的区别
spring之bean的生命周期以及单例多例的区别
319 0
|
弹性计算 并行计算 双11
阿里云服务器多少钱一年?2024年11月最新价格表,爆款配置清单
2024年双十一期间,阿里云推出多款优惠云服务器配置。最便宜的轻量应用服务器2核2G、3M带宽、50GB ESSD云盘,仅需36元一年;ECS云服务器2核2G、3M带宽、40GB ESSD Entry云盘,99元一年;ECS u1实例2核4G、5M带宽、80GB ESSD Entry盘,199元一年。更多配置详见官网。
1212 0
|
域名解析 网络协议
DNS服务工作原理
文章详细介绍了DNS服务的工作原理,包括FQDN的概念、名称解析过程、DNS域名分级策略、根服务器的作用、DNS解析流程中的递归查询和迭代查询,以及为何有时基于IP能访问而基于域名不能访问的原因。
1494 2
DNS服务工作原理
|
存储 机器学习/深度学习 安全
深入理解Linux虚拟内存管理(三)
深入理解Linux虚拟内存管理(三)
300 0