Spring常见面试题

发布于:2025-06-15 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、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 AbstractAutowireCapableBeanFactory
		implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
@Override
	public 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(beanDefinition.getResourceDescription(), beanName,
						"Validation of bean definition failed", ex);

网站公告

今日签到

点亮在社区的每一天
去签到