使用註解和反射實現SpringIoC容器(簡潔版)

2021-10-24 17:07:07 字數 4063 閱讀 5481

首先明確一下自己的需求:我們需要自定義一些註解,比如類似於spring的bean或者configuration註解,bean註解主要是放在方法上的,目的是將當前方法的返回值放入springioc容器中,configuration主要是用於識別當前類是乙個配置類的,註解定義好之後,就是利用反射實現,首先我們需要定義乙個類,這個類可以識別configuration、bean之類的註解,並且可以獲取加了@bean註解的方法,執行方法,將方法的返回值加入到ioc容器中。

1、實體類

public class user 

public user()

public string getname()

public void setname(string name)

public integer getage()

public void setage(integer age)

public integer getid()

public void setid(integer id)

}

2、業務層**

public inte***ce userservice 

public class userserviceimpl implements userservice

@override

public user modify(int id)

}@myrepository

public class userserviceimpl2 implements userservice

@override

public user modify(int id)

}

3、註解annotation包

/**

* 當前註解放在方法上,表示根據方法的返回值生成乙個bean物件,並放在ioc容器中

*/@retention(retentionpolicy.runtime)

@target(elementtype.method)

public @inte***ce mybean

/** * 放在類上,表示當前類是乙個配置類

*/@target(elementtype.type)

@retention(retentionpolicy.runtime)

public @inte***ce myconfiguration

/** * 註解放在類上,可生成當前類的物件,並放在ioc容器中

*/@retention(retentionpolicy.runtime)

@target(elementtype.type)

public @inte***ce myrepository

4、配置類

/**

* 表示當前類是乙個配置類

*/@myconfiguration

public class classconfig

@mybean

public userservice getuserservice()

}

這裡有兩個最主要的功能,乙個是實現@bean註解,另乙個是實現@myrepository註解。

(1)@bean:這裡主要的思路是:

第一步:找到配置類(也即類上有@myconfiguration註解的類),這裡在初始化的時候就可以給出了。

第二步:識別配置類上的每乙個加了@mybean註解的方法,將所有方法新增到map容器中。

第三步:執行map容器中的每乙個方法,生成配置類中的所有bean

(2)@myrepoitory:這裡的主要思路是:

第一步:首先需要找到@myresporitory標註的類,這裡就需要掃瞄包了。

第二步:找到某一包下所有標註了@myrepository的類並返回。

第三步:根據全限定類名生成對應的物件,並放入ioc容器中。

private mapbeanmethods = new hashmap<>(); // 配置類裡面的有mybean註解的方法

private mapbeans = new hashmap<>() ; // 表示ioc容器裡面裝的bean

private class<?> configclass ;// 配置類

/*** @param configclass

*/// 首先需要判斷這是否時乙個配置類,也即是否有configuration註解

if(ismyconfiguration(configclass))else

}if (!packagename.isempty())

}/**

* 判斷當前類是否是乙個配置類

* @return

*/public boolean ismyconfiguration(class<?> clazz) throws exception

return true ;

// annotation annotation = clazz.getannotation(myconfiguration.class) ;

// if(annotation!=null)

// return false ;

}/**

* 獲取自動配置類裡面的方法

* @return

*/private mapgetmethods()else

" "+method);

beanmethods.put(methodname,method) ;}}

return beanmethods ;

}/**

* 獲取類的例項,這裡呼叫的是無參建構函式,如果當前類不含有無參建構函式,將丟擲異常nosuchmethodexception

* @param * @return

*/private t getinstance(classclazz) throws nosuchmethodexception, illegalacces***ception, invocationtargetexception, instantiationexception

/*** 生成所有配置類裡面的bean

*/private void producebeans() throws invocationtargetexception, nosuchmethodexception, instantiationexception, illegalacces***ception

}/**

* 生成所有通過myrepository註解新增的bean

*/private void producebeansbyrepository(string packagename) throws ioexception, classnotfoundexception, invocationtargetexception, nosuchmethodexception, instantiationexception, illegalacces***ception else

}beans.put(beanname,getinstance(aclass));}}

/*** 獲取指定包名下的所有class

* @param packagename

*/public list> getclassesbypackage(string packagename) throws ioexception, classnotfoundexception

}return list;

}/**

* 通過bean的名稱獲取容器中的bean

* @param * @return

*/public t getbean(string beanname)

}system.out.println("找不到"+beanname+"對應的bean");

return null ;

}} 6、測試類

public class test 

}

至此:註解和反射實現springioc容器已經實現了,但是還有需要改進和完善的地方,比如控制ioc容器中乙個類是單例的還是多例的,或者實現@autowired自動注入等註解。

註解和反射使用

作用 註解是附加在 中的一些資訊,用於編譯 執行時解析和使用,起到說明配置作用 主要學習兩方面1 元註解,2 自定義註解 一 元註解 包括 1.target,2.retention 3.documented,4.inherited 幾種 1 target 作用 用於描述註解的使用範圍 即 註解是描述...

反射和註解

反射 通過乙個類的 類物件 可以使用它自身的方法,來建立例項,呼叫成員 1.獲得 類物件 方法區中,載入所有的類,都是乙個class型別的物件 class.forname string 類名 類名為全稱 類名.class 物件.getclass 2.反射建立例項 class c class.forn...

反射和註解

類名.class 通過類名的屬性class獲取 物件.getclass getclass 方法在object類中定義著。結論 同乙個位元組碼檔案 class 在一次程式執行過程中,只會被載入一次,不論通過哪一種方式獲取的class物件都是同乙個。獲取功能 獲取成員變數們 獲取構造方法們 獲取成員方法...