探究Spring是如何解析@Bean注解的

81 阅读1分钟

前置工作

一,建demo

建了一个配置类testConfiguration配置文件,用于将配置文件里面的值注入给类giao

image.png 这是@PropertySource注解导入的配置文件

image.png 这是giao类,通过@ConfigurationProperties注解分别给giao里面的hh属性,和name属性赋值

image.png 在启动类里面从容器里面获取这两个Bean再通过get方法获取属性值

image.png 可以看到控制台打印出了两个属性值

image.png

二,开始探究

首先我们需要打断点,在哪里打断点,这个也是有讲究的,就走构造方法里面打断点就好了,再看debug里面的帧或者线程,就能知道代码是如何一步一步的走到这里来的

image.png 众所周知,启动springboot项目的时候会调用run方法,在run方法里面会调用refresh方法去刷新容器,最终会调用AbstractApplicationContext这个类里面的refresh方法去刷新容器,加载Bean,而this.invokeBeanFactoryPostProcessors这个方法就是解析@Bean注解的,

image.png 当然不限于@Bean注解,还有@ImportResource@ComponentScans注解等的解析。

image.png 可以看到,这个方法会解析项目中的每一个类,然后拿到带有@Bean注解的类,进行解析。因为项目中类太多,不能一个一个看,这个时候要使用条件断点。右键断点,输入条件"com.atguigu.gulimall.product.config.testConfiguration".equals(original.getClassName())

image.png 如图解析到了我创建的testConfiguration配置类,集合里面有两个我用@Bean注解创建的Bean

image.png

继续学习更详细的步骤中。