| 方式 | 優點 | 缺點 | 推薦度 |
| 實現 InitializingBean/DisposableBean | 標準接口 | 強耦合 Spring API | ⭐ |
| XML init-method/destroy-method | 零侵入,靈活 | 配置分散 | ⭐⭐⭐ |
@PostConstruct/@PreDestroy (JSR-250) | 標準化,就近聲明 | 需 <context:annotation-config/> | ⭐⭐⭐⭐⭐ |
依賴檢查:@Required 細粒度控制
- 僅標注於 Setter 方法,檢查「Setter 是否被調用」而非「屬性是否非空」。
- 啟用:
<context:annotation-config/>。
- 未滿足拋異常,強制屬性注入。
自動裝配三大註解深度解析
@Autowired:按類型裝配核心
- 作用於:構造器、Setter、字段、任意多參方法。
- 數組/集合/Map(Key 為 String)自動收集所有匹配 Bean。
required=false 允許不滿足。類中僅一個構造器可 required=true。
- 特殊類型(BeanFactory、ApplicationContext 等)自動注入,忽略 @Qualifier。
@Qualifier:消除歧義利器
- 配合 @Autowired 指定 Bean 名稱:
@Autowired @Qualifier("primaryDao")。
- 可標注方法參數:
@Autowired public void setDao(@Qualifier("primary") Dao dao)。
- XML 聲明:
<qualifier value="primary"/> 或 <meta key="type" value="primary"/>。
@Resource (JSR-250):按名稱裝配首選
- 語義:
@Resource(name="beanName"),默認取字段/屬性名。
- 回退策略:byName 失敗 → 嘗試 byType。
- 系統類型注入同 @Autowired,忽略 @Qualifier。
JavaConfig:@Configuration + @Bean 純 Java 配置
@Configuration
@Import({ServiceConfig.class, DaoConfig.class}) // 組合配置類
public class AppConfig {
@Bean(initMethod = "init", destroyMethod = "cleanup")
@Scope("prototype")
public UserService userService() {
return new UserServiceImpl(userDao());
}
@Bean
public UserDao userDao() {
return new UserDaoImpl();
}
}
容器啟動:
// 1. 掃描包路徑
new AnnotationConfigApplicationContext("com.example");
// 2. 直接指定配置類
new AnnotationConfigApplicationContext(AppConfig.class);
// 3. 動態註冊
ctx.register(OtherConfig.class);
ctx.refresh();
混合配置:XML 與註解協作最佳實踐
XML 為主,引入註解配置類
<context:annotation-config/>
<bean class="com.example.config.AppConfig"/>
<context:component-scan base-package="com.example.config"/>
註解為主,導入 XML
@Configuration
@ImportResource("classpath:/spring/legacy-beans.xml")
public class AppConfig { ... }
總結
註解配置簡潔直觀,適合標準化場景;XML 功能豐富成熟,支援複雜裝配。現代 Spring 專案推薦註解為主、XML 為輔,靈活組合發揮各自優勢。
- 上一篇文章: Java 數組與 List 互轉完全指南:toArray 與 asList 核心用法詳解
- 下一篇文章: 使用 Topcased 擴展 EMF 模型編輯視圖:從屬性分組到友好界面
Copyright ©
程式碼之家 All Rights Reserved