<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:context="https://www.springframework.org/schema/context"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
https://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example.config" />
</beans>
component-scan 會自動識別 @Configuration 類並註冊為 Bean 定義源。
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
ds.setUsername("root");
ds.setPassword("secret");
return ds;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
// 參數自動注入:Spring 會調用 dataSource() 獲取依賴
return new JdbcTemplate(dataSource);
}
@Bean
@Primary // 標記為首選,解決多實現歧義
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("default");
}
}
@Bean
public OrderService orderService(UserRepository userRepo, PaymentClient payClient) {
return new OrderServiceImpl(userRepo, payClient);
}
@Bean
public EmailService emailService() {
EmailService svc = new EmailService();
svc.setHost("smtp.example.com");
svc.setPort(587);
return svc;
}
@Bean
public SecurityFilter securityFilter() {
return new SecurityFilter(authenticationManager()); // 非遞歸調用,返回代理 Bean
}
@Bean
public AuthenticationManager authenticationManager() {
return new ProviderManager(List.of(daoAuthenticationProvider()));
}
關鍵機制:@Configuration 類被 CGLIB 代理,Bean 方法調用被攔截,優先從容器獲取單例,避免重複創建。
@ConditionalOnProperty、@ConditionalOnMissingBean 等靈活控制@Import、@Profile 實現模塊化配置@Configuration
@PropertySource("classpath:db.properties")
public class DbConfig {
@Value("${jdbc.url}") String url;
@Value("${jdbc.user}") String user;
@Value("${jdbc.pass}") String pass;
@Bean
public DataSource dataSource() { /* 使用上屬性 */ }
}