SpringBoot中的IoC

SpringBoot中的IoC

(原创内容,转载请注明来源,谢谢)

一、Spring IoC

IoC又称为依赖反转,有两种方式,一种是DI(依赖注入),另一种是DL(依赖查找)。DI是当前实体被动依赖其他组件的IoC注入,DL是当前实体主动注册某个服务。

典型的Spring IoC方式如下:

ApplicationContextcontext = new FileSystemXmlApplicationContext(....);
MockServiceservice = context.getBean(MockService.class);
service.doSomething();

其中第二行的context.getBean就属于DL的过程,即主动去加载某个服务。但是构建IoC容器的背后,更多的是DI。

1、Spring IoC DI流程

1)收集和注册

第一阶段是构建和收集Bean,通常通过XML或者java代码的方式进行构建和定义。

2)分析和组装

收集和注册后,每个Bean都是一个独立的个体,则需要在这个阶段将每个bean联系起来,如果bean之间有依赖关系的,还需要进行依赖。

早期Spring可以通过xml进行此工作,但是Springboot中,更趋向于使用Annotation的方式,即@注解的方式。

2、Java Config

基于Java Config的方式,即对Annotation的完美实现。

1)表达形式层面

对于以前复杂的bean的xml的配置,现在可以用注解的方式来实现。对于定义一个类作为javaconfig,只需要在类的上方加上@Configuration,即将其定义成一个bean。

例如:

@Configuration
public class TestConfiguration{
//bean定义
}

2)注册bean定义层面

对于备注了Configuration内部的方法,加上@Bean,则将其标注成bean,其返回值将作为一个bean注册到Spring IoC容器,方法名默认称为该bean定义的id。

例如对于上述class,其中的某个类:

@Bean
publicTestService testService(){
return new TestServiceImpl();
}

3)表达依赖注入层面

对于某个bean,如果依赖于其他的bean,则只需要在该方法返回值的new构造方法中,传入所依赖的bean对应的方法即可。

例如对于上述方法,如果有一个方法依赖上述方法,则:

@Bean
publicDependencyService dependencyService(){
return new DependencyServiceImpl(testService());
}

4)优化

对于多个bean互相依赖,对于同一个类,并不会产生多个实例。

Spring boot通过拦截配置类避免多次初始化某个类。对于bean的依赖,会先查看拦截配置类是否已经实例化过该类,只有在没有实例化过该类的情况下,才会请求父类的同一方法来实现实例化。

——written by linhxx 2017.09.22

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-09-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LanceToBigData

JavaWeb(一)Servlet中的ServletConfig与ServletContext

前言   前面我介绍了一下什么是servlet,它的生命周期,执行过程和它的原理。这里我们做一个简单的回顾!   什么是Servlet?   servlet 是...

1676
来自专栏Ken的杂谈

ASP.NET Core 入门教程 4、ASP.NET Core MVC控制器入门

本篇代码以下代码进行调整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter...

1214
来自专栏积累沉淀

Java设计模式(五)----原型模式

原型模式(Prototype) 一、概述 二、结构 三、浅度克隆和深度克隆  浅度克隆  深度克隆 一、概述  定义:原型模式属...

1839
来自专栏me的随笔

ASP.NET MVC5 ModelBinder

ASP.NET MVC中,所有的请求最终都会到达某个Controller中的某个Action并由该Action负责具体的处理和响应。为了能够正确处理请求,Act...

582
来自专栏blackheart的专栏

[C#1] 4-通用对象操作

1.对象的等值性和唯一性 Object的Equals[虚]方法判断两个对象是否相等; Object.ReferenceEquals判断两个对象是否指向同一引用[...

1956
来自专栏carven

cors跨域探讨

前端跨域方案很多,jsonp、iframe等等,但是个人觉得,最正宗,最无损的跨域方式还是CORS。 CORS(Cross-origin resource sh...

1230
来自专栏个人随笔

论 Java 的访问权限

Java中成员访问权限 Java中的访问权限控制符有四个: 作用域_____当前类____同一package___子孙类____其他package publi...

3498
来自专栏Ken的杂谈

ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门

本篇代码基于上一篇进行调整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapte...

823
来自专栏阿杜的世界

【译】11条Java异常处理的最佳实践

在之前关于Java异常的文章中,已经探讨过suppressed exceptions和Java Exceptions Tutorial 两个方面的内容。要想在...

734
来自专栏大内老A

.NET Core采用的全新配置系统[3]: “Options模式”下的配置是如何绑定为Options对象

配置的原子结构就是单纯的键值对,并且键和值都是字符串,但是在真正的项目开发中我们一般不会单纯地以键值对的形式来使用配置。值得推荐的做法就是采用《.NET Cor...

17610

扫码关注云+社区