详解Spring配置文件

news2024/12/22 20:26:33

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:JavaEE、Spring

Spring配置文件

  • 1、简介
  • 2、XML
  • 3、\<Bean\>
    • 3.1、Bean标签范围配置
    • 3.2、生命周期
    • 3.3、⭐实例化
    • 3.4、依赖注入
      • 3.4.1、简介
      • 3.4.2、简述步骤
      • 3.4.3、注入方式
      • 3.4.4、注入的数据类型
      • 3.4.5、引入其他配置文件

1、简介

在Spring框架中,有多种方式可以进行配置,包括使用XML配置文件、使用Java注解和使用Java配置类。下面将对这些配置方式进行简要介绍:

  1. XML配置文件: XML配置文件是传统和最常见的配置方式之一。通过在XML文件中定义配置元素和属性,可以描述应用程序的组件、依赖关系和其他配置信息。XML配置文件通常使用Spring的命名空间和标签来表示不同的配置元素,如bean、property、constructor-arg等。
    示例:
<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">

    <bean id="userService" class="com.example.UserService">
        <property name="userRepository" ref="userRepository" />
    </bean>

    <bean id="userRepository" class="com.example.UserRepositoryImpl" />

</beans>
  1. Java注解: Java注解是一种更为简洁和直观的配置方式。通过在Java类、方法和字段上添加注解,可以指示Spring框架如何处理它们。注解可以用于定义Bean、依赖注入、作用域、切面等。常用的注解包括@Component、@Autowired、@Configuration等。示例:
@Configuration
public class AppConfig {

    @Bean
    public UserService userService() {
        return new UserService(userRepository());
    }

    @Bean
    public UserRepository userRepository() {
        return new UserRepositoryImpl();
    }

}
  1. Java配置类: Java配置类是一种基于纯Java代码的配置方式,它使用特定的类来定义和组织Spring的配置信息。通常,一个Java配置类被注解为@Configuration,然后使用@Bean注解来声明Bean定义。与XML配置文件类似,Java配置类可以定义Bean之间的依赖关系和其他配置细节。示例:
@Configuration
public class AppConfig {

    @Bean
    public UserService userService(UserRepository userRepository) {
        return new UserService(userRepository);
    }

    @Bean
    public UserRepository userRepository() {
        return new UserRepositoryImpl();
    }

}

无论使用哪种配置方式,Spring框架都会读取和解析配置信息,并根据配置创建和管理应用程序的对象和组件。
配置文件中定义的Bean可以通过IoC容器进行实例化、依赖注入和生命周期管理,从而实现对象之间的解耦和灵活性。配置文件还可以配置切面、数据源、事务管理等其他方面的细节。
需要注意的是,随着Spring框架的发展,推荐使用基于注解或Java配置类的方式进行配置,因为它们更加简洁、类型安全,并且提供了更好的可读性和可维护性。但对于一些传统项目或需要与第三方库进行整合的情况,仍然可以使用XML配置文件。

2、XML

Spring的XML配置文件是一种传统且广泛使用的配置方式,用于描述Spring应用程序的组件、依赖关系和其他配置信息。XML配置文件使用Spring的命名空间和标签来表示不同的配置元素,例如<beans>、<bean>、<property>、<constructor-arg>等。
下面是XML配置文件中常用的配置元素和其功能的详细介绍:

  1. <beans>元素:<beans>元素是XML配置文件的根元素,它包含了整个配置文件的内容。通过指定命名空间和模式位置,可以定义Spring的命名空间和相关的XML模式。示例:
    在这里插入图片描述

  2. <bean>元素:<bean>元素用于定义Spring容器中的一个Bean。通过指定id属性和class属性,可以指定Bean的标识和类型。可以使用其他属性如scope、init-method、destroy-method来进一步配置Bean的作用域、初始化和销毁方法。示例:
    在这里插入图片描述

  3. <property>元素:<property>元素用于为Bean设置属性值。通过指定name属性和对应的值,可以将值注入到Bean的属性中。值可以是字面值或引用其他Bean。示例:
    在这里插入图片描述

  4. <constructor-arg>元素:<constructor-arg>元素用于通过构造函数注入参数值。通过指定index属性或type属性和对应的值,可以指定参数的位置或类型。值可以是字面值或引用其他Bean。示例:
    在这里插入图片描述

  5. 命名空间和标签: Spring提供了多个命名空间和对应的标签,用于简化和扩展配置。例如,<context:component-scan>标签用于自动扫描组件并进行自动装配,<aop:aspectj-autoproxy>标签用于启用AspectJ自动代理等。示例:
    在这里插入图片描述

通过XML配置文件,可以定义应用程序中的各种Bean、依赖关系、作用域、初始化和销毁方法等信息。XML配置文件提供了一种灵活且可读性较高的方式来配置Spring应用程序,适用于各种场景和需求。然而,随着Spring的发展,基于注解和Java配置类的方式越来越受欢迎,因为它们更加简洁、类型安全,并且提供了更好的可读性和可维护性。

3、<Bean>

在这里插入图片描述

3.1、Bean标签范围配置

属性描述
singleton默认值,每次请求都返回同一个Bean实例
prototype每次请求都返回一个新的Bean实例
request每次HTTP请求都返回同一个Bean实例(仅适用于Web应用程序)
session每次HTTP会话都返回同一个Bean实例(仅适用于Web应用程序)
global-session应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当于 session。
在全局HTTP会话中每次请求都返回同一个Bean实例(仅适用于Web应用程序)

singleton和prototype:
在这里插入图片描述

3.2、生命周期

配置元素描述
init-method在Bean实例化完成后,调用初始化方法
destroy-method在Bean销毁之前,调用销毁方法
@PostConstruct标注在方法上,指定方法为初始化方法
@PreDestroy标注在方法上,指定方法为销毁方法
实现接口实现InitializingBean接口和DisposableBean接口的方法

在Spring中,可以通过配置来管理Bean的生命周期。下面是几个常用的配置选项,用于定义Bean的初始化和销毁方法:

  1. init-method: 使用init-method属性指定Bean的初始化方法。该方法在Bean实例化后、依赖注入完成后调用。
    在这里插入图片描述

  2. destroy-method: 使用destroy-method属性指定Bean的销毁方法。该方法在Bean被销毁之前调用。
    在这里插入图片描述

可以同时指定多个初始化方法和销毁方法,使用逗号进行分隔:
在这里插入图片描述

除了通过配置文件,还可以使用注解来定义Bean的初始化方法和销毁方法。

  1. @PostConstruct: 使用@PostConstruct注解标记一个方法作为Bean的初始化方法。该方法在依赖注入完成后调用。
    在这里插入图片描述

  2. @PreDestroy: 使用@PreDestroy注解标记一个方法作为Bean的销毁方法。该方法在Bean被销毁之前调用。
    在这里插入图片描述

需要注意的是,使用注解方式需要在配置文件中启用对注解的支持(如<context:annotation-config >或<context:component-scan >)。
通过配置初始化方法和销毁方法,可以在Bean的生命周期的不同阶段执行一些特定的操作,如资源初始化、资源释放、连接打开、连接关闭等。这样可以确保Bean在使用前被正确初始化,并在不再需要时进行资源释放,提高应用程序的健壮性和可靠性。

3.3、⭐实例化

实例化方式描述
构造方法实例化通过调用Bean的构造方法来实例化对象
静态工厂方法实例化通过调用静态工厂方法来创建Bean的实例
实例工厂方法实例化通过调用实例工厂方法来创建Bean的实例

在Spring中,可以使用以下三种方式实例化Bean:

  1. 使用构造函数实例化: 这是最常见的实例化Bean的方式,通过调用Bean类的构造函数来创建Bean的实例。可以使用标签的constructor-arg元素来指定构造函数参数的值或引用。
    在这里插入图片描述

上述示例中,元素用于指定构造函数参数,通过value属性指定字面值参数,通过ref属性指定引用类型参数。
一般而言它会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败
2. 使用静态工厂方法实例化: 可以使用静态工厂方法创建Bean的实例,通过调用工厂类的静态方法来创建对象。使用标签的factory-method属性指定工厂方法的名称。
在这里插入图片描述

上述示例中,MyBeanFactory是一个具有静态方法createInstance的工厂类,该方法返回MyBean的实例,如:
在这里插入图片描述

  1. 使用实例工厂方法实例化: 可以使用实例工厂方法创建Bean的实例,通过调用工厂对象的实例方法来创建对象。使用标签的factory-bean属性指定工厂对象的引用,factory-method属性指定工厂方法的名称。
    在这里插入图片描述
      如:
    在这里插入图片描述在这里插入图片描述

上述示例中,myBeanFactory是一个实例对象,类型为MyBeanFactory,通过调用其实例方法createInstance来创建MyBean的实例。
通过选择适当的实例化方式,可以根据具体的需求和场景创建Bean的实例。构造函数实例化适用于大多数情况,静态工厂方法和实例工厂方法提供了更高度的灵活性,可以实现更复杂的实例化逻辑和条件判断。

3.4、依赖注入

3.4.1、简介

依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。
Bean的依赖注入是指在Spring容器中,通过自动或显式的方式将Bean所依赖的其他对象注入到Bean中,以满足Bean的运行需要。依赖注入可以通过构造函数、Setter方法或字段进行注入。
在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。
IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。
那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。
简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。

3.4.2、简述步骤

简单上手三个步骤:
① 创建 UserService,UserService 内部在调用 UserDao的save() 方法
在这里插入图片描述

② 将 UserServiceImpl 的创建权交给 Spring
在这里插入图片描述

③ 从 Spring 容器中获得 UserService 进行操作
在这里插入图片描述

下面是分析:
目前UserService实例和UserDao实例都存在与Spring容器中,当前的做法是在容器外部获得UserService
实例和UserDao实例,然后在程序中进行结合。
在这里插入图片描述

因为UserService和UserDao都在Spring容器中,而最终程序直接使用的是UserService,所以可以在 Spring容器中,将UserDao设置到UserService内部。
在这里插入图片描述

3.4.3、注入方式

注入方式有两种:构造函数注入和Setter方法注入

  1. 构造函数注入: 通过构造函数注入依赖项时,Bean的构造函数接受依赖项作为参数,并在创建Bean实例时进行注入。
    在这里插入图片描述

  在XML配置文件中,使用元素指定构造函数参数的值或引用。
  在这里插入图片描述

  1. Set方法注入: 通过Setter方法注入依赖项时,Bean类提供Setter方法,用于设置依赖项的值。
    在这里插入图片描述

  在XML配置文件中,使用元素指定Setter方法注入的值或引用。
  在这里插入图片描述

  1. P命名空间注入(本质也是Set注入):P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中,如下:
    首先,需要引入P命名空间:
    在这里插入图片描述

  其次,需要修改注入方式:
在这里插入图片描述

  1. 字段注入: 通过字段注入依赖项时,Bean类的依赖项字段上使用@Autowired注解。
    在这里插入图片描述

  在XML配置文件中,需要启用注解扫描(<context:annotation-config />)以支持自动注入。
  在这里插入图片描述

通过依赖注入,我们可以解耦对象之间的依赖关系,使代码更灵活、可维护和可测试。Spring容器负责解析依赖关系,并在适当的时候将依赖项注入到Bean中,大大简化了开发过程。

3.4.4、注入的数据类型

数据类型注入方式
基本数据类型构造函数注入、Setter方法注入、注解方式
引用类型Setter方法注入、注解方式
集合类型Setter方法注入、注解方式
数组类型Setter方法注入、注解方式
注解类型注解方式
枚举类型Setter方法注入、注解方式
泛型类型Setter方法注入、注解方式
接口类型Setter方法注入、注解方式

下面是对八种数据类型的注入方式进行详细分析:

  1. 基本数据类型(Primitive Types):基本数据类型的注入可以通过构造函数注入、Setter方法注入或通过注解实现。在构造函数注入中,可以直接在构造函数参数中声明基本数据类型,并在配置文件中指定相应的值。在Setter方法注入中,可以通过Setter方法设置基本数据类型的值。注解方式可以使用@Value注解将基本数据类型的值直接注入到Bean中。
  2. 引用类型(Reference Types):引用类型的注入通常使用Setter方法注入或通过注解实现。在Setter方法注入中,可以在Bean的配置文件中通过ref属性指定依赖的Bean名称,Spring会自动将相应的Bean注入到该属性中。注解方式可以使用@Autowired注解将依赖的Bean自动注入到属性中。
  3. 集合类型(Collection Types):集合类型的注入可以通过Setter方法注入或通过注解实现。在Setter方法注入中,可以在配置文件中使用、、等标签定义集合类型的元素,并通过ref属性指定依赖的Bean名称。注解方式可以使用@Autowired注解结合@Qualifier注解指定集合类型的元素。
  4. 数组类型(Array Types):数组类型的注入可以通过Setter方法注入或通过注解实现。在Setter方法注入中,可以在配置文件中使用标签定义数组类型的元素,并通过ref属性指定依赖的Bean名称。注解方式可以使用@Autowired注解结合@Qualifier注解指定数组类型的元素。
  5. 注解类型(Annotation Types):注解类型的注入通常使用注解方式实现。可以使用@Autowired注解将注解类型的Bean注入到属性中。
  6. 枚举类型(Enum Types):枚举类型的注入通常使用Setter方法注入或通过注解实现。在Setter方法注入中,可以在配置文件中指定枚举类型的值。注解方式可以使用@Value注解将枚举类型的值注入到Bean中。
  7. 泛型类型(Generic Types):泛型类型的注入通常使用Setter方法注入或通过注解实现。在Setter方法注入中,可以在配置文件中指定泛型类型的值,并通过ref属性指定依赖的Bean名称。注解方式可以使用@Autowired注解结合@Qualifier注解指定泛型类型的值。
  8. 接口类型(Interface Types):接口类型的注入通常使用Setter方法注入或通过注解实现。在Setter方法注入中,可以在配置文件中通过ref属性指定实现该接口的Bean名称。注解方式可以使用@Autowired注解结合@Qualifier注解指定接口类型的Bean。

通过上述的注入方式,可以满足不同类型数据的注入需求,实现对象之间的依赖关系和灵活组装。具体选择哪种方式,取决于具体的应用场景和需求。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.4.5、引入其他配置文件

实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载,有利于分模块开发。
在Spring中,可以使用标签来引入其他配置文件。这可以帮助我们将配置文件模块化,使其更易于管理和维护。

下面是使用标签引入其他配置文件的示例:
假设我们有两个配置文件:app-config.xml和data-config.xml,其中data-config.xml是一个用于配置数据源的文件。
在这里插入图片描述

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

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

相关文章

word文档批量生成工具(附免费软件)(按Excel表格内容自动替换内容生成文档)

批量生成word文档是让人无比厌恶但有时又不得不做的事情。比如学校要给拟录取的学生发通知书&#xff0c;就可能需要批量生成一批只有“姓名”、“学院”和“专业”不同&#xff0c;其他内容都相同的word文档以供打印&#xff08;事实上直接生成pdf是更好的选择&#xff0c;这个…

chatgpt赋能python:Python如何计算p值?

Python如何计算p值&#xff1f; 在统计学中&#xff0c;p值是估计观察到的结果是由随机因素导致的概率。在Python中&#xff0c;我们可以使用一些统计库来计算p值。 常见的统计库 Python中有很多统计库可以用来计算p值。其中&#xff0c;SciPy是最常用的统计库之一。它包含了…

【American English】去超市买东西常用对话,物品名字

不懂不丢人&#xff0c;不懂装懂才丢人。最近有点犯这毛病&#xff0c;多写一些东西消除一下。 无论什么知识都是多了才能成体系&#xff0c;更多自己在美国的小总结可见专栏&#xff1a;English。 文章目录 找寻物品优惠或折扣试吃结账退货离开 找寻物品 Excuse me, where can…

Linux——文件的概念、操作和理解

引言 文件 文件内容 文件属性 要操作文件&#xff0c;就要先打开文件。根据冯诺依曼体系&#xff0c;只能操作内存中的数据。因此要先把文件内容加载到存储器&#xff0c;即内存中。 文件接口 语言层面的文件接口 FILE* fopen(const char *path, const char *mode); int …

网页3行字,成立4周就快成独角兽!大模型创业狂飙中

先来看看这家公司的官网截图&#xff1a; 对的&#xff0c;你没有看错&#xff0c;加上公司名字也就只有4行字。 人工智能正在迅速发展&#xff1a;一家成立仅四周的初创公司获得了1.13亿美元的种子轮融资&#xff0c;将与OpenAI竞争&#xff0c;在构建、训练和应用大型语言模…

Ubuntu 如何启动、停止或重启服务

在本文中&#xff0c;我们向您介绍在 Ubuntu 中启动、停止和重启服务的方法。 列出 Ubuntu 中的所有服务 在开始之前&#xff0c;先获取计算机上所有服务的列表&#xff0c;因为我们需要知道服务名称来管理服务。 service --status-all 它将显示 Ubuntu 上的完整服务列表。…

八卦图总结

第一阶段知识汇总 版本号&#xff1a;V1.1 作 者 姓 名&#xff1a; 学 科 专 业&#xff1a; 软件测试 文 档 类 型&#xff1a;第一阶段 汇 总 测 试 基 础 …

strapi系列--如何建表并在原有官方自动生成的api基础上扩展接口,定制化自己的业务逻辑

为什么要进行后端定制呢&#xff1f; 在实际开发过程中&#xff0c;项目中有些需求需要我们定制化自己的业务逻辑&#xff0c;那么我们该如何处理这个需求呢&#xff1f;本文以图文并茂的形式&#xff0c;基于原有官方自动生成的api&#xff0c;定制一个我们自己的业务逻辑接口…

“破解求职之谜:应届生如何应对职场场景挑战?

今天&#xff0c;我想与你分享一个关于应届生面试的故事。这是一个真实且令人深思的故事&#xff0c;也是我个人在求职过程中的一次经历&#xff0c;这也是对尚未面试者的警醒对已面试者的勉励。 在暑期还未开始之前&#xff0c;我充满着憧憬和期待地投递了许多简历&#xff0c…

chatgpt赋能python:Python第几行是什么?了解Python中的行号

Python第几行是什么&#xff1f;了解Python中的行号 如果你是一名Python工程师&#xff0c;你肯定曾经遇到过错误提示中提到的Python第几行。那么Python中的行号是什么&#xff1f;本文将为您解答关于Python中行号的一些基本问题。 什么是Python中的行号&#xff1f; 在Pyth…

测试用例设计方法

等价类划分法 设计测试用例步骤 需求分析划分等价类&#xff1a;有效和无效设计用例 无效有5种情况 规则&#xff08;需求本身&#xff09;长度类型是否为空&#xff08;必填项&#xff09;是否重复 案例1&#xff1a;QQ号6-10位自然数 划分等价类 有效等价类有效数据无…

深入理解深度学习——BERT派生模型:BART(Bidirectional and Auto-Regressive Transformers)

分类目录&#xff1a;《深入理解深度学习》总目录 UniLM和XLNet都尝试在一定程度上融合BERT的双向编码思想&#xff0c;以及GPT的单向编码思想&#xff0c;同时兼具自编码的语义理解能力和自回归的文本生成能力。由脸书公司提出的BART&#xff08;Bidirectional and Auto-Regre…

[Hadoop] 期末答辩问题准备

0.相关概念 1.什么是NameNode&#xff1f; NameNode是整个文件系统的管理节点&#xff0c;它维护着整个文件系统的文件目录树&#xff0c;文件/目录的元信息和每个文件对应的数据块列表。并接收用户的操作请求。 2.SecondaryNameNode的主要作用&#xff1f; SecondaryNameN…

JUC阻塞队列BlockingQueue---ArrayBlockingQueue

JUC阻塞队列BlockingQueue---ArrayBlockingQueue ArrayBlockingQueue示例代码原理构造方法内部常量入队put方法出队take方法 什么是阻塞队列&#xff1f; ArrayBlockingQueue ArrayBlockingQueue是典型的有界阻塞队列&#xff0c;其内部是用数组存储元素的&#xff0c;初始化…

chatgpt赋能python:Python程序安装指南

Python程序安装指南 介绍 Python 是一种高级编程语言&#xff0c;广泛应用于数据分析、人工智能、Web开发等领域。安装 Python 程序是使用 Python 和运行 Python 脚本的必要步骤。在本文中&#xff0c;我们将提供详细的 Python 程序安装指南。 安装Python程序步骤 步骤1: 下…

1.1-python课程简介

一、python入门 1、python来源2、什么是python3、python编程软件下载4、python软件安装5、python软件运行和调试 1、python来源 Guido van Rossum 于1989年在荷兰国家数学和计算机科学研究所设计出来的。 2、什么是python Python 是一个高层次的结合了解释性、编译性、互动性…

【推荐】win 安装 rust 1.70 (GNU)

目录 一、下载二、安装三、配置环境变量四、检查是否安装成功五、参考文章 一、下载 官网地址&#xff1a;https://www.rust-lang.org/zh-CN/ https://forge.rust-lang.org/infra/other-installation-methods.html 历史版本下载地址&#xff1a; 二、安装 注意&#xff1a;安…

TypeScript ~ TS Webpack构建工具 ⑦

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

chatgpt赋能python:Python相加:实现快速、高效的计算

Python相加&#xff1a; 实现快速、高效的计算 Python 运用广泛&#xff0c;是一种功能强大的编程语言。它不仅易于学习&#xff0c;而且具备许多强大的功能&#xff0c;其中包括 Python 相加。今天&#xff0c;我们将介绍如何写 Python 相加的代码&#xff0c;以及如何实现快…

chatgpt赋能python:如何将Python程序打包成App-一个详细的指南

如何将Python程序打包成App - 一个详细的指南 如果你是一位有着丰富Python编程经验的开发者&#xff0c;可能你听说过Python App打包。Python App打包就是将Python程序打包成为操作系统所支持的应用程序的过程。这个过程可以让你的Python程序在Windows、Mac和Linux操作系统上更…