IoC底层核心原理
# IoC底层核心原理
# 1)IoC核心接口

# 2)组件扫描器
- 开发过程中,需要根据需求加载必要的bean,排除指定bean

# 3)设定组件扫描加载过滤器
- 名称:@ComponentScan 
- 类型:类注解 
- 位置:类定义上方 
- 作用:设置spring配置加载类扫描规则 
- 范例: - @ComponentScan( value="com.itheima", //设置基础扫描路径 excludeFilters = //设置过滤规则,当前为排除过滤 @ComponentScan.Filter( //设置过滤器 type= FilterType.ANNOTATION, //设置过滤方式为按照注解进行过滤 classes=Repository.class) //设置具体的过滤项,过滤所有@Repository修饰的bean )1
 2
 3
 4
 5
 6
 7
-  includeFilters:设置包含性过滤器 
-  excludeFilters:设置排除性过滤器 
-  type:设置过滤器类型 
# 4)自定义组件过滤器
- 名称: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; } }1
 2
 3
 4
 5
 6
 7
 8
 9
 10
# 5)自定义导入器
- bean只有通过配置才可以进入spring容器,被spring加载并控制 
- 配置bean的方式如下: - XML文件中使用 - 标签配置 
- 使用@Component及衍生注解配置 
 
- 企业开发过程中,通常需要配置大量的bean,需要一种快速高效配置大量bean的方式 
ImportSelector
- 名称: ImportSelector 
- 类型:接口 
- 作用:自定义bean导入器 
- 范例: - public class MyImportSelector implements ImportSelector { public String[] selectImports(AnnotationMetadata icm) { return new String[]{"com.itheima.dao.impl.AccountDaoImpl"}; } }1
 2
 3
 4
 5- @Configuration @ComponentScan("com.itheima") @Import(MyImportSelector.class) public class SpringConfig { }1
 2
 3
 4
 5
# 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"); } }1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
# 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相关的获取操作 
