Eureka原始碼解析
阿新 • • 發佈:2021-06-26
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);
}
}