Bean的生命周期底层原理

50 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

1、入门级Spring代码

//构造一个ClassPathXmlApplicationContext对象
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
//调用 ClassPathXmlApplicationContext 的 getBean方法,得到一个UserService对象
UserService userService = (UserService) context.getBean("userService");
userService.test();

在springboot中,ClassPathXmlApplicationContext被抛弃,换成了AnnotationConfigApplicationContext,不过作用类似。

2、Spring中是如何创建一个对象?

context.getBean("userService")时,就会创建一个对象,但是getBean() 内部如何知道"userService"对应的是UserService类呢?

2.1 解析spring.xml得到扫描路径

2.2 遍历扫描到的路径

遍历扫描路径下的所有Java类,如果发现某个类上存在@Component、 @Service等注解,那么Spring就把这个类记录下来,存在一个Map中,比如Map<String, Class>。 在spring源码中,这个Map叫BeanDefinitionMap

2.3 按照规则生成对应的beanName

Spring会根据某个规则生成当前类对应的beanName,作为key存入Map,当前类作为value。

通过以上的 2.1-2.3,context.getBean("userService")时,就可以根据"userService"找到 UserService类,从而就可以去创建对象了。