Java Config 配置IOC容器
阿新 • • 發佈:2021-02-07
1、概述
1.1、由來
Spring IOC中有個重要的概念——Bean,Bean即物件,我們通過配置Bean讓IOC容器管理Bean,而最常用的方式就是通過XML檔案來配置,但通過XML檔案來配置比較繁瑣,數量較多的時候會使專案變得複雜,而且使用XML配置沒有編譯時的型別安全檢查
所以在Spring4以後,Spring推薦使用Java Config代替XML檔案來配置Bean
Java Config就是使用註解,通過java類來描述Bean配置的元件
Java Config結合了XML的解耦和JAVA編譯時檢查的優點,可以看成是一個XML檔案,只不過是由Java編寫的
1.2、優缺點
1.2.1、優點
- 摒棄xml配置檔案,使用Java類管理物件和依賴
- 註解配置相對分散,使用Java Config可以集中管理配置
- 可以在編譯時進行依賴檢查,不容易出錯
1.2.2、缺點
與xml配置檔案相比,可維護性差
2、相關注解
- @Configuration:描述類,用於標記Java Config配置類
- @Bean:描述方法,IOC容器會管理被標記方法返回的物件(bean id預設為方法名)
- @ComponentScan:描述類,掃描指定類中的註解配置(作用與xml配置中的context:component-scan標籤相同)
- @ImportResource:描述類,載入靜態檔案,可使用@Value註解獲取
| 由於是Java類的形式,所以同樣可以使用各種類註解,比如@Primary
3、使用步驟
3.1、建立配置類
- 需要使用 @Configuration 註解標註配置類
//JavaConfig.java
package spring.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JavaConfig {
}
3.2、建立bean
StudentController類
//StudentController.java
package spring. controller;
import lombok.Data;
import spring.service.StudentService;
@Data
public class StudentController {
private StudentService service;
public StudentController() {
System.out.println("StudentController建立");
}
}
StudentService類
//StudentService.java
package spring.service;
public class StudentService {
public StudentService() {
System.out.println("StudentService建立");
}
}
建立bean
- 使用@Bean註解標註方法,IOC容器管理方法返回的物件(與XML配置中的標籤作用相同)
- bean id為方法名
//JavaConfig.java
package spring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import spring.controller.StudentController;
import spring.service.StudentService;
@Configuration
public class JavaConfig {
//此處建立service、controller兩個bean
@Bean
public StudentService service() {
StudentService service = new StudentService();
return service;
}
@Bean
public StudentController controller() {
StudentController controller = new StudentController();
return controller;
}
}
測試
測試類
//ApplicationContext.java
package spring;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import spring.config.JavaConfig;
import spring.controller.StudentController;
import java.util.Arrays;
public class ApplicationContext {
public static void main(String[] args) {
AbstractApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
String[] beanDefinitionNames = context.getBeanDefinitionNames();
Arrays.stream(beanDefinitionNames).forEach(e -> System.out.println(e));
}
}
測試結果
| 列印IOC容器中所有的bean
觀察到兩個bean建立成功
3.3、設定物件依賴
- 設定物件依賴時,將依賴的物件通過方法的屬性傳入,並在方法中通過構造方法、setter等方式注入依賴
- 在查詢屬性對應的bean時,先按屬性名查詢,找不到再按屬性型別查詢
//JavaConfig.java
......
@Bean
public StudentController controller(StudentService service) {
StudentController controller = new StudentController();
controller.setService(service);
return controller;
}
測試
測試結果
| 列印controller
觀察到屬性注入成功