6.Bean的实例化和初始化:Spring容器根据修改后的BeanDefinition实例化Bean,并执行Bean的初始化操作。
public class MyBean { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } }然后,我们实现一个BeanFactoryPostProcessor来修改MyBean的属性值:
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MyBean.class); builder.getBeanDefinition().getPropertyValues().add("name", "Modified Bean"); registry.registerBeanDefinition("myBean", builder.getBeanDefinition()); } public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(MyBeanFactoryPostProcessor.class); MyBean myBean = context.getBean(MyBean.class); System.out.println(myBean.getName()); // 输出 "Modified Bean" } }在上述代码中,我们定义了一个MyBean类,并在Spring配置中注册了一个名为myBean的Bean。然后,我们实现了一个
Spring容器初始化:在Spring容器启动过程中,会读取配置文件或注解等方式加载BeanDefinition,并创建BeanFactory对象。BeanFactory是Spring容器的核心接口,负责管理和维护BeanDefinition。
BeanDefinition的注册:在加载BeanDefinition之后,Spring容器会将其注册到BeanFactory中。注册的过程包括将BeanDefinition保存到容器中的数据结构中,以便后续的查找和使用。
BeanFactoryPostProcessor的查找和执行:在BeanDefinition注册完成之后,Spring容器会查找并执行所有实现了BeanFactoryPostProcessor接口的类的postProcessBeanFactory方法。这个过程是通过反射机制实现的,Spring容器会扫描所有的类,找到实现了BeanFactoryPostProcessor接口的类,并调用其postProcessBeanFactory方法。
Bean的实例化和初始化:在BeanFactoryPostProcessor的执行过程中,Spring容器并不会实例化和初始化Bean,只是对BeanDefinition进行修改和处理。实际的Bean的实例化和初始化是在BeanFactoryPostProcessor执行完毕之后进行的。
BeanFactoryPostProcessor的再次查找和执行:在Bean的实例化和初始化之前,Spring容器会再次查找并执行所有实现了BeanFactoryPostProcessor接口的类的postProcessBeanFactory方法。这个过程与第3步类似,只不过这次是针对修改后的BeanDefinition进行处理。
Bean的实例化和初始化:在第6步的处理完成之后,Spring容器根据修改后的BeanDefinition实例化Bean,并执行Bean的初始化操作。这个过程包括调用构造函数创建Bean实例、设置属性值、执行初始化方法等。