以下顺序为启动过程中的调用顺序
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException;
注册BeanDefinition
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
扩展beanFactory
Object postProcessBeforeInstantiation(Class
实例化前,返回非null的话,就不走默认的实例化逻辑
T get();
这是Spring提供给开发者的扩展点,如果我们要自己来实现创建对象的过程, 那么就可以提供一个Supplier的实现类,
当一个BeanDefinition中存在一个Supplier实现类的时候, Spring就利用这个类的get方法来获取实例,而不再走Spring创建对象的逻辑
通过AbstractBeanDefinition.setInstanceSupplier方法设置
void postProcessMergedBeanDefinition(
RootBeanDefinition beanDefinition,
Class<?> beanType, String beanName);
运行修改合并好了的BeanDefinition,这里会查找@Autowired的注入点(InjectedElement),并把这些注入点添加到mbd的
属性externallyManagedConfigMembers中;
CommonAnnotationBeanPostProcessor,在这里找@Resource的注入点,整理@PostConstruct,@PreDestroy注解对应的方法
default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
return true;
}
实例化后
default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
throws BeansException {
return null;
}
调用BeanPostProcessor分别解析@Autowired、@Resource、@Value,得到属性值(依赖注入)
依次执行:
BeanNameAware
void setBeanName(String name);
BeanClassLoaderAware
void setBeanClassLoader(ClassLoader classLoader);
BeanFactoryAware
void setBeanFactory(BeanFactory beanFactory) throws BeansException;
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
};
初始化前
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
初始化后