SpringBoot @Configuration与@Bean注解使用指南

周末不加班
周末不加班
发布时间:2026-10-15| 4人浏览过
原创

本文详细介绍SpringBoot中使用@Configuration和@Bean注解替代传统XML配置的方法,涵盖配置类创建、Bean注册验证以及proxyBeanMethods参数对单例管理和组件依赖的影响,提供Full模式与Lite模式的实战建议。

基于注解的配置类与Bean注册

在传统开发中,通常通过XML文件定义Bean元素,由Spring启动时解析并注册到容器中。自Spring 3.0起,引入了纯Java配置方式:@Configuration用于标记一个类作为配置类,其功能等同于XML配置文件;@Bean则用于方法级别,将方法的返回值注册为Spring容器中的组件。

要开始这一过程,首先需要定义待管理的实体类。例如,创建一个包含名称和年龄的用户类,以及一个部门类,二者可建立关联:

package com.example.ethan.bean;
public class User {
    private String name;
    private Integer age;
    private Dept dept;
    // Getter/Setter 省略
}
package com.example.ethan.bean;
public class Dept {
    private String name;
    public Dept(String name) { this.name = name; }
    // Getter 省略
}

第1步:创建配置类并注册Bean

目的:声明配置类并手动添加组件到IOC容器。

操作:新建Java类并在其上添加@Configuration注解。在该类中编写方法,返回需要管理的对象实例,并在方法上添加@Bean注解。若未指定Bean名称,默认以方法名为组件ID。

package com.example.ethan.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConfigDemo {
    // 方法名user01即为Bean ID
    @Bean
    public User user01() {
        return new User("zhangsan", 18);
    }

    // 自定义Bean ID为my rd
    @Bean("my rd")
    public Dept rd() {
        return new Dept("研发部");
    }
}

第2步:验证容器中的组件状态

目的:确认配置类及其管理的Bean是否成功加载至Spring上下文。

操作:在主程序入口获取ConfigurableApplicationContext,遍历或查询特定Bean进行打印测试。

package com.example.ethan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class EthanApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(EthanApplication.class, args);
        
        // 查看容器内所有Bean名称
        for (String name : run.getBeanDefinitionNames()) {
            System.out.println(name);
        }
        
        // 验证配置类本身也是容器中的一个Bean,且为CGLIB代理对象
        ConfigDemo bean = run.getBean(ConfigDemo.class);
        System.out.println(bean); // 输出如: ...$$EnhancerBySpringCGLIB$$...
    }
}

运行后控制台显示configDemo、user01和my rd均被容器管理。值得注意的是,@Configuration修饰的类自身也是一个Bean,且默认为CGLIB动态代理对象。

@Bean的单例特性与依赖传递

默认情况下,通过@Bean创建的组件是单实例的。验证代码如下:

Dept d1 = run.getBean("my rd", Dept.class);
Dept d2 = run.getBean("my rd", Dept.class);
System.out.println(d1 == d2); // 输出: true

然而,当组件之间存在依赖关系时(如用户依赖于某个部门),直接调用配置类内部的方法与从容器获取可能会有所不同。这涉及到@Configuration的核心属性:proxyBeanMethods。

Full模式与Lite模式详解

proxyBeanMethods属性控制配置类是否需要生成CGLIB代理,默认为true。

Full模式(proxyBeanMethods = true)

在此模式下,SpringBoot会创建配置类的代理对象。当代理对象调用带有@Bean注解的方法时,代理会拦截该调用,优先检查容器中是否已存在该单实例Bean。若存在则直接返回,不存在才执行方法创建新实例。

应用场景:确保组件间的严格依赖。例如用户类引用了部门Bean:

@Configuration(proxyBeanMethods = true)
public class ConfigDemo {
    @Bean
    public User user01() {
        User u = new User();
        u.setDept(rd()); // 通过代理调用rd(),确保获取的是单实例Dept
        return u;
    }
    
    @Bean("tom")
    public Dept rd() {
        return new Dept("研发部");
    }
}

若从容器分别获取user01内部的部门和容器里的tom,两者将是同一对象(== true)。

Lite模式(proxyBeanMethods = false)

不生成代理,每次调用@Bean方法都会直接执行并返回一个新对象。此时,即使容器里已经注册了这个Bean,也不会被复用。

应用场景:配置类内部组件无相互依赖关系时。使用Lite模式可以减少CGLIB的字节码生成和判断开销,加快容器启动速度。

最佳实践总结

  • 组件互依:如果配置类内的@Bean方法互相调用,必须使用Full模式(默认),以保证依赖的是同一个单实例对象。
  • 独立组件:如果各Bean之间没有依赖关系,建议显式设置@Configuration(proxyBeanMethods = false),启用Lite模式以提升性能。

以上就是SpringBoot中@Configuration与@Bean注解使用的详细内容,更多关于SpringBoot配置优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。