如何通过 Java Config(@Configuration 和 @Bean)声明一个 Bean?这种方式和注解方式有什么不同,适用于什么场景?

Spring装配Bean的三种方式:XML、Java Config与注解自动装配详解 控制反转(IoC)与依赖注入(DI)是Spring框架的核心机制,通过将对象创建权与依赖管理权交给容器,实现组件解耦与生命周期管理。其原理基于反射与代理技术,在容器启动时完成Bean的实例化、属性填充与初始化。合理选择装配方式能显著提升代码可维护性与开发效率,常见于业务组件注入、第三方库整合及多环境配置等场景。Spring提供了XML显式配置、Java Config类型安全配置以及注解自动装配三条技术路线,分别适用于遗留系统维护、复杂装配逻辑与快速业务开发。理解三者的演化逻辑与选型边界,是掌握Spring装 阅读详情

通过 Java Config 来声明 Bean 是 Spring 中非常重要的一种方式,它与基于注解的组件扫描形成了互补。

如何通过 Java Config(@Configuration 和 @Bean)声明一个 Bean?

这种方式的核心是使用两个注解:@Configuration 和 @Bean。

  • @Configuration: 标记在一个类上,表明这个类是一个 Spring 配置类。它的作用相当于一个传统的 XML 配置文件。Spring 容器会处理这个类,并将其中的 Bean 定义加载进来。配置类本身也会被注册为一个 Bean。

  • @Bean: 标记在一个方法上,这个方法必须位于一个 @Configuration 类中。它告诉 Spring:“请将这个方法返回的对象注册为一个 Bean,并由你来管理”。

工作流程:
  1. 创建一个普通的 Java 类,并用 @Configuration 标记它。
  2. 在这个类中,定义一个或多个方法。
  3. 在你想让 Spring 管理的方法上,加上 @Bean 注解。
  4. 这个方法的返回值就是将被注册到 Spring 容器中的 Bean 实例。
  5. 默认情况下,这个 Bean 的名字就是方法名。
示例:

假设我们正在使用一个第三方库中的类,比如一个 JSON 解析库的 ObjectMapper。我们无法修改它的源代码,无法添加 @Component 注解。这时,Java Config 就是完美的解决方案。

1. 定义配置类 AppConfig.java

import com.fasterxml.jackson.databind.ObjectMapper; // 假设这是一个第三方类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration // 1. 声明这是一个配置类
public class AppConfig {

    @Bean // 2. 声明这个方法返回的对象是一个Bean
    public ObjectMapper objectMapper() { // 3. Bean的名字默认是 "objectMapper"
        // 4. 这里是创建和配置Bean实例的逻辑
        ObjectMapper mapper = new ObjectMapper();
        // 可以在这里进行各种复杂的配置...
        // mapper.enable(SerializationFeature.INDENT_OUTPUT);
        return mapper; // 5. 返回的对象将被放入Spring容器
    }
}

2. 在业务代码中使用这个 Bean

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DataProcessingService {

    private final ObjectMapper objectMapper; // 这是我们在AppConfig中定义的Bean

    @Autowired
    public DataProcessingService(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    public String process(Object data) throws Exception {
        // 使用被注入的 objectMapper Bean
        return this.objectMapper.writeValueAsString(data);
    }
}

当 Spring 容器启动时,它会加载 AppConfig,执行 objectMapper() 方法,将返回的 ObjectMapper 实例注册为一个名为 objectMapper 的 Bean。然后,当创建 DataProcessingService 时,Spring 会自动将这个 ObjectMapper Bean 注入进去。


这种方式和注解方式有什么不同,适用于什么场景?

这是一个非常关键的问题,理解它们的区别能帮助你写出更优雅、更合理的 Spring 应用。

特性组件扫描 (@Component, @Service 等)Java Config (@Bean)
控制方类本身决定自己是否是 Bean。外部配置类决定一个对象是否是 Bean。
注解位置直接在类上。在返回 Bean 实例的方法上。
侵入性侵入式:必须修改目标类的源代码来添加注解。非侵入式:目标类可以是普通的 POJO,无需任何 Spring 注解。
灵活性较低。Bean 的创建逻辑是固定的(通过构造函数实例化)。极高。你可以在 @Bean 方法体内编写任意复杂的 Java 代码来创建和配置 Bean。
明确性隐式。Bean 的定义分散在各个类中,由扫描机制自动发现。显式。所有的 Bean 定义都集中在配置类中,一目了然。
适用场景分析:
什么时候使用组件扫描 (@Component, @Service, @Repository, @Controller)?

对于你自己编写的、属于你应用程序一部分的业务组件,组件扫描是最优选择。

  • 你的业务逻辑类:比如 UserService, ProductRepository, OrderController 等。
  • 遵循“约定优于配置”:它让代码更简洁,减少了显式的配置代码。你只需在类上做一个标记,Spring 就会自动处理。
  • 去中心化配置:Bean 的定义和它的实现代码放在一起,便于维护。

总结:用组件扫描来管理你自己应用中的类。

什么时候使用 Java Config (@Configuration, @Bean)?

当组件扫描不适用或不够灵活时,Java Config 就派上用场了。

  1. 管理第三方库的类
    这是最经典、最常见的场景。你无法修改第三方库的源代码来添加 @Component,所以必须使用 @Bean 方法来将其实例声明为一个 Bean。比如 DataSource, RestTemplate, ObjectMapper, RedisTemplate 等。

  2. 需要复杂初始化逻辑的 Bean
    如果一个对象的创建过程很复杂,不仅仅是 new 一下那么简单,比如需要调用多个 setter 方法,或者使用构造者模式(Builder Pattern),那么 @Bean 方法体就是实现这些复杂逻辑的完美场所。

    @Bean
    public SomeComplexObject someComplexObject() {
        // 使用Builder模式创建对象
        return new SomeComplexObject.Builder()
                .withPropertyA("valueA")
                .withPropertyB(123)
                .build();
    }
    
  3. 条件化创建 Bean
    有时你希望只在满足特定条件时才创建某个 Bean。在 @Bean 方法上可以结合使用 @Conditional... 系列注解,实现非常精细的控制。

    @Bean
    @ConditionalOnProperty(name = "feature.toggle.enable-caching", havingValue = "true")
    public CacheManager redisCacheManager() {
        // 只有当配置文件中的 feature.toggle.enable-caching=true 时,这个Bean才会被创建
        return new RedisCacheManager(...);
    }
    
  4. 将一个类的多个不同配置实例注册为 Bean
    假设你需要两个功能不同但类型相同的 RestTemplate Bean,一个用于调用内部服务(超时短),一个用于调用外部服务(超时长)。组件扫描无法做到这一点,但 @Bean 可以轻松实现。

    @Bean
    public RestTemplate internalRestTemplate() {
        // ... 配置一个短超时的RestTemplate
        return new RestTemplate(...);
    }
    
    @Bean
    public RestTemplate externalRestTemplate() {
        // ... 配置一个长超时的RestTemplate
        return new RestTemplate(...);
    }
    

最终总结

  • @Component 及其衍生注解:是“自荐模式”。类自己说:“我是个 Bean,快来管我!”。适用于应用内部的、由你控制的组件。
  • @Configuration + @Bean:是“举荐模式”。配置类说:“我推荐这个方法返回的对象做个 Bean,你来管管它!”。适用于第三方类、复杂创建逻辑或需要精细化控制的场景。

在实际开发中,这两种方式通常会混合使用,相得益彰,共同构成了 Spring 强大而灵活的配置模型。

Spring @Bean方法参数注入:原理、场景与最佳实践 依赖注入是现代Java框架的核心设计模式,它通过将对象依赖关系的创建与管理交由容器负责,实现了控制反转,从而提升代码的松耦合性和可测试性。其工作原理是容器在运行时动态地将依赖对象注入到目标对象中,而非由目标对象主动创建。这一机制的技术价值在于简化了组件配置、促进了模块化开发,并便于进行单元测试和模拟。在Spring框架中,依赖注入广泛应用于服务层、数据访问层及配置类的Bean组装等场景。本文聚焦于Spring @Configuration类中@Bean方法的参数注入机制,深入解析其基于CGLIB代理的方法拦 阅读详情

相关推荐

Spring 中的 @Configuration @Bean注解

是 Spring 提供的一个注解,用于标记某个类为配置类。该类可以定义 Bean 的创建方式,并通过@Bean注解的方法来注册这些 Bean 到 Spring 容器中。特性说明注解名称所属包是否必须否,但在基于 Java 的配置中非常常见是否可被扫描是,但自身不是组件支持哪些功能Bean 定义、组件扫描、条件化配置、属性注入等是 Spring 框架中非常强大而灵活的注解之一,是现代 Spring 开发中推荐使用的配置方式。

h a 6 6 6 c k 为 你解决复杂难题! 656

@Configuration和@Bean注解

一、@Configuration注解用来提供创建Bean的环境,@Bean写在方法上用于创建bean: 1. package com.zyq.studemo; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import

gulanga5的博客 5276

Spring框架中 @Configuration @ComponentScan @Bean 作用

结合使用这两个注解,可以实现基于Java配置的Spring应用开发,无需使用传统的XML配置方式。是Spring框架中用于配置和自动扫描组件的注解,它们在创建基于Java的配置类时非常有用。等注解的类),并将其注册为Spring容器中的beans。注解标记的,这意味着它是一个配置类,同时使用了。包及其子包下的所有组件(即使用了。注解来指示Spring自动扫描。

h a 6 6 6 c k 为 你解决复杂难题! 264

@Configuration和@bean

@Configuration和@Bean是Spring中常用的用于配置的Bean的两个注解(将@Bean注解的方法返回的类注入spring) @Bean 定义 //用于注解方法和注解的定义 @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) 适用范围 @Bean可作用于组件@Component,该注解及其扩展注解均可使用: @Component定义类为组件,.

m0_50488756的博客 770

docker 安装oracle

本文介绍了使用Docker部署Oracle数据库的实践指南。主要内容包括:常用Oracle镜像的阿里云和华为云拉取地址,11g/12c/19c等不同版本的启动命令示例,以及连接数据库的基本信息。实战部分详细演示了Oracle 11g的安装过程,包括镜像拉取、容器启动、密码修改和数据库连接步骤,并通过Sql Developer和命令行两种方式创建用户。最后提到数据持久化的重要性,建议将数据库文件挂载到宿主机目录以防止容器删除导致数据丢失。文章提供了完整的操作命令和截图说明,适合需要快速部署Oracle测试环境

weixin_39766667的博客 372

【Diffusion分割】医学图像分割中去噪扩散技术

扩散模型(DPM)在图像生成方面表现出了卓越的性能,其性能往往优于其他生成模型。自其问世以来,强大的噪声-图像去噪管道已被扩展到各种判别任务中,包括图像分割。在医学成像中,图像往往是大型三维扫描图像,由于内存消耗大、迭代采样过程耗时,使用 DPM 对一幅图像进行分割的效率极低。在这项工作中,我们提出了一种(LDSeg),可在潜空间中执行扩散,用于医学影像分割。我们。潜空间条件扩散不仅能确保对多标签对象进行精确的 n-D 图像分割,还能缓解基于 DPM 的传统分割法的主要潜在问题:(。

qq_43583311的博客 1171

【Spring 注解】@Configuration和@Bean

@Configuration注解 在spring开发当中我们经常使用配置文件的形式来实例化bean、注入bean等操作。例如在spring-bean.xml中配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframewor...

weixin_34186950的博客 352

深入解析Flex NOC总线驱动的实时带宽与延迟优化策略

本文深入解析了Flex NOC总线驱动的核心价值与优化策略。通过解读`/proc/noc/real_time`中的实时带宽与延迟数据,并结合`sysfs`接口进行动态QoS调优,可以有效解决芯片内部数据拥堵问题。文章以智能摄像头和算力盒子的实际案例,详细说明了如何通过优先级调整、带宽限制和参数优化,提升系统在复杂任务下的实时性与稳定性。

weixin_29289821的博客 284

Spring学习|使用JavaConfig实现bean配置、代理模式:静态代理模式、动态代理模式(通俗易懂)

代理模式好处:可以使真实角色的操作更加纯粹!不用去关注一些公共的业务 公共业务就交给代理角色!实现了业务的分工!公共业务发生扩展的时候,方便集中管理! 静态代理缺点:一个真实角色就会产生一个代理角色;代码量会翻倍~开发效率会变低 动态代理优点:一个动态代理类代理的是一个接口,一般就是对应的一类业务,一个动态代理类可以代理多个类(多个真实角色),只要是实现了同一个接口即可!

weixin_73149966的博客 883

双传声器法测量吸声材料的吸声系数(公式推导与解释)

在双传声器法中,通过测量两个位置的声压 p1和 p2​,可以分离出入射波和反射波的声压分量。双传声器法一般在阻抗管中进行,阻抗管的一端为平面波声源,另一端放置待测材料。两个传声器放置在靠近材料的阻抗管内,用于测量管道内的声压。双传声器法是一种常用于测量材料吸声系数的实验方法,通过在管道内使用两个传声器测量声波的入射和反射,来计算出材料的吸声系数。当测试样品较少时,测试时,需要交换两个传声器的位置,目的是为了相位校准。

m0_57407372的博客 1875

硬件测试之—纹波测试为什么不要使用接地夹子

示波器为什么不推荐使用接地夹

qq_19294353的博客 2988

@Component 和 @Bean 和 @configuration的区别

@Component 和 @Bean 和 @configuration的区别

beiback的博客 568

如何实现Docker镜像导入导出 ?

摘要: Docker镜像迁移与备份可通过两种方式实现:1)镜像操作(save/load)完整保存分层结构和元数据,适用于完整备份;2)容器操作(export/import)仅保存文件系统快照,适合创建轻量模板。关键区别在于前者保留历史记录和分层,后者生成单层镜像。save/load命令示例:docker save -o nginx.tar nginx:latest,export/import示例:docker export -o container.tar abc123 && docker

weixin_39291964的博客 875

@Configuration 和 @Bean

使用 @Configuration 和 @Bean 进行 Bean 的声明 虽然 2.0 版本发布以来,Spring 陆续提供了十多个注解,但是提供的这些注解只是为了在某些情况下简化 XML 的配置,并非要取代 XML 配置方式。这一点可以从 Spring IoC 容器的初始化类可以看出:ApplicationContext 接口的最常用的实现类是 ClassPathXmlAppli

u014434925的博客 367

36. 在 SAP Integration Suite 里打通入站 HTTP:iFlow 端点鉴权、角色授权与多节点 403 排障实战

本文探讨了SAP Cloud Integration中HTTP入站连接的认证与授权机制。在Cloud Foundry环境下,认证(证明身份)和授权(权限控制)需分开处理:认证可采用Basic、OAuth或mTLS等方式,授权则通过角色实现。文章详细解析了两种主流配置路径:基于IdP用户的Basic认证(需配置Role Collection)和基于OAuth Client/Service Instance的系统调用(通过Service Key管理权限)。特别指出ABAP系统在多节点环境下可能因cookie编码

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 320

芒果YOLO11改进12:即插即用 | 独家原创改进最新PWConv核心结构|来自最新CVPR2023顶会,

即插即用 | 独家原创改进最新PWConv核心结构|来自最新CVPR2023顶会,

包括YOLOv5、YOLOv7、YOLOv8等模型改进 554

Spring IoC容器与Bean管理25:使用Java Config方式实现Spring IoC一:对象实例化;(@Configuration,@Bean)

说明: (1)自本篇博客开始,接下来的内容是【使用JavaConfig方式实现Spring IoC】; (2)【xm方式,实现IoC】,【注解方式,实现IoC】,【javaConfig方式,实现IoC】,这三种方式只是具体的配置方式不同,在底层本质的原理是一样的; ...

小枯林的博客 978

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

@Configuration和@Bean注解的用途

在上面的代码中,我们声明了一个配置类AppConfig,并在其中定义了两个bean,分别是UserService和UserRepository。使用此注解可以将Java类声明为Spring的配置类,该类中定义的bean将由Spring容器进行管理和配置。通常,配置类中包含了用于创建和配置bean的方法,通过。注解声明要创建的bean,并通过方法返回值指定其类型。Spring会在容器启动时,使用这些配置类中的信息来创建并配置bean对象,并将其注入到其他组件中。在Spring中设置配置类的注解是。

m0_57079558的博客 427

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring注解驱动开发(1)@configuration @bean

@configuration注解 标记该类为配置类 @bean注解 注册一个bean到容器中,id为方法名,类型为返回值类型 /MainConfig.java @Configuration //告诉spring这是一个配置类 public class MainConfig { @Bean //给容器注册一个bean,类型为返回值类型,id为方法名 public Person pe...

码农小姐姐的博客 146

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java 配置spring两种方式,XML与注解(通过@Configuration实现bean注入)

ApplicationContext 的实现类,点击左上角小图标可以查看,我们用到的主要是如下红框“注解实现”和“XML实现”两种方式 XML配置需要写xml文件 注解配置把相应配置写java文件里 JAVA配置类 package com.chenxb.config; import com.chenxb.pojo.ConfigurationAddress; import com.chenxb.pojo.ConfigurationUser; import org.springframework.cont

weixin_44371237的博客 894

spring javaConfig 配置Bean (通过java代码装配Bea)

       尽管在很多场景下通过组件扫描和自动装配实现spring的自动化装配时更为推荐的方式。但是有时候自动化配置的方案行不通,因此需要明确配置spring。比如说,你想要将第三方库中的组件装配到你的应用中,在这种情况下,是没有办法在它的类上添加@Component和@AutoWired注解的,因此就不能使用自动化装配的方案了。 spring配置Bean有两种方式:第一种-显式配置:Java代...

Passion‘s Blog’ 3842

Spring之@Configuraion和@Bean详解

前言 Spring3.0之前要使用Spring必须要有一个xml配置文件,而Spring3.0之后注解慢慢登上舞台,通过注解@Configuration和@Bean可以完全搞定。此时,注解和xml配置形成了相互协作与竞争的关系。随着Springboot的推广,注解的使用在Spring中大放光彩,xml的辉煌一去不返。通过注解,简化了配置,提升了编码效率。 Spring 3.0新增了另外两个实现类:AnnotationConfigApplicationContext 和 AnnotationConfigW

damo的博客 794

Spring装配Bean ---通过Java代码装配Bean

看Spring实战(第4版)笔记 Spring装配Bean。 Bean有两种: 不依赖其他Bean的简单Bean 如CompactDisc Bean 和 依赖其他Bean的Bean 如CDPlayer Bean。其实就是讲如何声明这两种Bean 让Spring知道 我们想把这两种对象注册成Spring的Bean 让Spring来管理。 Spring装配Bean方式的选择: 推荐使用...

dream_heheda的博客 1076

原创 | 一文了解那些和Spring Bean有关的那些注解!

△Hollis, 一个对Coding有着独特追求的人△这是Hollis的第220篇原创分享作者 l cxuan来源 l Hollis(ID:hollischuang)...

HollisChuang's Blog 833

Spring Bean交给容器管理的三种方式:XML、注解扫描与Java Config全解析

在Spring框架中,控制反转(IOC)和依赖注入(DI)是核心思想,而让一个普通类对象被Spring容器接管,本质上就是把对象的创建、装配与销毁流程交给容器统一治理。借助XML配置、注解扫描和Java Config三种声明方式,开发者可以将Bean的定义注册到BeanDefinitionRegistry,从而获得依赖注入、AOP代理、生命周期管理等能力。三种方式各有适用场景:注解扫描常用于业务层开发,XML适合老项目维护,Java Config则擅长装配第三方库与条件化配置。理解BeanDefinitio

weixin_33423874的博客 271

@Configuration & @Bean注册组件到容器

加载配置类的方式获取Spring容器, 所以是通过AnnotationConfigApplicationContext类。通过加载xml配置文件方式获取Spring容器, 是通过ClassPathXmlApplicationContext类。

m0_57001006的博客 215
上一篇: Excel 如何处理更复杂的嵌套逻辑判断?
下一篇: Spring 有哪几种依赖注入的方式?
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值