1. 程式人生 > 其它 >Eureka原始碼解析

Eureka原始碼解析

1.SpringBoot中的自動裝載

1.1 ImportSelector

ImportSelector介面是Spring匯入外部配置的核心介面,在SpringBoot的自動化配置和@EnableXXX(功能性註解)中起到了決定性的作用。當在@Configuration標註的CLass上使用@Import引入了一個ImportSelector實現類後,會把實現中返回的Class名稱都定義為bean.

package org.springframework.context.annotation;

import org.springframework.core.type.AnnotationMetadata;

public interface ImportSelector {
  String[] selectImports(AnnotationMetadata var1);
}

DeferredImportSelector介面繼承ImportSelector,他和ImportSelector的區別在於裝載bean的時機上,DeferredImportSelector需要等所有的@Configuration都執行完畢後才會進行裝載;
程式碼如下:

@Data
public class User {

    private String username;
    private Integer age;
}

public class UserConfiguration {

    @Bean
    public User getUser(){
        User user = new User();
        user.setUsername("ABC");
        user.setAge(123);
        return user;
    }

}

public class UserImportSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        //獲取配置類的名稱
        return new String[]{UserConfiguration.class.getName()};
    }
}

定義註解:

package com.yxkj.bean;

import org.springframework.context.annotation.Import;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.TYPE)
@Import(UserImportSelector.class)
public @interface EnableUserBean {
}

啟動類:

@EnableUserBean
public class TestApplication {
    public static void main(String[] args) {
        //獲取spring容器
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestApplication.class);
        User user = ac.getBean(User.class);
        System.out.println(user);
    }
}