Bean 装配:@Component、@Service、@Repository
使用构造型注解,通过 @Bean 定义 Bean,并了解组件扫描
Bean 装配:@Component、@Service、@Repository 是 CoddyKit 上的免费 Java Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
构造型注解
Spring 提供了构造型注解,用于将类标记为 Spring 管理的对象并说明其角色:@Component(通用对象)、@Service(业务逻辑)、@Repository(数据访问)、@Controller/@RestController(Web 层)。
@Component:通用对象
任何使用 @Component 注解的类都会在组件扫描期间被检测到,并注册为 Spring 管理的对象。它是所有其他构造型注解的基础。
@Component
public class EmailFormatter {
public String format(String to, String subject) {
return "To: " + to + "\nSubject: " + subject;
}
}@Service:业务逻辑层
@Service 是 @Component 的一种特殊形式,从语义上表示这是一个服务类。Spring 对它的处理方式与 @Component 相同,但它能够表达设计意图,也可能被 AOP 顾问使用。
@Service
public class OrderService {
private final OrderRepository repo;
public OrderService(OrderRepository repo) { this.repo = repo; }
public Order placeOrder(Cart cart) { /* business logic */ return repo.save(new Order(cart)); }
}@Repository:数据访问层
@Repository 用于标记 DAO 类。Spring 会自动转换持久化异常:SQLException 和供应商特定的异常会被包装在 Spring 的 DataAccessException 异常体系中。
@Repository
public class JdbcUserRepository {
private final JdbcTemplate jdbc;
public JdbcUserRepository(JdbcTemplate jdbc) { this.jdbc = jdbc; }
public User findById(long id) {
return jdbc.queryForObject("SELECT * FROM users WHERE id=?",
new BeanPropertyRowMapper<>(User.class), id);
}
}配置类中的 @Bean
请在 @Configuration 类中的方法上使用 @Bean,以手动注册对象——这对于无法添加注解的第三方类很有用。
@Configuration
public class AppConfig {
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper().registerModule(new JavaTimeModule());
}
@Bean
public RestTemplate restTemplate() { return new RestTemplate(); }
}组件扫描
@SpringBootApplication 会从应用的包开始向下触发组件扫描。子包中的类会被自动发现。请使用 @ComponentScan(basePackages=...) 进行自定义配置。
// Explicit scan (rarely needed in Spring Boot):
@SpringBootApplication
@ComponentScan(basePackages = {"com.example.app", "com.example.shared"})
public class MyApp { ... }对象命名
默认情况下,对象名称是类名首字母小写后的形式(OrderService → orderService)。您可以指定自定义名称:@Service("orders") 或 @Bean("myMapper")。
@Service("orderSvc")
public class OrderService { ... }
// Inject by name:
@Autowired @Qualifier("orderSvc")
private OrderService svc;对象作用域
默认作用域是 singleton(每个 Spring 上下文只有一个实例)。其他作用域包括:prototype(每次注入时创建新实例)、request、session(仅限 Web)。
@Service
@Scope("prototype")
public class ReportBuilder {
private List<String> lines = new ArrayList<>();
public void addLine(String line) { lines.add(line); }
}使用 @Primary 和 @Qualifier 消除歧义
当多个对象实现同一个接口时,请使用 @Primary 标记默认对象,或在注入点使用 @Qualifier("name") 来选择特定对象。
@Service @Primary
public class CacheUserService implements UserService { ... }
@Service
public class DbUserService implements UserService { ... }
// Inject specific one:
@Autowired @Qualifier("dbUserService")
private UserService userService;延迟初始化
默认情况下,单例对象会在启动时创建。请使用 @Lazy 注解将创建操作延迟到首次使用时——这适用于很少使用但创建成本较高的对象。
@Service @Lazy
public class HeavyReportService {
public HeavyReportService() { System.out.println("Created on first use"); }
}@PostConstruct 和 @PreDestroy
请使用 @PostConstruct 在依赖注入完成后运行初始化逻辑。请使用 @PreDestroy 在对象销毁前清理资源。
@Service
public class CacheService {
@PostConstruct
public void init() { System.out.println("Cache warming up..."); }
@PreDestroy
public void cleanup() { System.out.println("Cache cleared."); }
}快速检查
@Repository 比 @Component 多提供了什么行为?
回顾
业务逻辑使用 @Service,DAO 使用 @Repository,工具类使用 @Component,第三方类型使用 @Bean。@Primary/@Qualifier 用于解决多个对象之间的选择问题。使用 @PostConstruct/@PreDestroy 添加生命周期钩子。
常见问题解答
「Bean 装配:@Component、@Service、@Repository」课时是免费的吗?
是的 — 「Bean 装配:@Component、@Service、@Repository」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「Bean 装配:@Component、@Service、@Repository」这节课中我会学到什么?
使用构造型注解,通过 @Bean 定义 Bean,并了解组件扫描 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「Bean 装配:@Component、@Service、@Repository」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 自动配置与 Spring Boot 启动器
- 应用属性与配置文件
- Bean 装配:@Component、@Service、@Repository
- 构造器注入与循环依赖