笔记

Spring IOC

Inverse of Control:控制反转

DI:Dependancy Injections:依赖注入

没有IOC的时候,各种依赖需要逐个按顺序创建。

有了IOC的之后,只要告诉那个依赖那个就可以了,容器会自动装配好依赖

手写一个IOC容器

public class MyIoCContainer {
// 实现一个简单的IoC容器,使得:
// 1. 从beans.properties里加载bean定义
// 2. 自动扫描bean中的@Autowired注解并完成依赖注入
public static void main(String[] args) {
MyIoCContainer container = new MyIoCContainer();
container.start();
OrderService orderService = (OrderService) container.getBean("orderService");
orderService.createOrder();
}
    private static Map<String, Object> beans = new HashMap<>();

    // 启动该容器
public void start() {
Properties properties = new Properties();
try {
properties.load(MyIoCContainer.class.getResourceAsStream("/beans.properties"));
properties.forEach((beanName, beanClass) -> {
try {
Class<?> klass = Class.forName(String.valueOf(beanClass));
Object beanInstance = klass.getConstructor().newInstance();
beans.put(String.valueOf(beanName), beanInstance);
} catch (Exception e) {
throw new RuntimeException(e);
}
});
beans.forEach((beanName, beanInstance) -> dependencyInject(beanName, beanInstance, beans));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
    // 从容器中获取一个bean
public Object getBean(String beanName) {
return beans.get(beanName);
} private static void dependencyInject(String beanName, Object beanInstance, Map<String, Object> beans) {
List<Field> fieldsToBeAutowired = Stream.of(beanInstance.getClass().getDeclaredFields())
.filter(field -> field.getAnnotation(Autowired.class) != null)
.collect(Collectors.toList()); fieldsToBeAutowired.forEach(field -> {
try {
String fieldName = field.getName();
Object dependencyBeanInstance = beans.get(fieldName);
field.setAccessible(true); //打破封装性,访问私有成员方法或变量
field.set(beanInstance, dependencyBeanInstance);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
});
}
}

最新文章

  1. JS正则表达式元字符
  2. WPF强制更新
  3. HTML5游戏设计与开发 小白7-9月的动态
  4. NSUrl的打印
  5. JS宝典
  6. 实用图像处理入门 - 2 - Windows平台下编译openCV
  7. The Reflection And Amplification Attacks &amp;&amp; NTP Reply Flood Attack Based On NTP
  8. 基于WebForm+EasyUI的业务管理系统形成之旅 -- 首页Portal界面拖拽(Ⅵ)
  9. HDU 1247
  10. Jexus下配置多个站点
  11. 一行JavaScript代码获取页面中的所有超链接地址
  12. SPSS Modeler数据挖掘项目实战(数据挖掘、建模技术)
  13. 先学习Oracle 11g的Automatic Diagnostic Repository新功能
  14. Javascript正则表达式完全学习手册
  15. MFC教程
  16. MySQL优化 - 索引优化
  17. 16.C++-初探标准库
  18. SQL 基础学习(1):下载DB Browser for SQLite. 下载graphviz(为了使用Rails ERD的前提)出现❌,已debug.
  19. MS SQMServer2008R2 连接不到远程服务的解决办法
  20. Docker基础-搭建本地私有仓库

热门文章

  1. 计算机二级-C语言-程序设计题-190112记录-结构体的遍历和结构体的数据的交换处理,文件的操作。
  2. SpringBoot基于数据库的定时任务实现
  3. CodeForces-220B Little Elephant and Array
  4. ES5-Array的新增方法
  5. 在java的静态方法中访问类的实例成员
  6. 【转】jenkins_pipeline语法详解
  7. 大盘及策略收益率的公式推导与Python代码
  8. cookie按钮点击倒计时
  9. JavaScript中关于隐式转换的一些总结
  10. 「JSOI2010」旅行