Khác ở chỗ inter-bean call có được container quản lý hay không.
@Configuration(full mode): Spring tạo CGLIB subclass cho class config. Một@Beanmethod gọi trực tiếp@Beanmethod khác sẽ bị chặn và trả về singleton trong container.@Beantrong class không có@Configuration, hoặc@Configuration(proxyBeanMethods = false)(lite mode): không sinh CGLIB subclass. Lời gọi giữa các@Beanmethod là lời gọi Java thuần → tạo instance mới mỗi lần, nằm ngoài container.
java
@Configuration // full mode
public class AppConfig {
@Bean
public DataSource dataSource() { return new HikariDataSource(); }
@Bean
public JdbcTemplate jdbcTemplate() {
// full mode: returns the singleton above
// lite mode: builds a SECOND DataSource
return new JdbcTemplate(dataSource());
}
}Hậu quả ở lite mode là hai connection pool cùng tồn tại — lỗi rất khó nhìn ra.
Cách viết an toàn cho cả hai mode: đừng gọi chéo @Bean method, hãy nhận dependency qua tham số của factory method (jdbcTemplate(DataSource ds)). Khi đó bật proxyBeanMethods = false được và tiết kiệm một lớp proxy — đây là lý do auto-configuration của Spring Boot dùng dạng này.