注册bean到IOC容器

[toc]

1.使用BeanFactoryPostProcessor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@Component
public class ConstomBeadFactoryPostProcessor implements BeanFactoryPostProcessor {

private Logger log = LoggerFactory.getLogger(ConstomBeadFactoryPostProcessor.class);

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {

GenericBeanDefinition genericBeanDefinition = (GenericBeanDefinition) beanFactory.getBeanDefinition("demonBean");

/**
* 属性注入方式,
* * @see #AUTOWIRE_NO 0,默认 @Autowired
* * @see #AUTOWIRE_BY_NAME setter方法
* * @see #AUTOWIRE_BY_TYPE
* * @see #AUTOWIRE_CONSTRUCTOR 构造方法注入
* * @see #AUTOWIRE_AUTODETECT
*/
int autowireMode = genericBeanDefinition.getAutowireMode();
log.debug("{}, autowireMode={}", genericBeanDefinition.getBeanClassName(), autowireMode);


/**
* 修改 bean的 构造方式
*/
GenericBeanDefinition personBeanDefinition = (GenericBeanDefinition) beanFactory.getBeanDefinition("person");
ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues();
constructorArgumentValues.addIndexedArgumentValue(0,"zero");
personBeanDefinition.setConstructorArgumentValues(constructorArgumentValues);

// log.debug("beanFactory={}", beanFactory);

}
}

2. 通过@Import

1
2
3
4
5
@Import(ImportClassA.class) //导入普通类,ok
@Configuration
public class ConstomEnableAutoConfig {

}

3. 通过@Import + ImportBeanDefinitionRegistrar

1
2
3
4
5
6
@Import(ConstomImportBeanDefinitionRegister.class) //导入注册器, ok    mybatis方式
@Configuration
public class ConstomEnableAutoConfig {

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ConstomImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
System.out.println("------------- ConstomImportBeanDefinitionRegister");

/**
* 注册一个 bean 到 IOC容器
*/
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(InstA.class);
beanDefinitionRegistry.registerBeanDefinition("instA", rootBeanDefinition);


/**
* 注册一个 bean 到 IOC容器
*/
RootBeanDefinition beanDefinition = new RootBeanDefinition(IConstomMapper.class);
beanDefinition.setBeanClass(ConstomMapperFactoryBean.class);
beanDefinitionRegistry.registerBeanDefinition("iConstomMapper", rootBeanDefinition);

}
}

4.通过@Import + ImportSelector

1
2
3
4
5
@Import(ConstomImportSelector.class) // 批量导入,ok   springboot自动装配原理
@Configuration
public class ConstomEnableAutoConfig {

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class ConstomImportSelector implements ImportSelector {
// V1
// @Override
// public String[] selectImports(AnnotationMetadata annotationMetadata) {
// return new String[]{"com.zero.beandefition.importtest.InstB"};
// }

/**
* V2
*/
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
// 读取 META-INF/spring.factories 文件配置
// keys是 com.zero.beandefition.importtest.ImportConfig

List<String> ts = SpringFactoriesLoader.loadFactoryNames(ConstomEnableAutoConfig.class,
ConstomImportSelector.class.getClassLoader());

ts = Lists.newArrayList("com.zero.beandefition.importtest.InstB");

// return ts.toArray(new String[ts.size()]);
return StringUtils.toStringArray(ts);
}
}