在 Spring 框架中,Bean 的注入方式主要有以下幾種,其中一些是自動注入的。以下是詳細說明:
1. 構造函數注入 (Constructor Injection)
自動注入:使用 @Autowired
注解時,Spring 容器會自動調用帶有 @Autowired
注解的構造函數,并傳入所需的依賴對象。
@Component
public class MyService {private final MyRepository repository;@Autowiredpublic MyService(MyRepository repository) {this.repository = repository;}
}
2. Setter 注入 (Setter Injection)
自動注入:使用 @Autowired
注解時,Spring 容器會在創建 Bean 實例后,調用帶有 @Autowired
注解的 setter 方法,并傳入所需的依賴對象。
@Component
public class MyService {private MyRepository repository;@Autowiredpublic void setRepository(MyRepository repository) {this.repository = repository;}
}
3. 字段注入 (Field Injection)
自動注入:使用 @Autowired
注解時,Spring 容器會自動將依賴注入到帶有 @Autowired
注解的字段中。
@Component
public class MyService {@Autowiredprivate MyRepository repository;
}
4. 基于配置文件的注入 (XML-based Configuration)
手動配置:通過 XML 配置文件來定義 Bean 及其依賴關系,不是自動注入。
<bean id="myService" class="com.example.MyService"><property name="repository" ref="myRepository" />
</bean><bean id="myRepository" class="com.example.MyRepository" />
5. 基于 Java 配置的注入 (Java-based Configuration)
手動配置:使用 @Configuration
和 @Bean
注解來配置 Bean 及其依賴關系,不是自動注入。
@Configuration
public class AppConfig {@Beanpublic MyRepository myRepository() {return new MyRepository();}@Beanpublic MyService myService(MyRepository repository) {return new MyService(repository);}
}
6. @Resource
自動注入:@Resource
注解是 JSR-250 標準的一部分,Spring 也支持它。它可以用于字段、setter 方法或構造函數,Spring 容器會自動注入依賴。
@Component
public class MyService {@Resourceprivate MyRepository repository;
}
7. @Inject
自動注入:@Inject
注解是 JSR-330 標準的一部分,Spring 也支持它。它可以用于字段、setter 方法或構造函數,Spring 容器會自動注入依賴。
@Component
public class MyService {@Injectprivate MyRepository repository;
}
總結
自動注入:
構造函數注入(使用 @Autowired
)
Setter 注入(使用 @Autowired
)
字段注入(使用 @Autowired
)
字段、setter 方法或構造函數注入(使用 @Resource
或 @Inject
)
手動配置:
基于配置文件的注入(XML 配置)
基于 Java 配置的注入(@Configuration
和 @Bean
)