您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關結合反射說明SpringIOC的實現原理是怎樣的,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
前面已經對IOC進行了說明,也知道了IOC的原理是反射機制。那么接下來看看如何通過反射機制說明IOC
看下代碼:
package com.sinoair.gtms.controller.web.IOC;
import javax.annotation.Resource;
import javax.xml.ws.Service;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyIOC {
/**
* 模擬Spring掃描的注解包
*/
private final static String packageName = "com.albert.AnnotationTest";
/**
* 存放注解的bean對象
*/
private static Map<String,Object> beanMap =new HashMap<String, Object>();
static{
try {
packageToScan();
} catch (InstantiationExceptione) {
e.printStackTrace();
} catch (IllegalAccessExceptione) {
e.printStackTrace();
}
}
/**
* 根據beanName從容器獲取bean對象
* @param beanName
* @return
*/
public static Object getBean(String beanName){
Object obj = null;
obj = beanMap.get(beanName);
return obj;
}
/**
* 遍歷包中的注解類
* @throws IllegalAccessException
* @throws InstantiationException
*/
private static void packageToScan() throws InstantiationException,IllegalAccessException{
List<Class> clsList =ClassByPackage.getClasssFromPackage(packageName);
//先加載dao
for(Class cls : clsList){
//判斷類是不是有@Respository注解
if(cls.isAnnotationPresent(Respository.class)){
String clsName =AlbertUtil.getBeanName(cls.getName());
//bean對象存入map
beanMap.put(clsName,cls.newInstance());
}
}
//加載service,同時對其中@Resource注解的屬性進行賦值
for(Class cls : clsList){
if(cls.isAnnotationPresent(Service.class)){
String clsName =cls.getName();
clsName =clsName.substring(clsName.lastIndexOf(".")+1, clsName.length());
beanMap.put(AlbertUtil.toLowerCaseFirstOne(clsName),cls.newInstance());
//掃描注解@Resource的屬性并賦值
Field[] field = cls.getDeclaredFields();
for(Field f : field){
//判斷屬性是不是有@Resource注解
if(f.isAnnotationPresent(Resource.class)){
f.setAccessible(true);
f.set(beanMap.get(AlbertUtil.getBeanName(cls.getName())), beanMap.get(f.getName()));
}
}
}
}
}
}
以上就是結合反射說明SpringIOC的實現原理是怎樣的,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。