实现一个自己的IOC
package com.IocExample;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; /***
* @description: IoC容器例子
* @author:
* @create: 2019-08-09 15:40
*
* 1、实例化bean
* 2、保存bean
* 3、提供bean
* 4、每一个ben要产生一个唯一的id与之相呼应
**/

public class IoCContainer { private Map<String, Object> beans = new ConcurrentHashMap<String, Object>(); /**
* 根据beanId获取一个bean
* @param beanId
* @return 返回Bean
*/
public Object getBean(String beanId){
return beans.get(beanId);
} /**
* 委托IoC容器创建一个Bean
* @param clazz 要创建的bean的class
* @param beanId beanId
* @param paramBeanId 要创建的bean的class的构造方法所需要的参数的beanId们(依赖的beanId)
*/

public void setBean(Class<?> clazz, String beanId,String... paramBeanId){ //1\组装构造方法所需要的参数值--获取依赖bean
Object[] paramValues = new Object[paramBeanId.length] ;
for (int i = 0; i < paramBeanId.length; i++){
paramValues[i] = beans.get(paramBeanId[i]);
System.out.println("paramValues["+ i + "] =" + paramValues[i]);
}
//2、调用构造方法实例化bean
Object bean = null;
//获取所有构造函数
for (Constructor<?> constructor : clazz.getConstructors()) {
try{
bean = constructor.newInstance(paramValues);
} catch (IllegalAccessException e) {
} catch (InstantiationException e) {
} catch (InvocationTargetException e) {
}
if (bean == null){
throw new RuntimeException("找不到合适的构造方法");
}
}
//3、将实例化的bean放入beans
beans.put(beanId, bean);
}
}

  


最新文章

  1. centos下彻底删除 和重装MYSQL
  2. 迅雷9、迅雷极速版之迅雷P2P加速:流量吸血鬼?为什么你装了迅雷之后电脑会感觉很卡很卡?
  3. Spring浅探
  4. Android内存性能优化(内部资料总结)
  5. JAVA反射机制(转)
  6. [JAVA] java程序性能优化
  7. QGraphics
  8. Swift学习笔记十四
  9. nodejs + socket.io + redis 新手上路
  10. android 案例:从另一个activity选择信息并获取返回值
  11. phpcms 源码分析二:
  12. FLASH ROM与EEPROM的区别
  13. IQueryable 和 IEnumerable
  14. 如何用C#寻找100到999的所有水仙花数?
  15. java-数据库连接,分层实现增删改查测试
  16. js之制作网页计时器
  17. Sql Server语句大全
  18. JS调用本地设备
  19. python的异步IO模块
  20. 使用CefSharp跳转页面不弹出页面:

热门文章

  1. Android笔记(六十九) 仿微信界面(一)
  2. django rest framework的viewset中关于ModelViewset的定义
  3. obj + mtl 格式说明
  4. Linux cat命令使用方法
  5. k8s安装之flannel.yaml
  6. Range与面向对象的Kotlin
  7. spring+mybatis通用dao层、service层的实现
  8. thrift 安装
  9. 学习Spring-Data-Jpa(三)---关联关系常用注解
  10. [c++11]右值引用、移动语义和完美转发