spring5.0.8(01)

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 的實例),之後就可以直接使用了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章