本篇文章给大家分享的是有关结合反射说明SpringIOC的实现原理是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
我们提供的服务有:成都网站建设、成都做网站、微信公众号开发、网站优化、网站认证、大埔ssl等。为上千多家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的大埔网站制作公司
前面已经对IOC进行了说明,也知道了IOC的原理是反射机制。那么接下来看看如何通过反射机制说明IOC
看下代码:
packagecom.sinoair.gtms.controller.web.IOC;
importjavax.annotation.Resource;
importjavax.xml.ws.Service;
importjava.lang.reflect.Field;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
public classMyIOC {
/**
* 模拟Spring扫描的注解包
*/
private final staticString packageName = "com.albert.AnnotationTest";
/**
* 存放注解的bean对象
*/
private staticMap
static{
try{
packageToScan();
} catch(InstantiationExceptione) {
e.printStackTrace();
} catch(IllegalAccessExceptione) {
e.printStackTrace();
}
}
/**
* 根据beanName从容器获取bean对象
* @parambeanName
* @return
*/
public staticObject getBean(String beanName){
Object obj = null;
obj = beanMap.get(beanName);
returnobj;
}
/**
* 遍历包中的注解类
* @throwsIllegalAccessException
* @throwsInstantiationException
*/
private static voidpackageToScan() throwsInstantiationException,IllegalAccessException{
List
//先加载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的实现原理是怎样的,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。