Spring之IOC底层原理详解

 更新时间:2023年01月09日 14:24:48   作者:楠慧  
这篇文章主要介绍了Spring之IOC底层原理,内容详细,文章简单易懂,具有一定的参考价值,需要的朋友可以参考下

IoC底层核心原理

IoC核心接口

组件扫描器

  • 开发过程中,需要根据需求加载必要的bean,排除指定bean

设定组件扫描加载过滤器

  • 名称:@ComponentScan
  • 类型:类注解
  • 位置:类定义上方
  • 作用:设置spring配置加载类扫描规则
  • 范例:
@ComponentScan(
    value="com.itheima",	           //设置基础扫描路径
    excludeFilters =                          //设置过滤规则,当前为排除过滤
	@ComponentScan.Filter(            //设置过滤器
	    type= FilterType.ANNOTATION,  //设置过滤方式为按照注解进行过滤
	    classes=Repository.class)     //设置具体的过滤项,过滤所有@Repository修饰的bean
    )

​ includeFilters:设置包含性过滤器

​ excludeFilters:设置排除性过滤器

​ type:设置过滤器类型

自定义组件过滤器

  • 名称:TypeFilter
  • 类型:接口
  • 作用:自定义类型过滤器
  • 范例:
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;
    }
}

组件扫描加载过滤器

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

自定义导入器

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

ImportSelector

  • 名称: ImportSelector
  • 类型:接口
  • 作用:自定义bean导入器
  • 范例:
public class MyImportSelector implements ImportSelector {
    public String[] selectImports(AnnotationMetadata icm) {
        return new String[]{"com.itheima.dao.impl.AccountDaoImpl"};
    }
}
@Configuration
@ComponentScan("com.itheima")
@Import(MyImportSelector.class)
public class SpringConfig {
}

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

自定义注册器

  • 名称:ImportBeanDefinitionRegistrar
  • 类型:接口
  • 作用:自定义bean定义注册器
  • 范例:
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");
    }
}
@Configuration
@ComponentScan("com.itheima")
//4.自定义注册器
//@Import(MyImportBeanDefinitionRegistrar.class)

public class SpringConfig {
}

bean初始化过程解析

bean初始化过程解析

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

bean初始化过程解析

繁琐的bean初始化过程处理

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

FactoryBean与BeanFactory区别

  • FactoryBean:封装单个bean的创建过程
  • BeanFactory:Spring容器顶层接口,定义了bean相关的获取操作

以上就是Spring之IOC底层原理的详细内容,更多关于Spring之IOC底层的资料请关注脚本之家其它相关文章,请大家多多支持我们脚本之家!

相关文章

  • Gradle的SpringBoot项目构建图解

    Gradle的SpringBoot项目构建图解

    这篇文章主要介绍了Gradle的SpringBoot项目构建图解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 如何利用java中String类的substring()字符串截取最后一个字符

    如何利用java中String类的substring()字符串截取最后一个字符

    Java中的String是不可变的类型,因此substring()方法并不会改变原字符串,而是返回了一个新的字符串,这篇文章主要介绍了如何利用java中String类的substring()字符串截取最后一个字符,需要的朋友可以参考下
    2023-11-11
  • Java使用反射操作数组示例

    Java使用反射操作数组示例

    这篇文章主要介绍了Java使用反射操作数组,结合实例形式分析了基于java反射机制操作数组的创建、赋值、输出等相关实现技巧,需要的朋友可以参考下
    2019-07-07
  • 详解Elasticsearch如何把一个索引变为只读

    详解Elasticsearch如何把一个索引变为只读

    这篇文章主要为大家介绍了详解Elasticsearch如何把一个索引变为只读示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java Apollo是如何实现配置更新的

    Java Apollo是如何实现配置更新的

    这篇文章主要介绍了Java Apollo是如何实现配置更新的,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • JAVA对象中使用 static 和 String 基础探究

    JAVA对象中使用 static 和 String 基础探究

    这篇文章主要介绍了JAVA对象中使用static和String基础探究,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • SpringBoot返回统一的JSON标准格式实现步骤

    SpringBoot返回统一的JSON标准格式实现步骤

    这篇文章主要介绍了SpringBoot返回统一的JSON标准格式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • SpringBoot项目设置断点debug调试无效忽略web.xml问题的解决

    SpringBoot项目设置断点debug调试无效忽略web.xml问题的解决

    这篇文章主要介绍了SpringBoot项目设置断点debug调试无效忽略web.xml问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Java如何利用递归计算出阶乘

    Java如何利用递归计算出阶乘

    这篇文章主要介绍了Java如何通过递归计算出阶乘,文中介绍了递归的使用方法和基本特点,以及相关示例代码,对大家的学习有一定的帮助,需要的朋友可以参考下
    2023-05-05
  • Java如何向Word模板中插入Base64图片和数据信息

    Java如何向Word模板中插入Base64图片和数据信息

    这篇文章主要介绍了Java如何向Word模板中插入Base64图片和数据信息问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论