举例
需要开发一个简易的咖啡店管理系统,有以下两种需求:
- 配置类:系统启动时需要创建一些全局通用的对象(比如咖啡机、咖啡豆库存管理器等),这些对象需要被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()
方法,也总是返回通一个实例(保证单例性)。
- 普通组件:系统中还有一些业务逻辑类,比如“订单处理服务”、“员工管理服务”等,这些类实际的业务组件,只是简单地执行逻辑。
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