java的一個依賴注入

聲明: 以下僅作爲個人筆記: 

聲明: 以下僅作爲個人筆記: 

聲明: 以下僅作爲個人筆記: 

參考: https://www.zybuluo.com/dugu9sword/note/382745#tiny-spring-%E5%88%86%E6%9E%90

spring中說的高大上的依賴注入: 通俗說是:

一個bean : 一個java類:

類中依賴了很多屬性:

屬性理解爲: 另一個類 : 需要實例化的類

例如:

public class User {

private Grade grade;

//暫時未設置setter方法

}

 

標籤配置:

<bean id="" class="user類路徑(能夠根據這個路徑尋找到User.class)">

 

一個Bean的原生定義:

Bean的對象實例 : 無法區分屬性 : 採用 Object beanInstance;

Bean的類名稱 : 字符串類型 : 名稱可以稱爲是一個通用屬性 : 

     使用它: 增加了bean的前後置增強處理; 方便操作: 比如獲取類名稱時直接獲取就可以; 不用通過Class的對象再去getSimpleName(); 多花了點代碼,又多花了點時間的感覺;????

Bean的Class類對象 : Class 屬性 : 根據這個屬性 : 可以搞定該類的 構造器、 字段屬性、 成員方法等等的操作

Bean的依賴屬性定義: 因爲會依賴多個, 所以定義爲List<PropertyValue> 

那麼屬性定義呢? Property Value: 定義爲 :

                                                             一個名字 name : 這個是說的如果是基本數據類型屬性的情況

                                                             一個值 value : 那麼直接就用一個值可以設置到該類的屬性中;

                                                              例外: 如果是引用數據類型 : 例如 : user依賴了Grader的時候,

                                                              那麼需要先實例化Grade;

                                                              使用了ref屬性

下面貼上代碼: 

/**
 * @ClassName BeanFactoryAware
 * @Description beanFactoryAware 設置了 BeanFactory : 所以它擁有了 BeanFactory的全部功能
 *                  實現該接口 : 隨便定義一個方法中的引用屬性, 那麼就具有了好多的功能;
 *                  實現該接口 : 隨便定義一個方法中的引用屬性, 那麼就具有了好多的功能;
 *                  實現該接口 : 隨便定義一個方法中的引用屬性, 那麼就具有了好多的功能;
 *                  實現該接口 : 隨便定義一個方法中的引用屬性, 那麼就具有了好多的功能;
 *                  實現該接口 : 隨便定義一個方法中的引用屬性, 那麼就具有了好多的功能;

                 不是隨便定義 : 至少擁有成員BeanFactory : 這個是一個頂層接口 : bean操作都在這了:
  定位 --》 加載--》 初始化(註冊)初始化到IOC容器中 

 * @Author dudu
 * @Date 2019/7/12 9:54
 * @Version 1.0
 */
public interface BeanFactoryAware {

    void setBeanFactory(BeanFactory beanFactory) throws Exception;

}
/**
 *  爲 BeanDefinition的 實例對象 bean 設置屬性值
 * @param bean
 * @param beanDefinition
 */
protected void applyPropertyValues(Object bean, BeanDefinition beanDefinition) throws Exception {

    if(bean instanceof BeanFactoryAware) {
        // bean的增強 Aware 接口
        ((BeanFactoryAware)bean).setBeanFactory(this);
    }
    //遍歷 已經讀取到的PropertyValues屬性 , 進行自動裝配 自動注入
    for (PropertyValue propertyValue : beanDefinition.getPropertyValues().getPropertyValueList()) {
        //獲取屬性值
        Object value = propertyValue.getValue();
        //如果是 ref 引用的 待注入的屬性
        if(value instanceof BeanReference) {
            BeanReference reference = (BeanReference) value;
            //getBean : 其實就是 創建 : 初始化 : 實例化 : 單例化的過程
            value = getBean(reference.getName());
        }
        //實例化完成了 : 依賴屬性完成
        //反射設置到原裝類中
        try {
            //bean.getClass() : 表示 : 類實例對象
            //獲取方法名稱
            //獲取參數類型 : 其實就是 property標籤的value的類型
            //尋找到了要設置屬性的setter方法
            Method setMethod = bean.getClass().getDeclaredMethod(
                    "set" + propertyValue.getName().substring(0,1).toUpperCase()
                                    + propertyValue.getName().substring(1),
                                        value.getClass());
            //設置方法是可以訪問的
            setMethod.setAccessible(true);
            //反射調用 : 爲類實例中的 : set方法設置屬性值 : 其實就是依賴注入
            setMethod.invoke(bean, value);
        } catch (Exception e){
            //如果出現異常, 那麼就進行字段的設置值 : 異常的情況是 : 沒有set方法
            Field field = bean.getClass().getDeclaredField(propertyValue.getName());
            field.setAccessible(true);
            field.set(bean, value);
            //繼續處理下一個依賴屬性
            continue;
        }
    }
}

隨便貼上一張圖 : 理解緩存吧!!!!!!!!!!!!!!!

 

定位 加載 註冊

參考地址:

https://github.com/hddudu/homework/tree/master/proxy/src/main/java/com/hongdu/gupao/spring/

原出處: https://github.com/code4craft/tiny-spring

                                                               

 

 

 

 

 

 

 

 

 

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