Spring10-@Component 和 @Configuration
Component是最通用的组件标识注解。你加了它,Spring 扫描时就会把这个类创建成 Bean 放进容器里。@ComponentSystem.out.println("发送邮件:" + msg);@Service@AutowiredemailSender.send("欢迎 " + user + "!");你没有手动,Spring 自动帮你装配进来了。让 Spring 接管这个类的生命周期。表
@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) |
例如:UserService、MailSender |
| 第三方类不能加注解,但你想让它被 Spring 管理 | @Configuration + @Bean |
例如:HikariDataSource、RestTemplate |
| 配置 SDK、拦截器、过滤器、数据源等 | @Configuration |
例如:OssConfiguration |
| 框架自动装配多个组件 | @Configuration(常结合 @ConditionalOnProperty) |
Spring Boot Starter 机制里大量使用 |
7、一句话记忆口诀
@Component:我要托管这个类。
@Configuration:我要托管这些 Bean(通过方法)。一个是“交对象”,一个是“造对象”。
更多推荐
所有评论(0)