public class GoodsService {
private String name;
public GoodsService() {
System.out.println("GoodsService無參構造方法");
}
public void print(){
System.out.println("GoodsService#printf方法");
}
}
public class App {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(GoodsService.class);
GoodsService bean = ac.getBean(GoodsService.class);
bean.print();
}
}
執行結果:
GoodsService無參構造方法
GoodsService#printf方法
整體解析:
AnnotationConfigApplicationContext可以輸入包含Configuration、@Import(Xxxx.class)、普通類。
將各種配置類解析成Spring內部定義的BeanDefinition,並以 beanName爲 key,BeanDefinition爲 value 存儲在DefaultListableBeanFactory 中的 beanDefinitionMap
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
將 beanName 存入 beanDefinitionNames中,
private volatile List<String> beanDefinitionNames = new ArrayList<>(256);
然後遍歷 beanDefinitionNames 中的 beanName,進行 bean 的實例化並填充屬性,在實例化的過程中,如果有依賴沒有被實例化將先實例化其依賴,然後實例化本身,實例化完成後將實例存入單例 bean 的緩存中,當調用 getBean 方法時,到單例 bean 的緩存中查找,如果找到並經過轉換後返回這個實例 (如 LoginResource 的實例),之後就可以直接使用了。