1:通常用实现 BeanDefinitionRegistryPostProcessor 实现bean注册,代码如下
@Configuration
public class NetsDaoBeanConfig implements BeanDefinitionRegistryPostProcessor {
private BeanNameGenerator beanNameGenerator = new AnnotationBeanNameGenerator();
/**
* daoImpl包
*/
static final String BASE_PACKAGES = "com.*.*.*.*.dao.impl";
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
throws BeansException {
System.out.println("NetsDaoBeanConfig.postProcessBeanDefinitionRegistry()");
this.daoRegisterBean(registry);
}
private void daoRegisterBean(BeanDefinitionRegistry registry){
Set<Class> scan = ClassScannerUtil.scan(BASE_PACKAGES);
for (Class tl : scan) {
registerBean(registry, null, tl);
}
}
/**
* 提供公共的注册方法。
*
* @param registry
* @param name
* @param beanClass
*/
private void registerBean(BeanDefinitionRegistry registry, String name, Class<?> beanClass) {
AnnotatedBeanDefinition annotatedBeanDefinition = new AnnotatedGenericBeanDefinition(beanClass);
annotatedBeanDefinition.setParentName("baseDao");
//自动生成name
String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(annotatedBeanDefinition, registry));
System.out.println("生成的beanName:" + beanName);
//bean注册的holer类.
BeanDefinitionHolder beanDefinitionHolder = new BeanDefinitionHolder(annotatedBeanDefinition, beanName);
//使用bean注册工具类进行注册.
BeanDefinitionReaderUtils.registerBeanDefinition(beanDefinitionHolder, registry);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
System.out.println("NetsDaoBeanConfig.postProcessBeanFactory()");
}
registerBean 方法为核心代码
说明:BeanDefinitionRegistryPostProcessor 实现动态注册, 优先级较高,在容器未初始化完成前,添加bean注册,如果注册的bean中的属性需要引用其他的一些bean 如Datasource 对象,是获取不到的。
方法2:在容器初始化完成后,添加bean
@Configuration
public class IdGeneratorBeanConfig implements ApplicationContextAware{
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext
.getAutowireCapableBeanFactory();
this.registBeanByFactory(beanFactory);
}
private void registBeanByFactory(DefaultListableBeanFactory beanFactory) {
System.out.println("IdGeneratorBeanConfig.registBeanByFactory()");
List<SeqEnum> seqList = SeqEnum.getAllSeqInfos();
//遍历序列动态注册bean
for (SeqEnum seqEnum : seqList) {
String beanName = "seqBeanName_" + count.incrementAndGet();
this.registerBean(beanFactory, beanName,MySQLMaxValueIncrementer.class, seqEnum);
MySQLMaxValueIncrementer incrementer = (MySQLMaxValueIncrementer) applicationContext.getBean(beanName);
incrementer.init();//除非init方法
}
}
/**
* 容器初始化完成后进行添加bean
*
* @param beanClass
*/
private void registerBean(DefaultListableBeanFactory beanFactory, String beanName, Class<?> beanClass, SeqEnum seqEnum) {
AnnotatedBeanDefinition annotatedBeanDefinition = new AnnotatedGenericBeanDefinition(beanClass);
((AnnotatedGenericBeanDefinition) annotatedBeanDefinition).setPropertyValues(getPropertyValues(seqEnum));//添加属性
beanFactory.registerBeanDefinition(beanName,annotatedBeanDefinition);
}
/**
* 属性设置
*/
private MutablePropertyValues getPropertyValues(SeqEnum seqEnum) {
MutablePropertyValues mutablePropertyValues = new MutablePropertyValues();
mutablePropertyValues.add("seqName", seqEnum.getSeqName());
mutablePropertyValues.add("cacheSize", seqEnum.getCacheSize());
mutablePropertyValues.add("dataSource", applicationContext.getBean("dataSource"));
mutablePropertyValues.add("incrementerName", seqEnum.getIncrementerName());
return mutablePropertyValues;
}
}