【Spring】基于注解的Spring容器配置——基于Java类的配置(@Configuration与@Bean)

在Spring中,配置Bean的方式有多种,其中基于Java类的配置(使用@Configuration@Bean注解)是非常重要的一种方式。

这种配置方式的优势在于:

  1. 类型安全:与XML配置相比,Java配置能够在编译时进行类型检查,减少运行时错误。

  2. 可读性:Java代码的可读性和可维护性通常优于XML配置。

  3. 灵活性:可以使用Java的逻辑来控制Bean的创建过程,例如条件创建、循环依赖等。

一、@Configuration 和 @Bean 的概念
  • @Configuration :这个注解用于标记一个类为Spring的配置类,表示该类可以包含一个或多个@Bean方法。Spring会在启动时扫描这些配置类,并根据其中的@Bean方法创建相应的Bean实例。

  • @Bean:这个注解用于标记一个方法,表示该方法返回的对象是一个Spring管理的Bean。Spring会调用这个方法并将返回的对象注册到Spring容器中。

二、使用示例
1. 创建基本的配置类

首先,我们创建一个简单的配置类,演示如何使用@Configuration@Bean注解来定义Bean。

复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// 定义配置类
@Configuration
public class AppConfig {

    // 定义一个Bean
    @Bean
    public UserService userService() {
        return new UserService();
    }

    // 定义另一个Bean
    @Bean
    public UserRepository userRepository() {
        return new UserRepository();
    }
}

// 示例的UserService类
class UserService {
    public void serve() {
        System.out.println("UserService is serving...");
    }
}

// 示例的UserRepository类
class UserRepository {
    public void save() {
        System.out.println("UserRepository is saving...");
    }
}

解释

  • @Configuration注解标记AppConfig类为一个配置类。

  • userService()userRepository()方法被标记为@Bean,返回的UserServiceUserRepository对象将被Spring容器管理。

2. 使用配置类

接下来,我们在Spring应用中使用这个配置类。

复制代码
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
        // 创建Spring容器
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // 获取UserService Bean
        UserService userService = context.getBean(UserService.class);
        userService.serve(); // 调用服务方法

        // 获取UserRepository Bean
        UserRepository userRepository = context.getBean(UserRepository.class);
        userRepository.save(); // 调用保存方法
    }
}

解释

  • AnnotationConfigApplicationContext用于创建基于Java配置的Spring容器。

  • 通过context.getBean()方法获取UserServiceUserRepository的实例,并调用其方法。

3. Bean 的依赖注入

在实际应用中,Bean之间通常会有依赖关系。我们可以通过构造器注入或方法注入来实现。

复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public UserService userService() {
        return new UserService(userRepository()); // 依赖注入
    }

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

class UserService {
    private final UserRepository userRepository;

    // 构造器注入
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void serve() {
        System.out.println("UserService is serving...");
        userRepository.save(); // 调用依赖的Bean方法
    }
}

class UserRepository {
    public void save() {
        System.out.println("UserRepository is saving...");
    }
}

解释

  • UserService类依赖于UserRepository,通过构造器进行依赖注入。

  • userService()方法中,我们调用userRepository()来获取UserRepository的实例,并将其传递给UserService

4. Bean 的作用域

我们还可以使用@Scope注解来定义Bean的作用域。

复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class AppConfig {

    @Bean
    @Scope("prototype") // 原型作用域
    public UserService userService() {
        return new UserService(userRepository());
    }

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

解释

  • 在这个示例中,userService()方法返回的UserService Bean的作用域被设置为原型。每次请求都会创建一个新的实例。
三、总结

使用@Configuration@Bean注解进行Spring Bean的配置是一种现代、灵活且类型安全的方式。它不仅提高了代码的可读性和可维护性,还允许开发者在Java代码中使用条件逻辑来控制Bean的创建。

在实际开发中,使用这种方式可以更好地管理复杂的依赖关系和Bean的生命周期,使得应用更加健壮和灵活。希望通过本次讲解,能够帮助你深入理解Spring中的@Configuration@Bean注解及其应用场景。

相关推荐
daidaidaiyu9 小时前
一文学习 工作流开发 BPMN、 Flowable
java
ZTLJQ10 小时前
序列化的艺术:Python JSON处理完全解析
开发语言·python·json
2401_8914821710 小时前
多平台UI框架C++开发
开发语言·c++·算法
H5css�海秀10 小时前
今天是自学大模型的第一天(sanjose)
后端·python·node.js·php
SuniaWang10 小时前
《Spring AI + 大模型全栈实战》学习手册系列 · 专题六:《Vue3 前端开发实战:打造企业级 RAG 问答界面》
java·前端·人工智能·spring boot·后端·spring·架构
韩立学长10 小时前
Springboot校园跑腿业务系统0b7amk02(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
sheji341610 小时前
【开题答辩全过程】以 基于springboot的扶贫系统为例,包含答辩的问题和答案
java·spring boot·后端
88号技师10 小时前
2026年3月中科院一区SCI-贝塞尔曲线优化算法Bezier curve-based optimization-附Matlab免费代码
开发语言·算法·matlab·优化算法
t1987512810 小时前
三维点云最小二乘拟合MATLAB程序
开发语言·算法·matlab
m0_7269659811 小时前
面面面,面面(1)
java·开发语言