Spring生命周期及关联面试题
一、springbean的生命周期?
阶段 | 核心接口和实现类 | 详细步骤和描述 |
1、读取并解析配置元信息到BeanDefinition | BeanDefinitionReader—>XmlBeanDefinitionReader #loadBeanDefinitions()读取的源: | XML配置bean |
注解声明的bean | ||
package扫描、classpath、Groovy文件、properties文件 | ||
BeanDefinition->GenericBeanDefinition | 存储bean的定义信息 | |
2、BeanDefinition注册 | BeanDefinitionRegistry->DefaultListableBeanFactory#registerBeanDefinition() | 存入DefaultListableBeanFactory的beanDefinitionMap<String,BeanDefinition> |
3、bean实例化 | 1、AbstractBeanFactory#getMergedLocalBeanDefinition() | 1、BeanDefinition合并; 2、加载bean对应的class类; |
1、读取配置源到BeanDefinition
1)具体源码见:
Spring源码-读取XML文件配置信息-CSDN博客文章浏览阅读176次。4、parseBeanDefinitionElement()方法:解析到BeanDefinitionHolder,BeanDefinitionHolder.getBeanDefinition()就得到BeanDefinition。3、registerBeanDefinitions方法调用parseBeanDefinitions方法进行bean标签doc元素解析。2、doLoadBeanDefinitions()方法:1)读取到Doc里面;2)解析Doc注册为BeanDefinition。https://blog.csdn.net/qq_19952029/article/details/140500505
2)从XML源构建BeanDefinition示例:
/*** xml方式bean配置信息解析*/
@Test
public void test1() {//定义一个spring容器,这个容器默认实现了BeanDefinitionRegistry,所以本身就是一个bean注册器DefaultListableBeanFactory factory = new DefaultListableBeanFactory();//定义一个xml的BeanDefinition读取器,需要传递一个BeanDefinitionRegistry(bean注册器)对象XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(factory);//指定bean xml配置文件的位置String location = "classpath:/com/javacode2018/lesson002/demo2/beans.xml";//通过XmlBeanDefinitionReader加载bean xml文件,然后将解析产生的BeanDefinition注册到容器容器中int countBean = xmlBeanDefinitionReader.loadBeanDefinitions(location);System.out.println(String.format("共注册了 %s 个bean", countBean));//打印出注册的bean的配置信息for (String beanName : factory.getBeanDefinitionNames()) {//通过名称从容器中获取对应的BeanDefinition信息BeanDefinition beanDefinition = factory.getBeanDefinition(beanName);//获取BeanDefinition具体使用的是哪个类String beanDefinitionClassName = beanDefinition.getClass().getName();//通过名称获取bean对象Object bean = factory.getBean(beanName);//打印输出System.out.println(beanName + ":");System.out.println(" beanDefinitionClassName:" + beanDefinitionClassName);System.out.println(" beanDefinition:" + beanDefinition);System.out.println(" bean:" + bean);}
}
2、BeanDefinition注册
1)注册器BeanDefinitionRegistry接口的唯一实现类:DefaultListableBeanFactory
2)将BeanDefinition放到beanDefinitionMap。
@SuppressWarnings("serial")
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
@Overridepublic void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {Assert.hasText(beanName, "Bean name must not be empty");Assert.notNull(beanDefinition, "BeanDefinition must not be null");if (beanDefinition instanceof AbstractBeanDefinition) {try {((AbstractBeanDefinition) beanDefinition).validate();}catch (BeanDefinitionValidationException ex) {throw new BeanDefinitionStoreException(beanDe