核心方法:AbstractApplication-->refresh()
-
在调用refresh方法之前,会实例化一个scanner(ClassPathBeanDefinitionScanner)跟reader(AnnotatedBeanDefinitionReader),实例化内部会执行AnnotationConfigUtils.registerAnnotationConfigProcessors()去注册几个基础beanDefinition,如:ConfigClassPostProcessor(扫描自定义bean,并加载成beanDefinition注册到容器中),AutowiredAnnotationBeanPostProcessor(负责自动注入)
-
invokeBeanFactoryPostProcessors(beanFactory),实例化ConfigClassPostProcessor,通过调用reader.loadBeanDefinitions()注册自定义的beanDefinition
-
registerBeanPostProcessors(beanFactory),实例化AnnotationAwareAspectJAutoProxyCreator,然后扫描带有@PointCut的类,将其中的通知方法实例化成Method对象,并封装到Advisor对象里,形成一个Advisor数组
-
initMessageSource();国际化
-
finishBeanFactoryInitialization(beanFactory);实例化所有bean实例,AnnotationAwareAspectJAutoProxyCreator会在对象实例化完成之后进行拦截,通过判断PointCut里面的表达式,判断是否要对对象进行包装并返回代理对象,包装其实就是把advisor数组注入到新生成的代理对象中,代理对象有个target引用指向真实对象