前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring之IOC底层原理

Spring之IOC底层原理

作者头像
楠羽
发布2022-11-18 13:54:41
2420
发布2022-11-18 13:54:41
举报
文章被收录于专栏:后端开发笔记后端开发笔记

10、IoC底层核心原理

10.1.IoC核心接口

在这里插入图片描述
在这里插入图片描述

10.2.组件扫描器

  • 开发过程中,需要根据需求加载必要的bean,排除指定bean
在这里插入图片描述
在这里插入图片描述

10.3.设定组件扫描加载过滤器

名称:@ComponentScan

类型:类注解

位置:类定义上方

作用:设置spring配置加载类扫描规则

范例:

代码语言:javascript
复制
@ComponentScan(
    value="com.itheima",	           //设置基础扫描路径
    excludeFilters =                          //设置过滤规则,当前为排除过滤
	@ComponentScan.Filter(            //设置过滤器
	    type= FilterType.ANNOTATION,  //设置过滤方式为按照注解进行过滤
	    classes=Repository.class)     //设置具体的过滤项,过滤所有@Repository修饰的bean
    )

​ includeFilters:设置包含性过滤器

​ excludeFilters:设置排除性过滤器

​ type:设置过滤器类型

10.4.自定义组件过滤器

名称:TypeFilter

类型:接口

作用:自定义类型过滤器

范例:

代码语言:javascript
复制
public class MyTypeFilter implements TypeFilter {
    public boolean match(MetadataReader mr, MetadataReaderFactory mrf) throws IOException {
        ClassMetadata cm = metadataReader.getClassMetadata();
        tring className = cm.getClassName();
        if(className.equals("com.NanMu.dao.impl.BookDaoImpl")){
            return false;
        }
        return false;
    }
}

组件扫描加载过滤器

  • 过滤策略
    • ANNOTATION 注记
    • ASSIGNABLE_TYPE 可分配类型
    • ASPECTJ
    • REGEX
    • CUSTOM
  • 应用场景
    • 数据层接口测试环境
    • 业务层接口测试环境
    • 各种运行环境设置

10.5.自定义导入器

  • bean只有通过配置才可以进入spring容器,被spring加载并控制
  • 配置bean的方式如下:
    • XML文件中使用标签配置
    • 使用@Component及衍生注解配置
  • 企业开发过程中,通常需要配置大量的bean,需要一种快速高效配置大量bean的方式

ImportSelector

名称: ImportSelector

类型:接口

作用:自定义bean导入器

范例:

代码语言:javascript
复制
public class MyImportSelector implements ImportSelector {
    public String[] selectImports(AnnotationMetadata icm) {
        return new String[]{"com.itheima.dao.impl.AccountDaoImpl"};
    }
}
代码语言:javascript
复制
@Configuration
@ComponentScan("com.itheima")
@Import(MyImportSelector.class)
public class SpringConfig {
}

不写衍生注解就可以配置一个导入器类用于对象中

10.6.自定义注册器

名称:ImportBeanDefinitionRegistrar

类型:接口

作用:自定义bean定义注册器

范例:

代码语言:javascript
复制
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    public void registerBeanDefinitions(AnnotationMetadata icm, BeanDefinitionRegistry r) {
        ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(r, false);
        TypeFilter tf = new TypeFilter() {
            public boolean match(MetadataReader mr, MetadataReaderFactory mrf) throws IOException {
                return true;
            }
        };
        scanner.addIncludeFilter(tf);//包含
        //scanner.addExcludeFilter(tf);
        scanner.scan("com.itheima");
    }
}
代码语言:javascript
复制
@Configuration
@ComponentScan("com.itheima")
//4.自定义注册器
//@Import(MyImportBeanDefinitionRegistrar.class)

public class SpringConfig {
}

10.7.bean初始化过程解析

在这里插入图片描述
在这里插入图片描述

10.7.1.bean初始化过程解析

  • BeanFactoryPostProcessor
    • 作用:定义了在bean工厂对象创建后,bean对象创建前执行的动作,用于对工厂进行创建后业务处理
    • 运行时机:当前操作用于对工厂进行处理,仅运行一次
  • BeanPostProcessor
    • 作用:定义了所有bean初始化前后进行的统一动作,用于对bean进行创建前业务处理与创建后业务处理
    • 运行时机:当前操作伴随着每个bean的创建过程,每次创建bean均运行该操作
  • InitializingBean
    • 作用:定义了每个bean的初始化前进行的动作,属于非统一性动作,用于对bean进行创建前业务处理
    • 运行时机:当前操作伴随着任意一个bean的创建过程,保障其个性化业务处理
  • 注意:上述操作均需要被spring容器加载放可运行

10.7.2.bean初始化过程解析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nBE7sUTy-1665675069211)(C:\Users\紫轩蝶泪\AppData\Roaming\Typora\typora-user-images\image-20220827102518026.png)]

10.7.3.繁琐的bean初始化过程处理

  • FactoryBean
    • 对单一的bean的初始化过程进行封装,达到简化配置的目的

FactoryBean与BeanFactory区别

  • FactoryBean:封装单个bean的创建过程
  • BeanFactory:Spring容器顶层接口,定义了bean相关的获取操作
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 10、IoC底层核心原理
    • 10.1.IoC核心接口
      • 10.2.组件扫描器
        • 10.3.设定组件扫描加载过滤器
          • 10.4.自定义组件过滤器
            • 10.5.自定义导入器
              • 10.6.自定义注册器
                • 10.7.bean初始化过程解析
                  • 10.7.1.bean初始化过程解析
                  • 10.7.2.bean初始化过程解析
                  • 10.7.3.繁琐的bean初始化过程处理
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档