1. 程式人生 > 其它 >Java Config 配置IOC容器

Java Config 配置IOC容器

技術標籤:Javaspringjavaioc

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、優點

  1. 摒棄xml配置檔案,使用Java類管理物件和依賴
  2. 註解配置相對分散,使用Java Config可以集中管理配置
  3. 可以在編譯時進行依賴檢查,不容易出錯

1.2.2、缺點

與xml配置檔案相比,可維護性差

2、相關注解

  1. @Configuration:描述類,用於標記Java Config配置類
  2. @Bean:描述方法,IOC容器會管理被標記方法返回的物件(bean id預設為方法名)
  3. @ComponentScan:描述類,掃描指定類中的註解配置(作用與xml配置中的context:component-scan標籤相同)
  4. @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

觀察到屬性注入成功