@Configuration和@Component注解的区别

举例

需要开发一个简易的咖啡店管理系统,有以下两种需求:

  1. 配置类:系统启动时需要创建一些全局通用的对象(比如咖啡机、咖啡豆库存管理器等),这些对象需要被Spring管理,并且在整个应用中只需要一个实例。我们通常会把这些创建逻辑写在一个专门的配置类里。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// 标记这个类为配置类,告诉 Spring:这里面定义的 @Bean 方法用来生成 Bean 对象
@Configuration
public class CoffeeShopConfig {

    // 定义一个咖啡机 Bean,整个应用只有一个咖啡机实例
    @Bean
    public CoffeeMachine coffeeMachine() {
        return new CoffeeMachine();
    }
    
    // 定义一个库存管理器 Bean
    @Bean
    public InventoryManager inventoryManager() {
        return new InventoryManager();
    }
}

在这个例子中,我们使用了@Configuration注解,这样做地好处是:

  • 专用语义:明显告诉其他开发人员,这个类是用来配置Bean地。
  • CGLIB代理:Spring会对这个类做代理,确保即使在内部多次调用coffeeMachine()方法,也总是返回通一个实例(保证单例性)。
  1. 普通组件:系统中还有一些业务逻辑类,比如“订单处理服务”、“员工管理服务”等,这些类实际的业务组件,只是简单地执行逻辑。
import org.springframework.stereotype.Service;

// 这里使用 @Service,其实内部就是 @Component,表示这个类是一个业务服务组件
@Service
public class OrderService {

    // 业务逻辑方法,例如下订单
    public void placeOrder(String orderId) {
        // 下订单逻辑
        System.out.println("订单 " + orderId + " 已下单!");
    }
}

在这个例子中,OrderService是一个普通地业务组件,我们使用了@Service(它本身是一个特殊的@Component

如何判断使用哪个?

  • 使用 @Configuration 的情况
    当需要写一个专门的类来定义和创建Bean时(通过写多个@Bean方法),这时候应该使用@Configuration。例如:
    • 数据库配置类、缓存配置类、第三方组件的配置等。
  • 使用@Component(以及 @Service、@Repository、@Controller 等)
    当类主要用来封装业务逻辑、数据访问、控制器逻辑等,并且只需要被Spring管理,不涉及内部的Bean定义时,使用 @Component 或其派生注解即可。例如:
    • 业务服务类(@Service)
    • 数据访问类(@Repository)
    • 控制器类(@Controller 或 @Rest Controller)

技巧

以后遇到问题时,可以问自己:
“ 这个类是用来写配置、定义 Bean 的么?”

  • 如果是,就使用 @Configuration
  • 如果只是一个普通的业务组件,就使用@Component(或更具体地注解,如 @Service、@Repository等)。

版权声明 版权所有 © 锦曜 。
本文为原创作品,未经授权,禁止转载、摘编或以任何形式使用。若需引用或转载,请联系本人获取授权,并注明原文链接及作者姓名。
使用许可:
非商业用途:个人可在非商业情况下分享文章链接,但不得修改或以其他形式复制内容。
商业用途:如需将文章用于商业用途,需事先获得书面许可。
免责说明:
本文章内容仅代表作者个人观点,不代表任何组织或机构立场。因文章内容产生的任何问题,作者不承担法律责任。
联系邮箱:1092575682@qq.com

(0)
上一篇 2025年1月16日 上午9:53
下一篇 2025年1月26日 下午4:32

相关推荐

  • java.sql.SQLException: The SQL statement must not be null or empty

    背景:Druid 1.2.8版本;SQL Server 2005版本;jtds 1.3.1版本。异常如下图所示: 这个异常很奇怪,在我另外一个项目中,也是这样的引用,是没有这个异常的,可是当我新建一个项目时,却出现了这个异常,网上说的要加validation-query: SELECT 1并没有解决这个问题。然后我尝试切换到默认的hikari驱动就没有这个异…

    2025年3月15日
    6420

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我

159-7059-1287

在线咨询: QQ交谈

邮件:1092575682@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信