AnnotationConfigApplicationContext 启动类
public class ConfigStart {
public static void main (String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext (MainConfig.class);
Student student = applicationContext.getBean(Student.class);
}
}
Copy 主配置类
@Configuration
public class MainConfig {
@Bean
public Student student ( ) {
return new Student ();
}
}
Copy bean
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private Long id ;
private String name ;
}
Copy 结构图
AnnotationConfigApplicationContext构造器
public AnnotationConfigApplicationContext (Class<?>... componentClasses) {
this ();
register (componentClasses);
refresh ();
}
Copy AnnotationConfigApplicationContext#this()方法解析
public AnnotationConfigApplicationContext () {
this .reader = new AnnotatedBeanDefinitionReader(this );
this .scanner = new ClassPathBeanDefinitionScanner(this );
}
Copy AnnotationConfigUtils#registerAnnotationConfigProcessors(this.registry) 方法解析
public static void registerAnnotationConfigProcessors (BeanDefinitionRegistry registry ) {
registerAnnotationConfigProcessors (registry, null );
}
Copy
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors (
BeanDefinitionRegistry registry, @Nullable Object source) {
DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
if (beanFactory != null ) {
if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
}
if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
}
}
Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8 );
if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class );
def.setSource(source);
beanDefs.add (registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
}
if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class );
def.setSource(source);
beanDefs.add (registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class );
def.setSource(source);
beanDefs.add (registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
}
if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition();
try {
def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
AnnotationConfigUtils.class .getClassLoader()));
}
catch (ClassNotFoundException ex) {
throw new IllegalStateException(
"Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
}
def.setSource(source);
beanDefs.add (registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
}
if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class );
def.setSource(source);
beanDefs.add (registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
}
if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class );
def.setSource(source);
beanDefs.add (registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
}
return beanDefs;
}
Copy DefaultListableBeanFactory结构图
总结
1. 创建AnnotatedBeanDefinitionReader 对象,用于解析注解类BeanDefinition ,同时AnnotatedBeanDefinitionReader 对象有一个成员:
BeanDefinitionRegistry ,赋值为AnnotationConfigApplicationContext 对象(AnnotationConfigApplicationContext 和AnnotatedBeanDefinitionReader 相互引用)
2. AbstractApplicationContext 对象有Environment 成员,会初始化为StandardEnvironment 对象。
AbstractApplicationContext 是AnnotationConfigApplicationContext 父类的父类
3. GenericApplicationContext 对象有DefaultListableBeanFactory 成员,会初始化为DefaultListableBeanFactory , 该对象是真正的beanFactory。【非常重要】
GenericApplicationContext 是AnnotationConfigApplicationContext 的父类
4. beanFactory, 类型为DefaultListableBeanFactory , 有几个重要的成员变量:
private final Map <String , BeanDefinition > beanDefinitionMap = new ConcurrentHashMap <>(256 );
private volatile List <String > beanDefinitionNames = new ArrayList <>(256 );
初始化的时候,会先后在beanDefinitionMap中添加:
(internalConfigurationAnnotationProcessor, ConfigurationClassPostProcessor 对应的BeanDefinition )
(internalAutowiredAnnotationProcessor, AutowiredAnnotationBeanPostProcessor 对应的BeanDefinition )
(internalCommonAnnotationProcessor, CommonAnnotationBeanPostProcessor 对应的BeanDefinition )
(internalEventListenerProcessor, EventListenerMethodProcessor 对应的BeanDefinition )
(internalEventListenerFactory, DefaultEventListenerFactory 对应的BeanDefinition )
在beanDefinitionNames中添加:
internalConfigurationAnnotationProcessor, internalAutowiredAnnotationProcessor, internalCommonAnnotationProcessor,
internalEventListenerProcessor, internalEventListenerFactory
以上注册的5 个BeanDefinition 非常非常重要!!!!!!
5. 创建ClassPathBeanDefinitionScanner 对象
Copy AnnotationConfigApplicationContext#register(componentClasses)方法解析
public void register (Class<?>... componentClasses ) {
Assert .notEmpty (componentClasses, "At least one component class must be specified" );
this .reader .register (componentClasses);
}
public void registerBean (Class<?> beanClass ) {
doRegisterBean (beanClass, null , null , null );
}
Copy AnnotatedBeanDefinitionReader#doRegisterBean(...) 方法解析
<T> void doRegisterBean (Class<T> beanClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name,
@Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {
AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition (beanClass);
if (this .conditionEvaluator.shouldSkip(abd.getMetadata())) {
return ;
}
abd.setInstanceSupplier(instanceSupplier);
ScopeMetadata scopeMetadata = this .scopeMetadataResolver.resolveScopeMetadata(abd);
abd.setScope(scopeMetadata.getScopeName());
String beanName = (name != null ? name : this .beanNameGenerator.generateBeanName(abd, this .registry));
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
if (qualifiers != null ) {
for (Class<? extends Annotation > qualifier : qualifiers) {
if (Primary.class == qualifier) {
abd.setPrimary(true );
}
else if (Lazy.class == qualifier) {
abd.setLazyInit(true );
}
else {
abd.addQualifier(new AutowireCandidateQualifier (qualifier));
}
}
}
for (BeanDefinitionCustomizer customizer : definitionCustomizers) {
customizer.customize(abd);
}
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder (abd, beanName);
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this .registry);
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this .registry);
}
Copy 此时,一共注册了6个BeanDefinition ,其中5个内置的RootBeanDefinition ,一个注解式的AnnotatedGenericBeanDefinition
总结
1. 解析主配置类MainConfig
2. 创建MainConfig对应的BeanDefinition对象AnnotatedGenericBeanDefinition
3. 解析@Scope 注解
4. 解析通用注解 @Lazy @Primary @DependsOn @Role @Description , 如果有加对应的注解, 会配置AnnotatedGenericBeanDefinition的对应属性
5. 向beanDefinitionMap中注册(mainConfig, MainConfig对应的BeanDefinition), 向beanDefinitionNames中添加mainConfig
Copy AbstractApplicationContext#refresh() refresh()方法调用的是AnnotationConfigApplicationContext 父类的父类AbstractApplicationContext 的refresh()方法
public void refresh () throws BeansException, IllegalStateException {
synchronized (this .startupShutdownMonitor) {
prepareRefresh();
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
prepareBeanFactory(beanFactory);
try {
postProcessBeanFactory(beanFactory);
invokeBeanFactoryPostProcessors(beanFactory);
registerBeanPostProcessors(beanFactory);
initMessageSource();
initApplicationEventMulticaster();
onRefresh();
registerListeners();
finishBeanFactoryInitialization(beanFactory);
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
destroyBeans();
cancelRefresh(ex);
throw ex;
}
finally {
resetCommonCaches();
}
}
}
Copy 1. AbstractApplicationContext#prepareRefresh()
protected void prepareRefresh() {
this .startupDate = System.currentTimeMillis();
this .closed.set (false );
this .active.set (true );
if (logger.isDebugEnabled()) {
if (logger.isTraceEnabled()) {
logger.trace("Refreshing " + this );
}
else {
logger.debug("Refreshing " + getDisplayName());
}
}
initPropertySources();
getEnvironment().validateRequiredProperties();
if (this .earlyApplicationListeners == null ) {
this .earlyApplicationListeners = new LinkedHashSet<>(this .applicationListeners);
}
else {
this .applicationListeners.clear();
this .applicationListeners.addAll(this .earlyApplicationListeners);
}
this .earlyApplicationEvents = new LinkedHashSet<>();
}
Copy 总结
设置了 启动时间, closed, active标识, 初始化了AbstractApplicationContext的两个成员变量:
private Set <ApplicationListener <?>> earlyApplicationListeners = new LinkedHashSet <>();
private Set <ApplicationEvent > earlyApplicationEvents = new LinkedHashSet <>();
Copy 2. AbstractApplicationContext#obtainFreshBeanFactory()
protected ConfigurableListableBeanFactory obtainFreshBeanFactory () {
refreshBeanFactory ();
return getBeanFactory ();
}
Copy 总结 修改GenericApplicationContext对象里的 refreshed 标识改为true , 设置id , 返回beanFactory对象【DefaultListableBeanFactory】
Copy 3. AbstractApplicationContext#prepareBeanFactory(beanFactory)
protected void prepareBeanFactory (ConfigurableListableBeanFactory beanFactory) {
beanFactory.setBeanClassLoader (getClassLoader());
beanFactory.setBeanExpressionResolver (new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
beanFactory.addPropertyEditorRegistrar (new ResourceEditorRegistrar(this, getEnvironment()));
beanFactory.addBeanPostProcessor (new ApplicationContextAwareProcessor(this));
beanFactory.ignoreDependencyInterface (EnvironmentAware.class);
beanFactory.ignoreDependencyInterface (EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface (ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface (ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface (MessageSourceAware.class);
beanFactory.ignoreDependencyInterface (ApplicationContextAware.class);
beanFactory.registerResolvableDependency (BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency (ResourceLoader.class, this);
beanFactory.registerResolvableDependency (ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency (ApplicationContext.class, this);
beanFactory.addBeanPostProcessor (new ApplicationListenerDetector(this));
if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor (new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader (new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton (ENVIRONMENT_BEAN_NAME, getEnvironment());
}
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
beanFactory.registerSingleton (SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties ());
}
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton (SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment ());
}
}
Copy 总结
1.设置类加载器为AppClassLoader
2.设置spring el表达式解析器 - StandardBeanExpressionResolver
3.添加属性编辑器 - ResourceEditorRegistrar
4.添加两个后置处理器: ApplicationContextAwareProcessor, ApplicationListenerDetector
5.ignoredDependencyInterfaces中注册 6个忽略自动装配的接口, 一共9个
6.resolvableDependencies中注册 4个允许自动装配的bean
7.beanFactory中注册三个实例对象: environment, systemProperties, systemEnvironment, 放入一级缓存map和已注册bean列表中
Copy 此时的beanFactory
4. AbstractApplicationContext#postProcessBeanFactory(beanFactory) 空实现,子类扩展
Copy 5.AbstractApplicationContext#invokeBeanFactoryPostProcessors(beanFactory)
protected void invokeBeanFactoryPostProcessors (ConfigurableListableBeanFactory beanFactory ) {
PostProcessorRegistrationDelegate .invokeBeanFactoryPostProcessors (beanFactory, getBeanFactoryPostProcessors ());
if (beanFactory.getTempClassLoader () == null && beanFactory.containsBean (LOAD_TIME_WEAVER_BEAN_NAME )) {
beanFactory.addBeanPostProcessor (new LoadTimeWeaverAwareProcessor (beanFactory));
beanFactory.setTempClassLoader (new ContextTypeMatchClassLoader (beanFactory.getBeanClassLoader ()));
}
}
Copy 5. 1 PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()) 解析 【重点方法】
public static void invokeBeanFactoryPostProcessors (
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
Set<String> processedBeans = new HashSet<>();
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
registryProcessor.postProcessBeanDefinitionRegistry(registry);
registryProcessors.add (registryProcessor);
}
else {
regularPostProcessors.add (postProcessor);
}
}
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class , true , false );
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class )) {
currentRegistryProcessors.add (beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class ));
processedBeans.add (ppName);
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class , true , false );
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class )) {
currentRegistryProcessors.add (beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class ));
processedBeans.add (ppName);
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
boolean reiterate = true ;
while (reiterate) {
reiterate = false ;
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class , true , false );
for (String ppName : postProcessorNames) {
if (!processedBeans.contains(ppName)) {
currentRegistryProcessors.add (beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class ));
processedBeans.add (ppName);
reiterate = true ;
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
}
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
}
else {
invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
}
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class , true , false );
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
if (processedBeans.contains(ppName)) {
}
else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class )) {
priorityOrderedPostProcessors.add (beanFactory.getBean(ppName, BeanFactoryPostProcessor.class ));
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class )) {
orderedPostProcessorNames.add (ppName);
}
else {
nonOrderedPostProcessorNames.add (ppName);
}
}
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
for (String postProcessorName : orderedPostProcessorNames) {
orderedPostProcessors.add (beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class ));
}
sortPostProcessors(orderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
for (String postProcessorName : nonOrderedPostProcessorNames) {
nonOrderedPostProcessors.add (beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class ));
}
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
beanFactory.clearMetadataCache();
}
Copy 【5.1 方法总结】
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors的思路很清晰:
1.首先需要知道两个接口, 这个方法就是在围绕两个接口:
BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor, 且后者是前者的子接口
BeanFactoryPostProcessor的核心方法:postProcessBeanFactory
BeanDefinitionRegistryPostProcessor的核心方法:postProcessBeanDefinitionRegistry
2.这个方法的执行过程就是:
先找到实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor, 排序后依次执行他们的postProcessBeanDefinitionRegistry方法;
再找到实现Ordered接口的BeanDefinitionRegistryPostProcessor, 排序后依次执行postProcessBeanDefinitionRegistry
再找到普通的BeanDefinitionRegistryPostProcessor, 依次执行postProcessBeanDefinitionRegistry
最后依次执行上面BeanDefinitionRegistryPostProcessor的postProcessBeanFactory
以上把BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry和postProcessBeanFactory都执行完了
继续执行:
把普通的BeanFactoryPostProcessor都找到, 然后依次执行它们的postProcessBeanFactory方法
3.在当前例子中, 实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor只有一个【内置的】:
ConfigurationClassPostProcessor,所以要研究它的postProcessBeanDefinitionRegistry方法和postProcessBeanFactory方法
实现了普通的BeanFactoryPostProcessor也只有一个【内置的】:EventListenerMethodProcessor, 需要研究它的postProcessBeanFactory方法
Copy 5.2 ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry()解析【重点方法】 postProcessBeanDefinitionRegistry内部调用的是processConfigBeanDefinitions, 所以当前我们研究processConfigBeanDefinitions方法,
这个方法会解析 @Configuration 标签
public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
List<BeanDefinitionHolder> configCandidates = new ArrayList<>();
String[] candidateNames = registry.getBeanDefinitionNames();
for (String beanName : candidateNames) {
BeanDefinition beanDef = registry.getBeanDefinition(beanName);
if (ConfigurationClassUtils.isFullConfigurationClass(beanDef) ||
ConfigurationClassUtils.isLiteConfigurationClass(beanDef)) {
if (logger.isDebugEnabled()) {
logger.debug("Bean definition has already been processed as a configuration class: " + beanDef);
}
}
else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this .metadataReaderFactory)) {
configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
}
}
if (configCandidates.isEmpty()) {
return ;
}
configCandidates.sort((bd1, bd2) -> {
int i1 = ConfigurationClassUtils.getOrder(bd1.getBeanDefinition());
int i2 = ConfigurationClassUtils.getOrder(bd2.getBeanDefinition());
return Integer.compare(i1, i2);
});
SingletonBeanRegistry sbr = null ;
if (registry instanceof SingletonBeanRegistry) {
sbr = (SingletonBeanRegistry) registry;
if (!this .localBeanNameGeneratorSet) {
BeanNameGenerator generator = (BeanNameGenerator) sbr.getSingleton(CONFIGURATION_BEAN_NAME_GENERATOR);
if (generator != null ) {
this .componentScanBeanNameGenerator = generator;
this .importBeanNameGenerator = generator;
}
}
}
if (this .environment == null ) {
this .environment = new StandardEnvironment();
}
ConfigurationClassParser parser = new ConfigurationClassParser(
this .metadataReaderFactory, this .problemReporter, this .environment,
this .resourceLoader, this .componentScanBeanNameGenerator, registry);
Set<BeanDefinitionHolder> candidates = new LinkedHashSet<>(configCandidates);
Set<ConfigurationClass> alreadyParsed = new HashSet<>(configCandidates.size());
do {
parser.parse(candidates);
parser.validate();
Set<ConfigurationClass> configClasses = new LinkedHashSet<>(parser.getConfigurationClasses());
configClasses.removeAll(alreadyParsed);
if (this .reader == null ) {
this .reader = new ConfigurationClassBeanDefinitionReader(
registry, this .sourceExtractor, this .resourceLoader, this .environment,
this .importBeanNameGenerator, parser.getImportRegistry());
}
this .reader.loadBeanDefinitions(configClasses);
alreadyParsed.addAll(configClasses);
candidates.clear();
if (registry.getBeanDefinitionCount() > candidateNames.length) {
String[] newCandidateNames = registry.getBeanDefinitionNames();
Set<String> oldCandidateNames = new HashSet<>(Arrays.asList(candidateNames));
Set<String> alreadyParsedClasses = new HashSet<>();
for (ConfigurationClass configurationClass : alreadyParsed) {
alreadyParsedClasses.add(configurationClass.getMetadata().getClassName());
}
for (String candidateName : newCandidateNames) {
if (!oldCandidateNames.contains(candidateName)) {
BeanDefinition bd = registry.getBeanDefinition(candidateName);
if (ConfigurationClassUtils.checkConfigurationClassCandidate(bd, this .metadataReaderFactory) &&
!alreadyParsedClasses.contains(bd.getBeanClassName())) {
candidates.add(new BeanDefinitionHolder(bd, candidateName));
}
}
}
candidateNames = newCandidateNames;
}
}
while (!candidates.isEmpty());
if (sbr != null && !sbr.containsSingleton(IMPORT_REGISTRY_BEAN_NAME)) {
sbr.registerSingleton(IMPORT_REGISTRY_BEAN_NAME, parser.getImportRegistry());
}
if (this .metadataReaderFactory instanceof CachingMetadataReaderFactory) {
((CachingMetadataReaderFactory) this .metadataReaderFactory).clearCache();
}
}
Copy 5.3 ConfigurationClassParser#parse(Set configCandidates)解析 内部调用的是【doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass)】, 最后将解析结果放入到ConfigurationClassParser的configurationClasses中,
下面解析【doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass)】 方法
protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass)
throws IOException {
if (configClass.getMetadata().isAnnotated(Component.class .getName())) {
processMemberClasses(configClass, sourceClass);
}
for (AnnotationAttributes propertySource : AnnotationConfigUtils.attributesForRepeatable(
sourceClass.getMetadata(), PropertySources.class ,
org.springframework.context.annotation .PropertySource.class )) {
if (this .environment instanceof ConfigurableEnvironment) {
processPropertySource(propertySource);
}
else {
logger.info("Ignoring @PropertySource annotation on [" + sourceClass.getMetadata().getClassName() +
"]. Reason: Environment must implement ConfigurableEnvironment" );
}
}
Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable(
sourceClass.getMetadata(), ComponentScans.class , ComponentScan.class );
if (!componentScans.isEmpty() &&
!this .conditionEvaluator.shouldSkip(sourceClass.getMetadata(), ConfigurationPhase.REGISTER_BEAN)) {
for (AnnotationAttributes componentScan : componentScans) {
Set<BeanDefinitionHolder> scannedBeanDefinitions =
this .componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName());
for (BeanDefinitionHolder holder : scannedBeanDefinitions) {
BeanDefinition bdCand = holder.getBeanDefinition().getOriginatingBeanDefinition();
if (bdCand == null ) {
bdCand = holder.getBeanDefinition();
}
if (ConfigurationClassUtils.checkConfigurationClassCandidate(bdCand, this .metadataReaderFactory)) {
parse(bdCand.getBeanClassName(), holder.getBeanName());
}
}
}
}
processImports(configClass, sourceClass, getImports(sourceClass), true );
AnnotationAttributes importResource =
AnnotationConfigUtils.attributesFor(sourceClass.getMetadata(), ImportResource.class );
if (importResource != null ) {
String[] resources = importResource.getStringArray("locations" );
Class<? extends BeanDefinitionReader> readerClass = importResource.getClass("reader" );
for (String resource : resources) {
String resolvedResource = this .environment.resolveRequiredPlaceholders(resource);
configClass.addImportedResource(resolvedResource, readerClass);
}
}
Set<MethodMetadata> beanMethods = retrieveBeanMethodMetadata(sourceClass);
for (MethodMetadata methodMetadata : beanMethods) {
configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass));
}
processInterfaces(configClass, sourceClass);
if (sourceClass.getMetadata().hasSuperClass()) {
String superclass = sourceClass.getMetadata().getSuperClassName();
if (superclass != null && !superclass.startsWith("java" ) &&
!this .knownSuperclasses.containsKey(superclass)) {
this .knownSuperclasses.put(superclass, configClass);
return sourceClass.getSuperClass();
}
}
return null ;
}
Copy 【5.3 方法总结】
当前方法主要使用ConfigurationClassParser 来处理我们主配置类对应的ConfigurationClass , 这里我们的主配置类是:MainConfig
递归处理 内部类、@PropertySources 、@ComponentScan 、@Import 、@ImportResource 、内部@Bean 标签
Copy 5.4 ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForConfigurationClass()解析 这里的configClass是MainConfig对应的Configuration
private void loadBeanDefinitionsForConfigurationClass (
ConfigurationClass configClass, TrackedConditionEvaluator trackedConditionEvaluator) {
if (trackedConditionEvaluator.shouldSkip (configClass)) {
String beanName = configClass.getBeanName ();
if (StringUtils .hasLength (beanName) && this .registry .containsBeanDefinition (beanName)) {
this .registry .removeBeanDefinition (beanName);
}
this .importRegistry .removeImportingClass (configClass.getMetadata ().getClassName ());
return ;
}
if (configClass.isImported ()) {
registerBeanDefinitionForImportedConfigurationClass (configClass);
}
for (BeanMethod beanMethod : configClass.getBeanMethods ()) {
loadBeanDefinitionsForBeanMethod (beanMethod);
}
loadBeanDefinitionsFromImportedResources (configClass.getImportedResources ());
loadBeanDefinitionsFromRegistrars (configClass.getImportBeanDefinitionRegistrars ());
}
Copy 5.5 ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForBeanMethod(BeanMethod beanMethod)方法解析 这里的BeanMethod是@Bean student()方法对应的 BeanMethod
private void loadBeanDefinitionsForBeanMethod (BeanMethod beanMethod) {
ConfigurationClass configClass = beanMethod.getConfigurationClass();
MethodMetadata metadata = beanMethod.getMetadata();
String methodName = metadata.getMethodName();
if (this .conditionEvaluator.shouldSkip(metadata, ConfigurationPhase.REGISTER_BEAN)) {
configClass.skippedBeanMethods.add(methodName);
return ;
}
if (configClass.skippedBeanMethods.contains(methodName)) {
return ;
}
AnnotationAttributes bean = AnnotationConfigUtils.attributesFor(metadata, Bean.class);
Assert.state(bean != null , "No @Bean annotation attributes" );
List<String> names = new ArrayList <>(Arrays.asList(bean.getStringArray("name" )));
String beanName = (!names.isEmpty() ? names.remove(0 ) : methodName);
for (String alias : names) {
this .registry.registerAlias(beanName, alias);
}
if (isOverriddenByExistingDefinition(beanMethod, beanName)) {
if (beanName.equals(beanMethod.getConfigurationClass().getBeanName())) {
throw new BeanDefinitionStoreException (beanMethod.getConfigurationClass().getResource().getDescription(),
beanName, "Bean name derived from @Bean method '" + beanMethod.getMetadata().getMethodName() +
"' clashes with bean name for containing configuration class; please make those names unique!" );
}
return ;
}
ConfigurationClassBeanDefinition beanDef = new ConfigurationClassBeanDefinition (configClass, metadata);
beanDef.setResource(configClass.getResource());
beanDef.setSource(this .sourceExtractor.extractSource(metadata, configClass.getResource()));
if (metadata.isStatic()) {
beanDef.setBeanClassName(configClass.getMetadata().getClassName());
beanDef.setFactoryMethodName(methodName);
}
else {
beanDef.setFactoryBeanName(configClass.getBeanName());
beanDef.setUniqueFactoryMethodName(methodName);
}
beanDef.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_CONSTRUCTOR);
beanDef.setAttribute(org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor.
SKIP_REQUIRED_CHECK_ATTRIBUTE, Boolean.TRUE);
AnnotationConfigUtils.processCommonDefinitionAnnotations(beanDef, metadata);
Autowire autowire = bean.getEnum("autowire" );
if (autowire.isAutowire()) {
beanDef.setAutowireMode(autowire.value());
}
boolean autowireCandidate = bean.getBoolean("autowireCandidate" );
if (!autowireCandidate) {
beanDef.setAutowireCandidate(false );
}
String initMethodName = bean.getString("initMethod" );
if (StringUtils.hasText(initMethodName)) {
beanDef.setInitMethodName(initMethodName);
}
String destroyMethodName = bean.getString("destroyMethod" );
beanDef.setDestroyMethodName(destroyMethodName);
ScopedProxyMode proxyMode = ScopedProxyMode.NO;
AnnotationAttributes attributes = AnnotationConfigUtils.attributesFor(metadata, Scope.class);
if (attributes != null ) {
beanDef.setScope(attributes.getString("value" ));
proxyMode = attributes.getEnum("proxyMode" );
if (proxyMode == ScopedProxyMode.DEFAULT) {
proxyMode = ScopedProxyMode.NO;
}
}
BeanDefinition beanDefToRegister = beanDef;
if (proxyMode != ScopedProxyMode.NO) {
BeanDefinitionHolder proxyDef = ScopedProxyCreator.createScopedProxy(
new BeanDefinitionHolder (beanDef, beanName), this .registry,
proxyMode == ScopedProxyMode.TARGET_CLASS);
beanDefToRegister = new ConfigurationClassBeanDefinition (
(RootBeanDefinition) proxyDef.getBeanDefinition(), configClass, metadata);
}
if (logger.isTraceEnabled()) {
logger.trace(String.format("Registering bean definition for @Bean method %s.%s()" ,
configClass.getMetadata().getClassName(), beanName));
}
this .registry.registerBeanDefinition(beanName, beanDefToRegister);
}
Copy 此时的beanFactory, beanDefinitionMap中已经有了7个, 其中5个内置的, 还有一个mainConfig,一个student
5.6 ConfigurationClassPostProcessor#postProcessBeanFactory()方法解析 我们在@5.1 中的总结里提到过, 本质就是先后执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法和postProcessBeanFactory方法,这里只有一个内置的BeanDefinitionRegistryPostProcessor,即ConfigurationClassPostProcessor,上面我们介绍了ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry方法,接下来就需要解析它的postProcessBeanFactory方法了
@Override
public void postProcessBeanFactory (ConfigurableListableBeanFactory beanFactory ) {
int factoryId = System.identityHashCode(beanFactory);
if (this .factoriesPostProcessed.contains(factoryId)) {
throw new IllegalStateException(
"postProcessBeanFactory already called on this post-processor against " + beanFactory);
}
this .factoriesPostProcessed.add (factoryId);
if (!this .registriesPostProcessed.contains(factoryId)) {
processConfigBeanDefinitions((BeanDefinitionRegistry) beanFactory);
}
enhanceConfigurationClasses(beanFactory);
beanFactory.addBeanPostProcessor(new ImportAwareBeanPostProcessor(beanFactory));
}
Copy 5.7 ConfigurationClassPostProcessor#enhanceConfigurationClasses(beanFactory)方法解析
public void enhanceConfigurationClasses (ConfigurableListableBeanFactory beanFactory ) {
Map <String , AbstractBeanDefinition > configBeanDefs = new LinkedHashMap <>();
for (String beanName : beanFactory.getBeanDefinitionNames ()) {
BeanDefinition beanDef = beanFactory.getBeanDefinition (beanName);
if (ConfigurationClassUtils .isFullConfigurationClass (beanDef)) {
if (!(beanDef instanceof AbstractBeanDefinition )) {
throw new BeanDefinitionStoreException ("Cannot enhance @Configuration bean definition '" +
beanName + "' since it is not stored in an AbstractBeanDefinition subclass" );
}
else if (logger.isInfoEnabled () && beanFactory.containsSingleton (beanName)) {
logger.info ("Cannot enhance @Configuration bean definition '" + beanName +
"' since its singleton instance has been created too early. The typical cause " +
"is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor " +
"return type: Consider declaring such methods as 'static'." );
}
configBeanDefs.put (beanName, (AbstractBeanDefinition ) beanDef);
}
}
if (configBeanDefs.isEmpty ()) {
return ;
}
ConfigurationClassEnhancer enhancer = new ConfigurationClassEnhancer ();
for (Map .Entry <String , AbstractBeanDefinition > entry : configBeanDefs.entrySet ()) {
AbstractBeanDefinition beanDef = entry.getValue ();
beanDef.setAttribute (AutoProxyUtils .PRESERVE_TARGET_CLASS_ATTRIBUTE , Boolean .TRUE );
try {
Class <?> configClass = beanDef.resolveBeanClass (this .beanClassLoader );
if (configClass != null ) {
Class <?> enhancedClass = enhancer.enhance (configClass, this .beanClassLoader );
if (configClass != enhancedClass) {
if (logger.isTraceEnabled ()) {
logger.trace (String .format ("Replacing bean definition '%s' existing class '%s' with " +
"enhanced class '%s'" , entry.getKey (), configClass.getName (), enhancedClass.getName ()));
}
beanDef.setBeanClass (enhancedClass);
}
}
}
catch (Throwable ex) {
throw new IllegalStateException ("Cannot load configuration class: " + beanDef.getBeanClassName (), ex);
}
}
}
Copy
【5.2 - 5.7方法总结】
1. 在上述方法中, 我们已经处理了唯一的内置 BeanDefinitionRegistryPostProcessor【ConfigurationClassPostProcessor】, 先后执行了 它的postProcessBeanDefinitionRegistry方法和 postProcessBeanFactory方法
2. 它的postProcessBeanDefinitionRegistry方法主要是:
解析@Configuration 对应的配置类, 将@Configuration 配置类里的@Bean 标签对应的方法取出, 封装成BeanDefinition, 注册到
BeanDefinitionMap和BeanDefinitionNames中
3. 它的postProcessBeanFactory方法主要是:
找到@Configuration 配置类对应的BeanDefinition, 替换BeanDefinition中beanClass为cglib增强后的配置类
4. 接下来, 就需要处理普通的BeanFacotryPostProcessor, 这里也只剩一个了:EventListenerMethodProcessor, 解析它的postProcessBeanFactory()方法
Copy 5.8 EventListenerMethodProcessor.postProcessBeanFactory()方法解析
@Override
public void postProcessBeanFactory (ConfigurableListableBeanFactory beanFactory ) {
this .beanFactory = beanFactory;
Map <String , EventListenerFactory > beans = beanFactory.getBeansOfType (EventListenerFactory .class , false , false );
List <EventListenerFactory > factories = new ArrayList <>(beans.values ());
AnnotationAwareOrderComparator .sort (factories);
this .eventListenerFactories = factories;
}
Copy 至此, @5.1 的方法已经全部执行完毕, 回到@5, @5中接下来的条件不满足, 也直接跳过, 所以此时@5全部执行完毕!!!
总结
1 .首先需要知道两个接口, 整个方法就是在围绕两个接口:
BeanFactoryPostProcessor 、BeanDefinitionRegistryPostProcessor , 且后者是前者的子接口
BeanFactoryPostProcessor 的核心方法:postProcessBeanFactory
BeanDefinitionRegistryPostProcessor 的核心方法:postProcessBeanDefinitionRegistry
2 .这个方法的执行过程就是:
先找到实现PriorityOrdered 接口的BeanDefinitionRegistryPostProcessor , 排序后依次执行他们的postProcessBeanDefinitionRegistry方法;
再找到实现Ordered 接口的BeanDefinitionRegistryPostProcessor , 排序后依次执行postProcessBeanDefinitionRegistry
再找到普通的BeanDefinitionRegistryPostProcessor , 依次执行postProcessBeanDefinitionRegistry
最后依次执行上面BeanDefinitionRegistryPostProcessor 的postProcessBeanFactory
以上把BeanDefinitionRegistryPostProcessor 的postProcessBeanDefinitionRegistry和postProcessBeanFactory都执行完了
继续执行:
把普通的BeanFactoryPostProcessor 都找到, 然后依次执行它们的postProcessBeanFactory方法
3 .在当前例子中, 实现了PriorityOrdered 接口的BeanDefinitionRegistryPostProcessor 只有一个【内置的】:
ConfigurationClassPostProcessor ,所以要研究它的postProcessBeanDefinitionRegistry方法和postProcessBeanFactory方法
实现了普通的BeanFactoryPostProcessor 也只有一个【内置的】:EventListenerMethodProcessor , 需要研究它的postProcessBeanFactory方法
4 .在上述方法中, 我们已经处理了唯一的内置 BeanDefinitionRegistryPostProcessor 【ConfigurationClassPostProcessor 】, 先后执行了 它的postProcessBeanDefinitionRegistry方法和 postProcessBeanFactory方法
它的postProcessBeanDefinitionRegistry方法主要是:
解析@Configuration 对应的配置类, 将@Configuration 配置类里的@Bean 标签对应的方法取出, 封装成BeanDefinition , 注册到
BeanDefinitionMap 和BeanDefinitionNames 中
它的postProcessBeanFactory方法主要是:
找到@Configuration 配置类对应的BeanDefinition , 替换BeanDefinition 中beanClass为cglib增强后的配置类
接下来, 就需要处理普通的BeanFacotryPostProcessor , 这里也只剩一个了:EventListenerMethodProcessor , 解析它的postProcessBeanFactory()方法
Copy 问题解答: 1.我们自定义的BeanFactoryPostProcessor,并注册到容器中,构造器方法在什么时候执行,postProcessBeanFactory在什么时候执行
@Slf4j
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public CustomBeanFactoryPostProcessor () {
log.info("CustomBeanFactoryPostProcessor构造器被执行" );
}
@Override
public void postProcessBeanFactory (ConfigurableListableBeanFactory beanFactory) throws BeansException {
log.info("自定义CustomBeanFactoryPostProcessor.postProcess()" );
}
}
Copy
根据invokeBeanFactoryPostProcessors方法分析我们知道:
1 .这个方法会优先执行ConfigurationClassPostProcessor 的postProcessBeanDefinitionRegistry方法,这个方法会解析我们的@Configuration 配置类, 把配置类中通过@ComponentScan 、@Import 、@Bean 等方式注册到spring容器中的类, 全部解析封装成BeanDefinition 对象, 放入beanFactory【DefaultListableBeanFactory 】的beanDefinitionMap中, 所以这个时候, 我们自定义的
CustomBeanFactoryPostProcessor 已经被解析封装成BeanDefinition 对象了
2 .等ConfigurationClassPostProcessor 执行完postProcessBeanDefinitionRegistry方法和postProcessBeanFactory方法后, 就开始解析普通的BeanFactoryPostProcessor 了
3 .此时, 会从beanDefinitionMap中找到所有BeanFacotyPostProcessor 对应的BeanDefinition , 见方法@5 .1 的第12 步, 然后使用getBean()方法获取实例对象, 此时会初始化BeanFacotyPostProcessor 对象, 调用构造器方法, 这里, 我们自定义的CustomBeanFactoryPostProcessor 构造器方法被调用了
4 .初始化完成后会添加到list中, 遍历执行postProcessBeanFactory方法, 此时自定义的postProcessBeanFactory方法也被执行了
Copy 6. AbstractApplicationContext#registerBeanPostProcessors(beanFactory) 注册拦截bean创建的BeanPostProcessor
protected void registerBeanPostProcessors (ConfigurableListableBeanFactory beanFactory ) {
PostProcessorRegistrationDelegate .registerBeanPostProcessors (beanFactory, this );
}
Copy 6.1 PostProcessorRegistrationDelegate#registerBeanPostProcessors(beanFactory, applicationContext)
public static void registerBeanPostProcessors (
ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class , true , false );
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class )) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class );
priorityOrderedPostProcessors.add (pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add (pp);
}
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class )) {
orderedPostProcessorNames.add (ppName);
}
else {
nonOrderedPostProcessorNames.add (ppName);
}
}
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
for (String ppName : orderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class );
orderedPostProcessors.add (pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add (pp);
}
}
sortPostProcessors(orderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
for (String ppName : nonOrderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class );
nonOrderedPostProcessors.add (pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add (pp);
}
}
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
sortPostProcessors(internalPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, internalPostProcessors);
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
Copy 总结
1.这个方法比较简单, 根据PriorityOrdered, Ordered接口排序, 并注册排序好的BeanPostProcessor, 把BeanPostProcessor实例化后添加到 AbstractBeanFactory的beanPostProcessors中, 此时一共有6个;
2.如果我们自定义了 BeanPostProcessors 也会被实例化并添加进去
3.此时BeanPostProcessor的核心方法还没有执行, 他们会在普通bean的实例化前后执行
Copy 问题解答: 1.我们自定义的BeanPostProcessor,并注册到容器中,构造器方法在什么时候执行
根据registerBeanPostProcessors方法分析我们知道:
1 .我们在@5 方法中已经将我们自定义的普通bean封装成BeanDefinition 对象, 放到beanFactory的beanDefinitionMap中, 我们在@6 .1 方法一开始就从beanDefinitionMap中获取所有BeanPostProcessor 对应的BeanDefinition 对象
2 .@6 .1 的第8 步中, 我们调用getBean()方法获取实例对象, 此时会初始化BeanPostProcessor 对象, 调用构造器方法, 这里, 我们自定义的CustomBeanPostProcessor 构造器方法被调用了
Copy 7. AbstractApplicationContext#initMessageSource()
protected void initMessageSource() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
this .messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class );
if (this .parent != null && this .messageSource instanceof HierarchicalMessageSource) {
HierarchicalMessageSource hms = (HierarchicalMessageSource) this .messageSource;
if (hms.getParentMessageSource() == null ) {
hms.setParentMessageSource(getInternalParentMessageSource());
}
}
if (logger.isTraceEnabled()) {
logger.trace("Using MessageSource [" + this .messageSource + "]" );
}
}
else {
DelegatingMessageSource dms = new DelegatingMessageSource();
dms.setParentMessageSource(getInternalParentMessageSource());
this .messageSource = dms;
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this .messageSource);
if (logger.isTraceEnabled()) {
logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this .messageSource + "]" );
}
}
}
Copy 总结 初始化MessageSource对象, 赋给beanFactory对象的messageSource属性, 同时放入到一级缓存singtonObjects中
Copy 8. AbstractApplicationContext#initApplicationEventMulticaster()
protected void initApplicationEventMulticaster() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
this .applicationEventMulticaster =
beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class );
if (logger.isTraceEnabled()) {
logger.trace("Using ApplicationEventMulticaster [" + this .applicationEventMulticaster + "]" );
}
}
else {
this .applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this .applicationEventMulticaster);
if (logger.isTraceEnabled()) {
logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
"[" + this .applicationEventMulticaster.getClass().getSimpleName() + "]" );
}
}
}
Copy 总结 跟@7 的处理类似, 初始化ApplicationEventMulticaster , 赋给beanFactory对象的applicationEventMulticaster属性, 同时放入到一级缓存singtonObjects中
Copy 9. AbstractApplicationContext#onRefresh() 跟@4 一样, 空实现, 等子类扩展
Copy 10. AbstractApplicationContext#registerListeners()
protected void registerListeners ( ) {
for (ApplicationListener <?> listener : getApplicationListeners ()) {
getApplicationEventMulticaster ().addApplicationListener (listener);
}
String [] listenerBeanNames = getBeanNamesForType (ApplicationListener .class , true , false );
for (String listenerBeanName : listenerBeanNames) {
getApplicationEventMulticaster ().addApplicationListenerBean (listenerBeanName);
}
Set <ApplicationEvent > earlyEventsToProcess = this .earlyApplicationEvents ;
this .earlyApplicationEvents = null ;
if (earlyEventsToProcess != null ) {
for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
getApplicationEventMulticaster ().multicastEvent (earlyEvent);
}
}
}
Copy 总结 这里默认是空的, 后面会补充 自定义ApplicationListenerBean
Copy 11.AbstractApplicationContext#finishBeanFactoryInitialization(beanFactory) 【核心方法】 前提
在前面的方法中, 已经:
1 .BeanFactoryPostProcessor (包括其子接口BeanDefinitionRegistryPostProcessor)、BeanPostProcessor的实体bean已经创建并初始化完成
2 .BeanFactoryPostProcessor (包括其子接口BeanDefinitionRegistryPostProcessor)的接口方法已经完成
3 .自定义的bean已经扫描完成, 创建了对应的BeanDefinition对象
Copy
protected void finishBeanFactoryInitialization (ConfigurableListableBeanFactory beanFactory ) {
if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class )) {
beanFactory.setConversionService(
beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class ));
}
if (!beanFactory.hasEmbeddedValueResolver()) {
beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
}
String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class , false , false );
for (String weaverAwareName : weaverAwareNames) {
getBean(weaverAwareName);
}
beanFactory.setTempClassLoader(null );
beanFactory.freezeConfiguration();
beanFactory.preInstantiateSingletons();
}
Copy 11.1 DefaultListableBeanFactory#preInstantiateSingletons()
public void preInstantiateSingletons () throws BeansException {
if (logger.isTraceEnabled()) {
logger.trace("Pre-instantiating singletons in " + this );
}
List<String> beanNames = new ArrayList <>(this .beanDefinitionNames);
for (String beanName : beanNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
if (isFactoryBean(beanName)) {
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
if (bean instanceof FactoryBean) {
final FactoryBean<?> factory = (FactoryBean<?>) bean;
boolean isEagerInit;
if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
((SmartFactoryBean<?>) factory)::isEagerInit,
getAccessControlContext());
}
else {
isEagerInit = (factory instanceof SmartFactoryBean &&
((SmartFactoryBean<?>) factory).isEagerInit());
}
if (isEagerInit) {
getBean(beanName);
}
}
}
else {
getBean(beanName);
}
}
}
for (String beanName : beanNames) {
Object singletonInstance = getSingleton(beanName);
if (singletonInstance instanceof SmartInitializingSingleton) {
final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
if (System.getSecurityManager() != null ) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
smartSingleton.afterSingletonsInstantiated();
return null ;
}, getAccessControlContext());
}
else {
smartSingleton.afterSingletonsInstantiated();
}
}
}
}
Copy 总结【注意:这里只讨论一般情况:非Lazy的,singleton的,非FactoryBean的,以下总结也是一样】
1 .遍历BeanDefinition
2 .调用getBean (beanName)方法, 根据name获取bean --> 这个方法尤其重要, 内部调用doGetBean (beanName, null, null, null)方法
对于已经初始化完成的bean, 从beanFactory的一级缓存中直接取出; 对于未实例化的bean, 会完成bean的整个生命周期(实例化、初始化等), 并放入到一级缓存中
3 .判断bean有没有实现SmartInitializingSingleton接口, 如果实现了, 调用它们的afterSingletonsInstantiated ()方法
Copy 11.2 AbstractBeanFactory#deGetBean【重点方法】 这个方法是创建实体Bean的方法
@SuppressWarnings("unchecked")
protected <T> T doGetBean (final String name, @Nullable final Class<T> requiredType,
@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
final String beanName = transformedBeanName(name);
Object bean;
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null ) {
if (logger.isTraceEnabled()) {
if (isSingletonCurrentlyInCreation(beanName)) {
logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
"' that is not fully initialized yet - a consequence of a circular reference" );
}
else {
logger.trace("Returning cached instance of singleton bean '" + beanName + "'" );
}
}
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null );
}
else {
if (isPrototypeCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException (beanName);
}
BeanFactory parentBeanFactory = getParentBeanFactory();
if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
String nameToLookup = originalBeanName(name);
if (parentBeanFactory instanceof AbstractBeanFactory) {
return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
nameToLookup, requiredType, args, typeCheckOnly);
}
else if (args != null ) {
return (T) parentBeanFactory.getBean(nameToLookup, args);
}
else if (requiredType != null ) {
return parentBeanFactory.getBean(nameToLookup, requiredType);
}
else {
return (T) parentBeanFactory.getBean(nameToLookup);
}
}
if (!typeCheckOnly) {
markBeanAsCreated(beanName);
}
try {
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
checkMergedBeanDefinition(mbd, beanName, args);
String[] dependsOn = mbd.getDependsOn();
if (dependsOn != null ) {
for (String dep : dependsOn) {
if (isDependent(beanName, dep)) {
throw new BeanCreationException (mbd.getResourceDescription(), beanName,
"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'" );
}
registerDependentBean(dep, beanName);
try {
getBean(dep);
}
catch (NoSuchBeanDefinitionException ex) {
throw new BeanCreationException (mbd.getResourceDescription(), beanName,
"'" + beanName + "' depends on missing bean '" + dep + "'" , ex);
}
}
}
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
destroySingleton(beanName);
throw ex;
}
});
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
else if (mbd.isPrototype()) {
Object prototypeInstance = null ;
try {
beforePrototypeCreation(beanName);
prototypeInstance = createBean(beanName, mbd, args);
}
finally {
afterPrototypeCreation(beanName);
}
bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
}
else {
String scopeName = mbd.getScope();
final Scope scope = this .scopes.get(scopeName);
if (scope == null ) {
throw new IllegalStateException ("No Scope registered for scope name '" + scopeName + "'" );
}
try {
Object scopedInstance = scope.get(beanName, () -> {
beforePrototypeCreation(beanName);
try {
return createBean(beanName, mbd, args);
}
finally {
afterPrototypeCreation(beanName);
}
});
bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
}
catch (IllegalStateException ex) {
throw new BeanCreationException (beanName, "Scope '" + scopeName + "' is not active for the current thread; consider " + "defining a scoped proxy for this bean if you intend to refer to it from a singleton" , ex);
}
}
}
catch (BeansException ex) {
cleanupAfterBeanCreationFailure(beanName);
throw ex;
}
}
if (requiredType != null && !requiredType.isInstance(bean)) {
try {
T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
if (convertedBean == null ) {
throw new BeanNotOfRequiredTypeException (name, requiredType, bean.getClass());
}
return convertedBean;
}
catch (TypeMismatchException ex) {
if (logger.isTraceEnabled()) {
logger.trace("Failed to convert bean '" + name + "' to required type '" +
ClassUtils.getQualifiedName(requiredType) + "'" , ex);
}
throw new BeanNotOfRequiredTypeException (name, requiredType, bean.getClass());
}
}
return (T) bean;
}
Copy 总结
1. 先从beanFactory的一级缓存获取一次, 从一级缓存中取出来的bean, 一开始一般取不出来
2. 判断是否在原型模式创建中, 如果是, 则抛出循环依赖异常 -- 原型模式不支持循环依赖
3. 获取当前beanFactory的父类beanFactory, 一般为空
4. 把当前beanName存储到alreadyCreated已创建集合中
5. 将当前beanName对应的bd存放到 mergedBeanDefinitions中
6. 解析@DependOn 标签
7. 调用 getSingleton (String beanName, ObjectFactory <?> singletonFactory) 方法, 完成bean的生命周期, 并放入到一级缓存中
8. 如果传了ClassType , 则需要校验
Copy 11.3 DefaultSingletonBeanRegistry#getSingleton(String beanName, ObjectFactory<?> singletonFactory)
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
Assert.notNull(beanName, "Bean name must not be null" );
synchronized (this .singletonObjects) {
Object singletonObject = this .singletonObjects.get (beanName);
if (singletonObject == null ) {
if (this .singletonsCurrentlyInDestruction) {
throw new BeanCreationNotAllowedException(beanName, "Singleton bean creation not allowed while singletons of this factory are in destruction " + "(Do not request a bean from a BeanFactory in a destroy method implementation!)" );
}
if (logger.isDebugEnabled()) {
logger.debug("Creating shared instance of singleton bean '" + beanName + "'" );
}
beforeSingletonCreation(beanName);
boolean newSingleton = false ;
boolean recordSuppressedExceptions = (this .suppressedExceptions == null );
if (recordSuppressedExceptions) {
this .suppressedExceptions = new LinkedHashSet<>();
}
try {
singletonObject = singletonFactory.getObject();
newSingleton = true ;
}
catch (IllegalStateException ex) {
singletonObject = this .singletonObjects.get (beanName);
if (singletonObject == null ) {
throw ex;
}
}
catch (BeanCreationException ex) {
if (recordSuppressedExceptions) {
for (Exception suppressedException : this .suppressedExceptions) {
ex.addRelatedCause(suppressedException);
}
}
throw ex;
}
finally {
if (recordSuppressedExceptions) {
this .suppressedExceptions = null ;
}
afterSingletonCreation(beanName);
}
if (newSingleton) {
addSingleton(beanName, singletonObject);
}
}
return singletonObject;
}
}
Copy 总结
1 .一开始还是会先从一级缓存中取, 如果取出来不为空则直接返回
2 .一级缓存中没有, 则先把当前beanName添加到 singletonsCurrentlyInCreation 【在创建过程中的单例集合】, 然后调用createBean ()完成bean的生命周期, 完成后, 从singletonsCurrentlyInCreation中移除
3 .把完成生命周期的bean放入到一级缓存中, 同时从二级缓存和三级缓存中移除
Copy 11.4 getSingleton(String beanName, boolean allowEarlyReference)
@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this .singletonObjects.get (beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
synchronized (this .singletonObjects) {
singletonObject = this .earlySingletonObjects.get (beanName);
if (singletonObject == null && allowEarlyReference) {
ObjectFactory<?> singletonFactory = this .singletonFactories.get (beanName);
if (singletonFactory != null ) {
singletonObject = singletonFactory.getObject();
this .earlySingletonObjects.put(beanName, singletonObject);
this .singletonFactories.remove(beanName);
}
}
}
}
return singletonObject;
}
Copy 总结
getSington (beanName)方法, 就是从缓存中拿实体bean
先从一级缓存中拿, 拿到直接返回; 拿不到就从二级缓存中拿, 拿到直接返回; 拿不到就从三级缓存中拿, 拿到就使用三级缓存中存放的工厂对象创建对象, 然后把自己从三级缓存中移除, 把创建的对象放入到二级缓存, 并返回; 如果都没拿到, 返回null
Copy 11.5 AbstractAutowireCapableBeanFactory#createBean()
@Override
protected Object createBean (String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
if (logger.isTraceEnabled()) {
logger.trace("Creating instance of bean '" + beanName + "'" );
}
RootBeanDefinition mbdToUse = mbd;
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null ) {
mbdToUse = new RootBeanDefinition (mbd);
mbdToUse.setBeanClass(resolvedClass);
}
try {
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException (mbdToUse.getResourceDescription(), beanName, "Validation of method overrides failed" , ex);
}
try {
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null ) {
return bean;
}
}
catch (Throwable ex) {
throw new BeanCreationException (mbdToUse.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed" , ex);
}
try {
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
if (logger.isTraceEnabled()) {
logger.trace("Finished creating instance of bean '" + beanName + "'" );
}
return beanInstance;
}
catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
throw ex;
}
catch (Throwable ex) {
throw new BeanCreationException (
mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation" , ex);
}
}
Copy 总结
1 .这里让【实现了InstantiationAwareBeanPostProcessor】的BeanPostProcessor来生成bean的代理对象, 如果有生成, 则直接返回【这是第一次使用BeanPostProcessor】
2 .如果上面没有生成, 则调用 doCreateBean (beanName, mbdToUse, args) 方法完成bean的生命周期
Copy 11.6 AbstractAutowireCapableBeanFactory#doCreateBean()【完成bean的生命周期】
protected Object doCreateBean (final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
BeanWrapper instanceWrapper = null ;
if (mbd.isSingleton()) {
instanceWrapper = this .factoryBeanInstanceCache.remove(beanName);
}
if (instanceWrapper == null ) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
final Object bean = instanceWrapper.getWrappedInstance();
Class<?> beanType = instanceWrapper.getWrappedClass();
if (beanType != NullBean.class) {
mbd.resolvedTargetType = beanType;
}
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException (mbd.getResourceDescription(), beanName, "Post-processing of merged bean definition failed" , ex);
}
mbd.postProcessed = true ;
}
}
boolean earlySingletonExposure = (mbd.isSingleton() && this .allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
if (logger.isTraceEnabled()) {
logger.trace("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references" );
}
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
Object exposedObject = bean;
try {
populateBean(beanName, mbd, instanceWrapper);
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
catch (Throwable ex) {
if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
throw (BeanCreationException) ex;
}
else {
throw new BeanCreationException (
mbd.getResourceDescription(), beanName, "Initialization of bean failed" , ex);
}
}
if (earlySingletonExposure) {
Object earlySingletonReference = getSingleton(beanName, false );
if (earlySingletonReference != null ) {
if (exposedObject == bean) {
exposedObject = earlySingletonReference;
}
else if (!this .allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
String[] dependentBeans = getDependentBeans(beanName);
Set<String> actualDependentBeans = new LinkedHashSet <>(dependentBeans.length);
for (String dependentBean : dependentBeans) {
if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
actualDependentBeans.add(dependentBean);
}
}
if (!actualDependentBeans.isEmpty()) {
throw new BeanCurrentlyInCreationException (beanName, "Bean with name '" + beanName + "' has been injected into other beans [" + StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
"] in its raw version as part of a circular reference, but has eventually been " + "wrapped. This means that said other beans do not use the final version of the " + "bean. This is often the result of over-eager type matching - consider using " + "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example." );
}
}
}
}
try {
registerDisposableBeanIfNecessary(beanName, bean, mbd);
}
catch (BeanDefinitionValidationException ex) {
throw new BeanCreationException (
mbd.getResourceDescription(), beanName, "Invalid destruction signature" , ex);
}
return exposedObject;
}
Copy 总结
doCreateBean()这个方法是狭义上的完成bean的生命周期的方法:
1. 创建对象: 使用反射的方式, 通过合适的构造器创建对象【对应的方法
2. 第三次调用BeanPostProcessor【MergedBeanDefinitionPostProcessor】, 具体作用以后再谈
3. 如果支持循环依赖, 创建对应bean对应的ObjectFactory, 并将其放入到三级缓存中!!!用以解决循环依赖问题
4. 属性注入: 注入bean的相关属性【对应的方法
5. 对象的初始化操作: 先后调用@PostConstruct 配置的方法, 如果实现InitailizingBean接口, 重写afterPropertiesSet()方法, 调用@Bean (initMethod)配置的init- method 方法【对应的方法
6. aop的实现: 【对应的方法
7. 放入beanFactory: 将完整的bean放入到一级缓存singletonObjects
Copy 11.7 AbstractAutowireCapableBeanFactory#createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
Class<?> beanClass = resolveBeanClass(mbd, beanName);
if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
}
Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
if (instanceSupplier != null ) {
return obtainFromSupplier(instanceSupplier, beanName);
}
if (mbd.getFactoryMethodName() != null ) {
return instantiateUsingFactoryMethod(beanName, mbd, args);
}
boolean resolved = false ;
boolean autowireNecessary = false ;
if (args == null ) {
synchronized (mbd.constructorArgumentLock) {
if (mbd.resolvedConstructorOrFactoryMethod != null ) {
resolved = true ;
autowireNecessary = mbd.constructorArgumentsResolved;
}
}
}
if (resolved) {
if (autowireNecessary) {
return autowireConstructor(beanName, mbd, null , null );
}
else {
return instantiateBean(beanName, mbd);
}
}
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
return autowireConstructor(beanName, mbd, ctors, args);
}
ctors = mbd.getPreferredConstructors();
if (ctors != null ) {
return autowireConstructor(beanName, mbd, ctors, null );
}
return instantiateBean(beanName, mbd);
}
Copy 总结
这个方法的主要作用:选择合适的构造器方法, 通过反射创建对应的对象
1.优先使用BeanPostProcessor获取最合适的构造器:获取所有的已排序的SmartInstantiationAwareBeanPostProcessor, 依次调用它们的determineCandidateConstructors, 获取构造器对象
2.其次选择BeanDefinition的preferedConstructor
3.以上都为空时, 使用默认的无参构造器生成对象
Copy 11.8 AbstractAutowireCapableBeanFactory#populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw)
@SuppressWarnings("deprecation")
protected void populateBean (String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
if (bw == null ) {
if (mbd.hasPropertyValues()) {
throw new BeanCreationException (
mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance" );
}
else {
return ;
}
}
boolean continueWithPropertyPopulation = true ;
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
continueWithPropertyPopulation = false ;
break ;
}
}
}
}
if (!continueWithPropertyPopulation) {
return ;
}
PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null );
if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
MutablePropertyValues newPvs = new MutablePropertyValues (pvs);
if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME) {
autowireByName(beanName, mbd, bw, newPvs);
}
if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
autowireByType(beanName, mbd, bw, newPvs);
}
pvs = newPvs;
}
boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
PropertyDescriptor[] filteredPds = null ;
if (hasInstAwareBpps) {
if (pvs == null ) {
pvs = mbd.getPropertyValues();
}
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
if (pvsToUse == null ) {
if (filteredPds == null ) {
filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
}
pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
if (pvsToUse == null ) {
return ;
}
}
pvs = pvsToUse;
}
}
}
if (needsDepCheck) {
if (filteredPds == null ) {
filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
}
checkDependencies(beanName, mbd, filteredPds, pvs);
}
if (pvs != null ) {
applyPropertyValues(beanName, mbd, bw, pvs);
}
}
Copy 总结
这个方法的主要作用: 完成属性注入
1.在属性注入之前, 先使用BeanPostProcessor, 判断是否需要属性注入
2.判断是否是自动注入还是非自动注入, 如果是非自动注入, 则使用BeanPostProcessor完成属性注入
Copy 11.9 AbstractAutowireCapableBeanFactory#initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
protected Object initializeBean (final String beanName, final Object bean, @Nullable RootBeanDefinition mbd ) {
if (System .getSecurityManager () != null ) {
AccessController .doPrivileged ((PrivilegedAction <Object >) () -> {
invokeAwareMethods (beanName, bean);
return null ;
}, getAccessControlContext ());
}
else {
invokeAwareMethods (beanName, bean);
}
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic ()) {
wrappedBean = applyBeanPostProcessorsBeforeInitialization (wrappedBean, beanName);
}
try {
invokeInitMethods (beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException (
(mbd != null ? mbd.getResourceDescription () : null ),
beanName, "Invocation of init method failed" , ex);
}
if (mbd == null || !mbd.isSynthetic ()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization (wrappedBean, beanName);
}
return wrappedBean;
}
Copy 总结
这个方法的主要作用: 在属性注入完成后, 完成生命周期的其他初始化
1. 调用部分Aware接口
2. 调用@PostConstruct 配置的方法
3. 如果实现InitailizingBean接口, 调用重写的afterPropertiesSet()方法
4. 调用@Bean(initMethod) 配置的方法
5. 使用BeanPostProcessor完成AOP
Copy 问题解答: 1.我们自定义的BeanPostProcessor, postProcessBeforeInitialization()方法、postProcessAfterInitialization()方法什么时候执行?
1 .由前面我们知道, 自定义的BeanPostProcessor的bean对象是在@6 步骤创建并初始化完成的;
2 .它们的postProcessBeforeInitialization ()方法、postProcessAfterInitialization ()方法会在创建普通bean对象时, 在普通bean对象实例化完成后, 生命周期初始化方法调用完成之后, 调用, 进行AOP, 针对于每一个普通bean
Copy BeanPostProcessor总结【非常重要】
1.第一次: 在创建bean之前, 使用【实现了InstantiationAwareBeanPostProcessor】的BeanPostProcessor来生成bean的代理对象, 如果有生成, 则直接返回
2.第二次: 如果第一次使用的过程中没有生成代理对象, 在实例化bean对象时, 使用BeanPostProcessor【SmartInstantiationAwareBeanPostProcessor】用于推断使用特殊的构造器来反射创建bean实例
3.第三次: 在实例化bean对象之后, 调用BeanPostProcessor【MergedBeanDefinitionPostProcessor】, 具体作用以后再谈
4.第四次: 如果支持循环依赖, 创建对应bean对应的ObjectFactory, 并将其放入到三级缓存中!!!用以解决循环依赖问题, 创建的ObjectFactory第四次使用BeanPostProcessor【SmartInstantiationAwareBeanPostProcessor】
5.第五、六次: 实例化完成后, 注入bean的相关属性时, 这里会第五次和第六次使用BeanPostProcessor【InstantiationAwareBeanPostProcessor】, 判断是否需要属性注入, 并完成注入
6.第七、八次: 在属性注入之后, 执行初始化方法前后, 会先后调用BeanPostProcessor, 完成AOP
以上, 在实例化bean之前, 第一次使用bdp, 生成代理对象; 如果代理对象没有生成, 在普通bean实例化时, 第二次使用bdp进行构造器推断, 实例化后第三次、第四次使用dbp, 属性注入时第五次、第六次使用bdp, 在初始化方法前后完成第七次、第八次使用bdp
Copy 12.finishRefresh()
protected void finishRefresh () {
clearResourceCaches ();
initLifecycleProcessor ();
getLifecycleProcessor ().onRefresh ();
publishEvent (new ContextRefreshedEvent(this));
LiveBeansView.registerApplicationContext (this);
}
Copy
评论