IoC:组件注册方式
2019-10-26 本文已影响0人
李拾叁的摸鱼日常
@Bean + @Scope + @Lazy
- 定义在方法上,方法名称就是注入的对象名称,方法的返回值就是注入对象的类型
- 默认是单例bean,IoC容器初始化时,对象就被创建通过@Scope可以修改
- @Lazy可以让单例bean在IoC容器初始化不创建,只有获取时才创建
ComponentScan
- 所描特定包下的所有包含
@Controller、@Service、@Repository、@Componet注解的类 - 自定义includeFilters规则时要禁用默认规则
useDefaultFilters = false - @ComponentScan.Filter默认规则是根据注解过滤的
FilterType.ANNOTATION,可以自定义规则,需要实现org.springframework.core.type.filter.TypeFilter接口
public interface TypeFilter {
boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
throws IOException;
}
@Condition
- 定义在类上、方法上,根据条件决定组件是否能够由IoC容器管理
- 需要实现
org.springframework.context.annotation.Condition接口,实现matches(),只有当matches()返回true时,Condition才生效,matches()的context参数可以获取IoC容器相关的对象,比如BeanDefinitionRegistry、Environment
public interface Condition {
boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}
@Import
- 直接倒入一个类
- 实现
org.springframework.context.annotation.ImportSelector接口,selectImports()返回值必须是类的全路径名称
public interface ImportSelector {
String[] selectImports(AnnotationMetadata importingClassMetadata);
}
- 实现
org.springframework.context.annotation.ImportBeanDefinitionRegistrar接口,通过BeanDefinitionRegistry手动注册一个bean
public interface ImportBeanDefinitionRegistrar {
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
}
FactoryBean
- 实现
org.springframework.beans.factory.FactoryBean接口 - 将FactoryBean实现类交给IoC容器,要获取FactoryBean本身使用
&
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}