spring源码分析笔记(5) 一些零碎的理解
写博客是因为之前本地的笔记老是容易丢失,所以现在抽空把能找到的搬运到博客上,也是为了日后便于查看。个人理解,很可能有错误,有看到的就抱着批判的态度来看
理解一
加了@Configuration注解的,就setAttribute(“configurationClass”,“full”),为全配置类;
没加@Configuration,不是接口,加了@Component,@ComponentScan,@Import,@ImportResource任意一种的,或者内部有@Bean的,就setAttribute(“configurationClass”,“lite”)
理解二
动态代理:jdk和cglib,从文件中读取类文件,再进行解析
jdk:
jdk动态代理要求目标类实现一个接口,然后在代理类中用set或者construct方法注入目标类属性,并对目标类的方法进行修改和增强。(这就要求jdk动态代理目标类必须是实现某个接口,jdk动态代理是代理对象)
cglib:
cblib动态代理的原理是代理类继承目标类,并重写目标类的方法,从而实现对目标类方法的修改和增强,对目标类没有要求,所有类都可以被代理。(cdlib是对类代理,不需要new对象)
理解三
总结:spring的循环依赖,不支持原型,不支持构造方法注入的bean。
个人理解:(应该是错误的,抽空再修改,先放在这里)
如果构造方法注入bean,使用构造方法创建bean的时候,参数中的bean还没有,此时还没有走到getBean()方法,所以构造方法中的参数bean无法获取,导致无法创建当前bean。
所以应该使用没被循环引用的构造方法创建对象,然后在populateBean方法中再注入属性,此方法内部可以调用getBean方法,可以完成循环依赖。
可以在构造方法上加@Autowried,推断构造的时候就会推断出这个构造,就可以强制使用这个构造方法来创建bean了。