笔记

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);
}
});
}
}

今日份学习: Spring - 事实标准的更多相关文章

  1. 今日份学习:初步的springboot

    今日记录 今日份BUG清单 flyway的sql文件有两个下划线 __ , _ 是不可以的. 高版本的freemarker默认的扩展名变成了flth,而不是ftl 今日份用到的网址 1. freema ...

  2. 今日份学习:写一些代码 (Spring+AOP+Redis+MySQL练习)

    笔记 Spring+AOP+Redis+MySQL练习 1. 启动docker->mysql docker run --name mysql -v e:\docker:/var/lib/mysq ...

  3. 今日份学习: Spring中使用AOP并实现redis缓存?

    笔记 在Spring中如何使用AOP? Spring是如何切换JDK动态代理和CGLIB的? spring.aop.proxy-target-class=true (在下方第二个链接中,原生doc中提 ...

  4. 今日份学习: springboot 用到的注解

    笔记 上回用到的所有注解 @Around @Aspect @Autowired @Bean @Configuration @RequestMapping @ResponseBody @RestCont ...

  5. 今日份学习: Docker 和 Docker的使用

    笔记 Docker 能做什么? 保证开发.测试.交付.部署的环境完全一致 保证资源的隔离 启动临时的.用完即弃的环境,例如测试 迅速(秒级)超大规模部署和扩容 Docker 基本概念 镜像 image ...

  6. 学习Spring——依赖注入

    前言: 又开始动笔开了“学习Spring”系列的头…… 其实一开始写“学习SpringMVC”的几篇文章是出于想系统的了解下Spring以及SpringMVC,因为平时在公司中虽然每天都在使用Spri ...

  7. 菜鸟学习Spring——60s配置XML方法实现简单AOP

    一.概述. 上一篇博客讲述了用注解的形式实现AOP现在讲述另外一种AOP实现的方式利用XML来实现AOP. 二.代码演示. 准备工作参照上一篇博客<菜鸟学习Spring--60s使用annota ...

  8. 深入浅出学习Spring框架(四):IoC和AOP的应用——事务配置

    在前文 深入浅出学习Spring框架(一):通过Demo阐述IoC和DI的优势所在. 深入浅出学习Spring框架(三):AOP 详解 分别介绍了Spring的核心功能——IoC和AOP,光讲知识远远 ...

  9. 跟着刚哥学习Spring框架--创建HelloWorld项目(一)

    1.Spring框架简介 Spring是一个开源框架,Spring是在2003年兴起的一个轻量级的开源框架,由Rod johnson创建.主要对JavaBean的生命周期进行管理的轻量级框架,Spri ...

随机推荐

  1. JS-find、filter、forEach、map

    js这四个方法不会对空数组进行检测,也不会改变原始数组 find()方法主要用来返回数组中符合条件的第一个元素(没有的话,返回undefined) //语法 array.find(function(v ...

  2. JavaSE复习~开发环境的搭建 与 HelloWorld

    JDK的下载 访问Oracle官网,下载jdk,目前来说用的最多的是 8 版本 https://www.oracle.com/technetwork/java/javase/downloads/ind ...

  3. 【代码总结】PHP之会话跟踪技术

    有些时候感觉自己学习的效率好低,一套教程一本书,反复听,反复看,反复敲代码.自学这条路真的是很艰难,在任何事情都没有成功之前都很枯燥乏味.自学的过程中总会遇到很多问题,有时候连错误的原因都找不出来,那 ...

  4. 吴裕雄 python 神经网络——TensorFlow训练神经网络:不使用指数衰减的学习率

    import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data INPUT_NODE = 784 ...

  5. java面试(一)

    一.java基础 1.JDK和JRE的区别? JDK是java的开发环境,JRE是java的运行环境,即编写java程序就一定需要JDK,只是运行java程序只要JRE就足够了. 2.java中==和 ...

  6. dpkg 命令

    dpkg 是Debian Package的简写,是为Debian 专门开发的套件管理系统,方便软件的安装.更新及移除.所有源自Debian的Linux发行版都使用dpkg,例如Ubuntu.Knopp ...

  7. Centos7虚拟环境virtualenv与virtualenvwrapper的安装及基本使用

    一.使用虚拟环境的原因 在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题:亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难.此时,我们需 ...

  8. 操作系统OS - 线程中的join()为什么叫join

    1. 问题:很好奇为什么叫Join? 参考: https://blog.csdn.net/frankarmstrong/article/details/55504161 https://stackov ...

  9. Ubuntu开启端口(持久化)

    1.查看已经开启的端口 sudo ufw status 2.打开80端口 sudo ufw allow 3.防火墙开启 sudo ufw enable 4.防火墙重启 sudo ufw reload

  10. word2vec词向量处理中文语料

    word2vec介绍 word2vec官网:https://code.google.com/p/word2vec/ word2vec是google的一个开源工具,能够根据输入的词的集合计算出词与词之间 ...