首先明確一下自己的需求:我們需要自定義一些註解,比如類似於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物件都是同乙個。獲取功能 獲取成員變數們 獲取構造方法們 獲取成員方法...