详解Spring配置文件

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

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是一个用于配置数据源的文件。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_60735796/article/details/131368664
今日推荐