控制反轉(IoC):對象創建與依賴關係交給容器管理。依賴注入(DI) 是實現 IoC 的具體手段——構造器注入、Setter 注入、字段注入。
<bean id="bookdao" class="com.demo.BookDAO"/>
<bean id="bookService" class="com.demo.BookService">
<property name="bookDAO" ref="bookdao"/> <!-- Setter 注入 -->
</bean>
獲取:ctx.getBean("bookService")。優點:修改無需重編譯;缺點:配置繁瑣。
| 註解 | 語義層級 |
|---|---|
@Component | 通用組件 |
@Repository | DAO 層 |
@Service | Service 層 |
@Controller | Web 層 |
配置掃描:<context:component-scan base-package="com.demo"/>
| 註解 | 來源 | 默認策略 | 指定名稱 |
|---|---|---|---|
@Autowired | Spring | byType | @Qualifier("name") |
@Resource | J2EE (JSR-250) | byName | @Resource(name="name") |
@Inject | JSR-330 | byType | @Named("name") |
@Autowired 可用於構造器、Setter、字段;@Qualifier 僅用於參數、字段。
<bean id="bookService" class="com.demo.BookService" autowire="byType"/>
<bean id="bookService" class="com.demo.BookService" autowire="byName"/>
較少用,註解方式更靈活。
@Configuration
@ComponentScan("com.demo")
public class AppConfig {
@Bean
public User user() { return new User("config"); }
}
@Configuration ≡ <beans>@ComponentScan ≡ <context:component-scan>@Bean 方法名 ≡ id啟動:new AnnotationConfigApplicationContext(AppConfig.class)
| 方式 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| XML | 解耦、無侵入、運行期修改 | 冗長、易錯 | 第三方庫、跨項目複用、運維需動態調整 |
| 註解 | 簡潔、類型安全、IDE 支援 | 侵入代碼、修改需重編譯 | 自研業務代碼、主流選擇 |
| 自動裝配 | 減少樣板代碼 | 隱式依賴、歧義風險 | 配合註解使用 |
| Java Config | 類型安全、重構友好、程序化邏輯 | 硬編碼、不利於運維修改 | Spring Boot 核心、微服務配置 |
@Service/@Repository + @Autowired)@Configuration + @Bean)