您好,登录后才能下订单哦!
本篇文章给大家分享的是有关结合反射说明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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。