Java-IOC小结

IOC:控制反转,将原先程序员自己创建对象的权利交给Spring去管理了。

DI:依赖注入,Spring框架对IOC的具体实现。

BeanDifinition容器:可简单看作一个Map,key=对象唯一标识id,value=bean定义对象(类全路径等信息)。

ApplicationContext容器:Spring上下文

我们只需要在框架约定的地方表达哪些类需要被管理,使用的时候从容器中拿就好了。

约定:约定xml配置文件中,;

           对应类上加@Component等注解。

spring框架会从这些约定的地方获取两个重要的信息,1-需要生成的对象唯一标识id;2-对应类全路径。

通过唯一标识id判断去重放入BeanDifinition容器中,保证Spring中对象的单例性。

调用getBean()方法获取对象时,才开始利用java反射技术生成对象,如果有依赖对象,则会递归调用getBean()方法完成依赖注入,存放到ApplicationContext容器中。

问题:为何不在加载bean信息的时候就创建对象放入ApplicationContext容器中?

因为加载bean信息的时候,beanA要依赖的beanB还没有被读取加载,是不能创建beanA对象的。

问题:Spring ioc过程中,A依赖于B,B依赖于A。如何解决循环依赖?

Spring创建A对象时,发现要依赖B对象,则会先生成一个早期引用A(指刚创建好的对象,但还未填充属性,地址值是一样的),然后去创建对象B,对象B依赖的对象A使用早期引用A完成,然后再通过实例化后的B完成对象A的实例化。

你可能感兴趣的:(我套你个猴子的java)