0Pricing
Java Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 自动配置与 Spring Boot 启动器
  2. 应用属性与配置文件
  3. Bean 装配:@Component、@Service、@Repository
  4. 构造器注入与循环依赖
← 返回 Java Academy