@Component 和 @Configuration的区别


1、先搞清楚「Spring 管理的对象」是什么

在 Spring 里,我们经常听到一句话:

“Spring 会帮我们管理 Bean。”

意思是:

  • 你不用自己 new 对象;

  • Spring 会帮你创建、保存、注入;

  • 你只要加上注解告诉它:“我要让这个类由你托管。”

那怎么告诉 Spring?

👉 用注解,比如:@Component@Service@Repository@Controller@Configuration 等。


2、@Component 是啥?

🌟 定义:

@Component最通用组件标识注解
你加了它,Spring 扫描时就会把这个创建成 Bean 放进容器里。

import org.springframework.stereotype.Component;

@Component
public class EmailSender {
    public void send(String msg) {
        System.out.println("发送邮件:" + msg);
    }
}

然后在别的地方你可以直接用:

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

@Service
public class UserService {
    @Autowired
    private EmailSender emailSender;

    public void register(String user) {
        emailSender.send("欢迎 " + user + " !");
    }
}

你没有手动 new EmailSender(),Spring 自动帮你装配进来了。

这就是 @Component 的作用:让 Spring 接管这个类的生命周期


📦 延伸的四个“兄弟注解”

其实下面这些都相当于 @Component,只是更语义化的版本:

注解 含义 常用层次
@Component 通用组件 所有层都能用
@Controller 表示控制层(MVC接口) Web 层
@Service 表示服务/业务逻辑层 Service 层
@Repository 表示数据访问层 DAO 层

它们本质上都是 @Component 的别名。


3、@Configuration 是啥?

🌟 定义:

@Configuration 表示「这是一个配置类」,里面可以定义多个 Bean

Spring 启动时:

  • 会扫描到这个类;

  • 执行其中带 @Bean 的方法;

  • 返回的对象放进容器。

例子:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public EmailSender emailSender() {
        return new EmailSender(); // 手动创建对象,交给Spring管理
    }

    @Bean
    public UserService userService() {
        return new UserService(emailSender());
    }
}

这里:

  • @Configuration 告诉 Spring:“我定义了几个 Bean”;

  • @Bean 告诉 Spring:“请把这个方法的返回值放进容器”。

然后你就能在别的类里用 @Autowired 拿到这些 Bean。


4、两者区别(重点表)

对比点 @Component @Configuration
定义 标识一个普通类,让Spring自动扫描创建对象 标识一个配置类,用来手动定义多个 Bean
Bean 的创建方式 由 Spring 扫描自动创建 由你在 @Bean 方法中手动返回
用途 普通业务类、工具类 配置类(数据源、第三方SDK、拦截器等)
是否必须加 @Bean 不需要 一般需要(否则类本身只是一个配置Bean)
是否被扫描创建 是(要在扫描包路径下) 是(同样需在扫描路径下)

5、你可以这样理解

类比 含义
@Component 是告诉 Spring “帮我 new 这个对象” 自动生成一个 Bean
@Configuration 是告诉 Spring “我自己 new 对象,但请帮我托管这些 Bean 手动定义多个 Bean

比如:

  • @Component单个类交给 Spring;

  • @Configuration一批对象交给 Spring。


6、使用场景总结

场景 用哪个? 示例
普通业务类 / 工具类 / 逻辑类 @Component(或 @Service@Repository 例如:UserServiceMailSender
第三方类不能加注解,但你想让它被 Spring 管理 @Configuration + @Bean 例如:HikariDataSourceRestTemplate
配置 SDK、拦截器、过滤器、数据源等 @Configuration 例如:OssConfiguration
框架自动装配多个组件 @Configuration(常结合 @ConditionalOnProperty Spring Boot Starter 机制里大量使用

7、一句话记忆口诀

  • @Component我要托管这个类

  • @Configuration我要托管这些 Bean(通过方法)

一个是“交对象”,一个是“造对象”。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐