接口定义
package org.springframework.beans.factory.support;
// 允许在常规 BeanFactoryPostProcessor 检测开始之前注册进一步的 bean 定义。
// 特别是, BeanDefinitionRegistryPostProcessor 可以注册进一步的 bean 定义,这些定义又定义 BeanFactoryPostProcessor 实例。
public interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor {
// 在标准初始化之后修改应用程序上下文的内部 bean 定义注册表。
// 所有常规 bean 定义都将被加载,但尚未实例化任何 bean。
// 这允许在下一个后处理阶段开始之前添加更多的 bean 定义。
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
}
自定义 BeanDefinitionRegistryPostProcessor
1)定义 BeanDefinition
需要用到的类。
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
private Long id;
private String name;
}
2)定义 MyBeanDefinitionRegistryPostProcessor
实现 BeanDefinitionRegistryPostProcessor
,并通过 @Component
注入到 Spring 容器中
@Slf4j
@Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
createUserBeanDefinition(registry);
}
private void createUserBeanDefinition(BeanDefinitionRegistry registry) {
// 1. 实例化一个 RootBeanDefinition
RootBeanDefinition beanDefinition = new RootBeanDefinition();
// 2. 设置 BeanClass
beanDefinition.setBeanClass(User.class);
// 3. 设置 构造方法对应的属性值
ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues();
constructorArgumentValues.addGenericArgumentValue(1L);
constructorArgumentValues.addGenericArgumentValue("huhu");
beanDefinition.setConstructorArgumentValues(constructorArgumentValues);
// 4. 注册到 Spring 容器中
registry.registerBeanDefinition("user", beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// do nothing
}
}
BeanDefinition
相关操作可以参考:自定义 BeanDefinition
3)启动 Spring 容器,并打印 User bean
的内容。
@Slf4j
@SpringBootApplication
public class SpringDemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SpringDemoApplication.class, args);
System.out.println(context.getBean(User.class));
}
}
控制台输出:
User(id=1, name=huhu)
网友评论