IoC底层原理

1、IoC核心接口

2、组件扫描器

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

     

3、设定组件扫描加载过滤器

  • 名称:@ComponentScan

  • 类型:类注解

  • 位置:类定义上方

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

  • 范例:

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

    includeFilters:设置包含性过滤器

    excludeFilters:设置排除性过滤器

    type:设置过滤器类型(ANNOTATION,ASSIGNABLE_TYPE ,ASPECTJ ,REGEX CUSTOM-自定义)

 

4、自定义组件过滤(使用custom过滤方式)

  • 名称: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.itheima.dao.impl.BookDaoImpl")){
                return false;
            }
            return false;
        }
    }

 

5、自定义导入器

  • bean只有通过配置才可以进入spring容器,被spring加载并控制

  • 配置bean的方式如下:

    • XML文件中使用<bean/>标签配置

    • 使用@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 {
    }

 

6、自定义注册器

  • 名称: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");
        }
    }

 

7、bean初始化过程解析

 

8、bean初始化过程解析(下面全是接口)

  • BeanFactoryPostProcessor

    • 作用:定义了在bean工厂对象创建后,bean对象创建前执行的动作,用于对工厂进行创建后业务处理

    • 运行时机:当前操作用于对工厂进行处理,仅运行一次

  • BeanPostProcessor

    • 作用:定义了所有bean初始化前后进行的统一动作,用于对bean进行创建前业务处理与创建后业务处理

    • 运行时机:当前操作伴随着每个bean的创建过程,每次创建bean均运行该操作

  • InitializingBean

    • 作用:定义了每个bean的初始化前进行的动作,属于非统一性动作,用于对bean进行创建前业务处理

    • 运行时机:当前操作伴随着任意一个bean的创建过程,保障其个性化业务处理

  • 注意:上述操作均需要被spring容器加载放可运行

 

9、bean初始化过程解析  

 

10、繁琐的bean初始化过程处理

  • FactoryBean

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

FactoryBean与BeanFactory区别

  • FactoryBean:封装单个bean的创建过程

  • BeanFactory:Spring容器顶层接口,定义了bean相关的获取操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悠然予夏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值