提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
Spring中加载bean的几个注解的解析,分别从@Import和@ComponentScan两者对bean的导入进行分析
提示:以下是本篇文章正文内容,下面案例可供参考
一、@Import和@ComponentScan的相同点
先创建一个tiger类,在类中定义了一个方法lion,返回的对象也是lion的类型,并且将返回的对象封装的bean,在配置类中对这个类来进行加载,可以很直观的看到效果(此时的tiger添加了@Component注解)
当tiger类是bean时,配置类能够对其进行扫描并进行加载,并会加载该类中的属性,将其类名首字母转换为小写成为其id
当换用@Import注解时,也会对该类进行加载,并且会加载该类里面的属性,只是用@Import导入类时会用其所在路径作为其id
二、@Import和@ComponentScan的不同点
同样使用这个例子(注:这个tiger类未添加@Component的相关注解)
先是用@Import注解,看这个配置类中加载的bean有哪些 ,由下图可以很直观的看到,用@Import导入这个类,配置类中具有了tiger和lion两个bean
接下来换用@ComponentScan来对这个类进行扫描,看配置类中加载了哪些bean
很直观的看到,这个配置类中并未加载这两个类
总结
根据上面对两个注解的相同点和不同点进行了分析,可以得知,@Import和@ComponentScan这两个注解都能实现对bean的加载,但是@Import导入类可以要求该类可以不是bean,导入时会自动将类配置成bean,并且对该类里面的属性进行解析,这样就说明了用@Import导入类时,该类中的bean也会被加载;而@ComponentScan对包进行扫描,对扫描到的bean进行加载,由上图可以看出,tiger类即里面的bean并未被加载,原因是扫描器在扫描到该类时,发现tiger类并不是一个bean,这个就会忽略这个类,不会对该类进行加载,故该类里面的bean也不会被加载;可以抽象的理解为当扫描器扫描到该类时,扫描器无法透过该类来识别类中的属性,扫描器连看都看不到类里面的bean,又怎么谈加载呢?
以上就是@Import和@ComponentScan这两个注解在对bean加载时的区别