一起养成写作习惯!这是我参与「掘金日新计划 · 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类,从而就可以去创建对象了。