背景

ioc是spring的基础,即控制反转。springboot基于注解使用ioc.

ioc

spring称所有被管理的对象为bean,
spring ioc主要通过描述的方式完成3类bean的管理工作:

基本功能 说明
发布对象 包扫描业务bean,javaConfig或者xml的方式配置第三方bean
获取对象 BeanFactory或者ApplicationContext的子类获取bean
依赖注入对象 通过关键字@Autowired,属性注入,构造函数注入,方法注入

spring ioc的核心接口是BeanFactory和ApplicationContext ;

BeanFactory ApplicationContext
获取bean的方法 等同
判断是否是单例或者原型 等同
类型匹配 等同
获取bean的类型和别名 等同
-- MessageResource消息国际化功能
-- EnvironmentCapable环境可配置
-- ApplicationEventPublisher应用事件发布
-- ResourcePatternResolver资源模式解析

来个例子,发布和获取bean;

TODO

通过@ComponentSacn发布Bean

@ComponentScan源码阅读

主要方法 说明
basePackages 扫描的包路径
basePackageClasses 扫描的javaConfig类
includeFilters 包含的bean的过滤器
excludeFilters 排除的bean的过滤器
lazyInit 是否延迟初始化

javaConfig方式或者xml方式定义第三方Bean发布

javaConfig方式主要是增加@Configuration 和 @Bean注解来发布;

xml方式需要通过注解@ImportResource来引入

条件装配bean @Conditional(Condition实现类)

依赖注入

通过@Autowired来描述

通过@Primary和@Quelifier来消除歧义。

具体的依赖注入方式有 属性,构造函数,方法;

bean的生命周期

bean定义 -> bean初始化 ->bean生存期->bean销毁

bean定义:通过@ComponentScan扫描得到资源信息,从资源中解析出定义信息,然后把定义发布到spring容器中;

bean的初始化:创建bean,完成依赖注入,setBeanName,setBeanFactory,@PostConstruct标注的方法,postProcessorBeforeInitialzerion方法,setApplicationContext方法,afterPropertiesSet方法,postProcessorAfterInitialization方法;

bean生存期: 运行阶段直接使用

bean销毁: @PreDesctroy标注的方法,destory方法;

生命周期相关的扩展接口 说明
BeanNameAware 设置bean的名称
BeanFactoryAware 获取BeanFactory
ApplicationContextAware 获取ApplicationContext
InitializingBean 初始化bean
DisposableBean 销毁bean
BeanPostProcessor 所有ben的公共增强

属性文件

引入依赖:

spring-boot-configuration-processor;
然后使用@Value(“${xxx}”)来引用即可;

或者通过@ConfigurationProperties(“xxx”)直接组装到自定义类中;

还可以使用SpringEL来处理属性配置:

@Value("#{T(System).currentTimeMillis()}")

Bean作用域

作用域 说明
singleton 单例,全局唯一
prototype 原型,每次创建
session 每个http会话创建一个
application 同单例
request 每次请求创建一个

Profile

指明不同环境下启用的bean,springboot不同的profile对应不同的application-profile.yaml文件;

原创不易,转载请注明出处。

0101-ioc的更多相关文章

  1. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  2. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  3. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  4. 自己实现简单Spring Ioc

    IoC则是一种 软件设计模式,简单来说Spring通过工厂+反射来实现IoC. 原理简单说明: 其实就是通过解析xml文件,通过反射创建出我们所需要的bean,再将这些bean挨个放到集合中,然后对外 ...

  5. 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦

    1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...

  6. DIP原则、IoC以及DI

    一.DIP原则 高层模块不应该依赖于底层模块,二者都应该依赖于抽象. 抽象不应该依赖于细节,细节应该依赖于抽象. 该原则理解起来稍微有点抽象,我们可以将该原则通俗的理解为:"依赖于抽象&qu ...

  7. 【初探Spring】------Spring IOC(三):初始化过程---Resource定位

    我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean.同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然 ...

  8. 【初探Spring】------Spring IOC(二):初始化过程---简介

    首先我们先来看看如下一段代码 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultList ...

  9. 【初探Spring】------Spring IOC(一)

    IOC:Inversion of Control(控制反转).IOC它所体现的并不是一种技术,而是一种思想,一种将设计好的对象交给容器来管理的思想.IOC的核心思想就体现在控制.反转这两个词上面,要理 ...

  10. .NET里简易实现IoC

    .NET里简易实现IoC 前言 在前面的篇幅中对依赖倒置原则和IoC框架的使用只是做了个简单的介绍,并没有很详细的去演示,可能有的朋友还是区分不了依赖倒置.依赖注入.控制反转这几个名词,或许知道的也只 ...

随机推荐

  1. PAT A1114 Family Property

    用并查集处理每个家庭的信息,注意标记~ #include<bits/stdc++.h> using namespace std; ; bool visit[maxn]={false}; i ...

  2. centOS+DJango+mysql_nginx部署流程记录

    安装Python3.6.2: https://www.jianshu.com/p/7a76bcc401a1 安装MySQL: https://www.cnblogs.com/luohanguo/p/9 ...

  3. 计算机网络历史与基本概念&分层与参考模型(TCP/IP与OSI)&通信过程

    Definition: 计算机网络:使用单一技术相互连接的自主计算机的互联集合. 单台计算机独立自主(不受制于其他计算机),连接介质可以使光纤.铜线也可以是微波.红外.卫星. 互联网络(Interne ...

  4. 吴裕雄--天生自然ORACLE数据库学习笔记:Oracle系统调优

    --修改 alter system set large_pool_size=64m; --显示 show parameter large_pool_size; select sum(getmisses ...

  5. 快速幂 & 矩阵快速幂

    目录 快速幂 实数快速幂 矩阵快速幂 快速幂 实数快速幂 普通求幂的方法为 O(n) .在一些要求比较严格的题目上很有可能会超时.所以下面来介绍一下快速幂. 快速幂的思想其实是将数分解,即a^b可以分 ...

  6. linux命令系列-mv(移动-重命名)

    #常用命令选项 默认覆盖 -n 不覆盖 -i 交互 -f 不交互直接覆盖 -u 只移动新的文件 -v 显示详细信息 #移动覆盖3个文件到/tmp目录 mv a.txt b.txt c.txt /tmp ...

  7. php接口安全设计浅谈

    接口的安全性主要围绕Token.Timestamp和Sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看: (1)Token授权机制:(Token是客户端访问服务端的凭证)--用 ...

  8. core版本使用ef连接数据库(一)

    参考 参考代码 sqlserver数据库:①Nuget: Microsoft.EntityFrameworkCore.SqlServer ORACLE数据库:①Nuget: Oracle.Entity ...

  9. Java-Study

    java中static用法: static :静态的,用于修饰成员(成员变量,成员方法): 1. 被static所修饰的变量或者方法会储存在数据共享区: 2. 被static所修饰的成员变量只有一份: ...

  10. 解题报告:SP1043 GSS1

    题目链接:SP1043 GSS1 - Can you answer these queries I 对,\(GSS\)毒瘤数据结构题,就是我在这篇文章中提到的紫题. 相对其他\(GSS\)题简单些,但 ...