以下面代码为例:
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(“classpath:application.xml”);
User user = (User) applicationContext.getBean(“user”);
user.getName();
很显然spring会读取classpath下的配置文件,然后解析配置文件中的各个标签:
当遇到<context:component-scan base-package=”com.test.app.service” />就会去扫描这个路径然后封装类的数据到BeanDefinition中,每一个bean对应一个BeanDefinition.然后封装到private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(64);这个map中.至于直接在xml中定义的bean就更简单了.如果读取<bean/>标签的内容解析并封装到BeanDefinition.然后封装到beanDefinitionMap.
然后是调用AbstractApplicationContext中的refresh()方法的finishBeanFactoryInitialization(beanFactory)这句代码.这句代码将初始化spring的所有bean放到DefaultSingletonBeanRegistry 中的private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(64);singletonObjects中,注意放到singletonObjects中的类会根据配置的切面来判断是否生成代理类,也就是放在这里面的bean如果要被拦截就会生成代理类,如果不需要被拦截就会生成普通类.
当使用这些类的时候直接从singletonObjects中获取bean。如果是spring aop的话那么就会获取代理bean然后调用反射挨个执行拦截器中的方法以及bean中的方法。