@Service、方法上 @Transactional,閱讀即理解,無需在 XML 間跳轉。@ConditionalOnProperty、@Profile 靈活控制 Bean 生命週期。<list>/<map>/<props>)。<!-- applicationContext.xml -->
<context:component-scan base-package="com.myapp" /> <!-- 掃描註解 Bean -->
<context:annotation-config /> <!-- 支持 @Autowired 等 -->
<tx:annotation-driven transaction-manager="txManager" /> <!-- 註解事務 -->
<!-- 僅 XML 配置第三方/基礎設施 Bean -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"> ... </bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> ... </bean>
「註解慢」是錯覺。Spring 啟動時掃描類路徑解析註解,一次性構建 BeanDefinition 緩存;運行期完全基於 BeanDefinition,與 XML 解析來源無關。真正影響性能的是:
base-package="com")導致類加載爆炸。@Autowired 字段注入導致循環依賴檢測開銷。spring-context-indexer 編譯期生成候選索引(Spring 5+)。@Service/@Repository/@Component 分層標註,禁用 @ComponentScan 無參數掃描全盤。核心原則:註解為主,XML 為輔,配置與代碼同在一處,降低認知負荷。