1.DefaultListableBeanFactory(是BeanFactory 子类实现对象)
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable { @Nullable private static Class<?> javaxInjectProviderClass; private static final Map<String, Reference<DefaultListableBeanFactory>> serializableFactories; @Nullable private String serializationId; private boolean allowBeanDefinitionOverriding = true; private boolean allowEagerClassLoading = true; @Nullable private Comparator<Object> dependencyComparator; private AutowireCandidateResolver autowireCandidateResolver; private final Map<Class<?>, Object> resolvableDependencies; private final Map<String, BeanDefinition> beanDefinitionMap;
当Spring容器扫描到Bean类时 , 会把这个类的描述信息, 以包名加类名的方式存到beanDefinitionMap 中, Map<String,BeanDefinition> , 其中 String是Key , 默认是类名首字母小写 , BeanDefinition , 存的是类的定义(描述信息) , 我们通常叫BeanDefinition接口为 : bean的定义对象。
2.BeanFactoryPostProcessor(增强器接口)
可以扩展一些功能,比如:配置文件占位符替换值,还可以程序运行中去修改Bean信息
3.BeanFactory(容器根接口)
得到Bean定义信息可以反射实例化Bean对象
Constructor ctor = clazz.getDeclareConstructor(); Object obj = ctor.newInstance();
4.实例化后
5.填充属性(populateBean 方法)
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 { if (!mbd.isSynthetic() && this.hasInstantiationAwareBeanPostProcessors()) { Iterator var4 = this.getBeanPostProcessorCache().instantiationAware.iterator();
6.执行aware接口需要实现的方法
aware接口意义:方便通过spring中的bean对象来获取容器中的一些属性
7.BeanPostprocessor(接口):before(方法:可以再做一些修改工作)
8.init-method方法
9.BeanPostprocessor(接口):after(方法:可以再做一些修改工作)
AOP功能就可以在此扩展
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) { Object cacheKey = this.getCacheKey(beanClass, beanName); if (!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)) { if (this.advisedBeans.containsKey(cacheKey)) { return null; } if (this.isInfrastructureClass(beanClass) || this.shouldSkip(beanClass, beanName)) { this.advisedBeans.put(cacheKey, Boolean.FALSE); return null; } } TargetSource targetSource = this.getCustomTargetSource(beanClass, beanName); if (targetSource != null) { if (StringUtils.hasLength(beanName)) { this.targetSourcedBeans.add(beanName); } Object[] specificInterceptors = this.getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource); Object proxy = this.createProxy(beanClass, beanName, specificInterceptors, targetSource); this.proxyTypes.put(cacheKey, proxy.getClass()); return proxy; } else { return null; } } public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) { if (bean != null) { Object cacheKey = this.getCacheKey(bean.getClass(), beanName); if (this.earlyProxyReferences.remove(cacheKey) != bean) { return this.wrapIfNecessary(bean, beanName, cacheKey); } } return bean; }
//在wrapIfNecessary方法里有 Object proxy = this.createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
protected Object createProxy(Class<?> beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource) { if (this.beanFactory instanceof ConfigurableListableBeanFactory) { AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory)this.beanFactory, beanName, beanClass); } ....... ...... return proxyFactory.getProxy(this.getProxyClassLoader()); }
10.得到完整对象