⭐作者介绍:大二本科网络工程专业在读,持续学习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配置类。下面将对这些配置方式进行简要介绍:
- 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>
- 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();
}
}
- 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配置文件中常用的配置元素和其功能的详细介绍:
-
<beans>元素:<beans>元素是XML配置文件的根元素,它包含了整个配置文件的内容。通过指定命名空间和模式位置,可以定义Spring的命名空间和相关的XML模式。示例:
-
<bean>元素:<bean>元素用于定义Spring容器中的一个Bean。通过指定id属性和class属性,可以指定Bean的标识和类型。可以使用其他属性如scope、init-method、destroy-method来进一步配置Bean的作用域、初始化和销毁方法。示例:
-
<property>元素:<property>元素用于为Bean设置属性值。通过指定name属性和对应的值,可以将值注入到Bean的属性中。值可以是字面值或引用其他Bean。示例:
-
<constructor-arg>元素:<constructor-arg>元素用于通过构造函数注入参数值。通过指定index属性或type属性和对应的值,可以指定参数的位置或类型。值可以是字面值或引用其他Bean。示例:
-
命名空间和标签: 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的初始化和销毁方法:
-
init-method: 使用init-method属性指定Bean的初始化方法。该方法在Bean实例化后、依赖注入完成后调用。
-
destroy-method: 使用destroy-method属性指定Bean的销毁方法。该方法在Bean被销毁之前调用。
可以同时指定多个初始化方法和销毁方法,使用逗号进行分隔:
除了通过配置文件,还可以使用注解来定义Bean的初始化方法和销毁方法。
-
@PostConstruct: 使用@PostConstruct注解标记一个方法作为Bean的初始化方法。该方法在依赖注入完成后调用。
-
@PreDestroy: 使用@PreDestroy注解标记一个方法作为Bean的销毁方法。该方法在Bean被销毁之前调用。
需要注意的是,使用注解方式需要在配置文件中启用对注解的支持(如<context:annotation-config >或<context:component-scan >)。
通过配置初始化方法和销毁方法,可以在Bean的生命周期的不同阶段执行一些特定的操作,如资源初始化、资源释放、连接打开、连接关闭等。这样可以确保Bean在使用前被正确初始化,并在不再需要时进行资源释放,提高应用程序的健壮性和可靠性。
3.3、⭐实例化
实例化方式 | 描述 |
---|---|
构造方法实例化 | 通过调用Bean的构造方法来实例化对象 |
静态工厂方法实例化 | 通过调用静态工厂方法来创建Bean的实例 |
实例工厂方法实例化 | 通过调用实例工厂方法来创建Bean的实例 |
在Spring中,可以使用以下三种方式实例化Bean:
- 使用构造函数实例化: 这是最常见的实例化Bean的方式,通过调用Bean类的构造函数来创建Bean的实例。可以使用标签的constructor-arg元素来指定构造函数参数的值或引用。
上述示例中,元素用于指定构造函数参数,通过value属性指定字面值参数,通过ref属性指定引用类型参数。
一般而言它会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败
2. 使用静态工厂方法实例化: 可以使用静态工厂方法创建Bean的实例,通过调用工厂类的静态方法来创建对象。使用标签的factory-method属性指定工厂方法的名称。
上述示例中,MyBeanFactory是一个具有静态方法createInstance的工厂类,该方法返回MyBean的实例,如:
- 使用实例工厂方法实例化: 可以使用实例工厂方法创建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方法注入
- 构造函数注入: 通过构造函数注入依赖项时,Bean的构造函数接受依赖项作为参数,并在创建Bean实例时进行注入。
在XML配置文件中,使用元素指定构造函数参数的值或引用。
- Set方法注入: 通过Setter方法注入依赖项时,Bean类提供Setter方法,用于设置依赖项的值。
在XML配置文件中,使用元素指定Setter方法注入的值或引用。
- P命名空间注入(本质也是Set注入):P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中,如下:
首先,需要引入P命名空间:
其次,需要修改注入方式:
- 字段注入: 通过字段注入依赖项时,Bean类的依赖项字段上使用@Autowired注解。
在XML配置文件中,需要启用注解扫描(<context:annotation-config />)以支持自动注入。
通过依赖注入,我们可以解耦对象之间的依赖关系,使代码更灵活、可维护和可测试。Spring容器负责解析依赖关系,并在适当的时候将依赖项注入到Bean中,大大简化了开发过程。
3.4.4、注入的数据类型
数据类型 | 注入方式 |
---|---|
基本数据类型 | 构造函数注入、Setter方法注入、注解方式 |
引用类型 | Setter方法注入、注解方式 |
集合类型 | Setter方法注入、注解方式 |
数组类型 | Setter方法注入、注解方式 |
注解类型 | 注解方式 |
枚举类型 | Setter方法注入、注解方式 |
泛型类型 | Setter方法注入、注解方式 |
接口类型 | Setter方法注入、注解方式 |
下面是对八种数据类型的注入方式进行详细分析:
- 基本数据类型(Primitive Types):基本数据类型的注入可以通过构造函数注入、Setter方法注入或通过注解实现。在构造函数注入中,可以直接在构造函数参数中声明基本数据类型,并在配置文件中指定相应的值。在Setter方法注入中,可以通过Setter方法设置基本数据类型的值。注解方式可以使用@Value注解将基本数据类型的值直接注入到Bean中。
- 引用类型(Reference Types):引用类型的注入通常使用Setter方法注入或通过注解实现。在Setter方法注入中,可以在Bean的配置文件中通过ref属性指定依赖的Bean名称,Spring会自动将相应的Bean注入到该属性中。注解方式可以使用@Autowired注解将依赖的Bean自动注入到属性中。
- 集合类型(Collection Types):集合类型的注入可以通过Setter方法注入或通过注解实现。在Setter方法注入中,可以在配置文件中使用、、
- 数组类型(Array Types):数组类型的注入可以通过Setter方法注入或通过注解实现。在Setter方法注入中,可以在配置文件中使用标签定义数组类型的元素,并通过ref属性指定依赖的Bean名称。注解方式可以使用@Autowired注解结合@Qualifier注解指定数组类型的元素。
- 注解类型(Annotation Types):注解类型的注入通常使用注解方式实现。可以使用@Autowired注解将注解类型的Bean注入到属性中。
- 枚举类型(Enum Types):枚举类型的注入通常使用Setter方法注入或通过注解实现。在Setter方法注入中,可以在配置文件中指定枚举类型的值。注解方式可以使用@Value注解将枚举类型的值注入到Bean中。
- 泛型类型(Generic Types):泛型类型的注入通常使用Setter方法注入或通过注解实现。在Setter方法注入中,可以在配置文件中指定泛型类型的值,并通过ref属性指定依赖的Bean名称。注解方式可以使用@Autowired注解结合@Qualifier注解指定泛型类型的值。
- 接口类型(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是一个用于配置数据源的文件。