面試官:說說Spring中IoC實(shí)現(xiàn)原理?

IoC(Inversion of Control)即控制(權(quán))反轉(zhuǎn),它是一種編程思想,它的核心理念是將對(duì)象的創(chuàng)建和管理權(quán)力從對(duì)象本身轉(zhuǎn)移到外部的容器或框架。
IoC 的主要目的是降低代碼之間的耦合度,提高代碼的重用性、可測(cè)試性和靈活性。在 IoC 模式下,對(duì)象不需要自己創(chuàng)建或者查找它們所依賴的對(duì)象,這些工作由外部的容器(Spring)完成。
IoC 實(shí)現(xiàn)方式有很多種,例如依賴注入(DI)或依賴查找等,但 DI 是實(shí)現(xiàn) IoC 的一種常見實(shí)現(xiàn)方法,它通過將依賴項(xiàng)注入到對(duì)象中來實(shí)現(xiàn)控制反轉(zhuǎn)。
IoC 底層原理
Spring 中的 IoC 底層是通過工廠模式+反射實(shí)現(xiàn)的,具體來說,它的實(shí)現(xiàn)步驟是這樣的:
首先,我們通過以下代碼初始化 IoC 容器:
ApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");之后會(huì)創(chuàng)建一個(gè)工廠類,工廠類中有一個(gè)創(chuàng)建 Bean 的方法 createBean。
createBean 中首先會(huì)通過讀取配置文件,獲取到全類名,如下所示:
<beans>
<bean id="myBean" class="com.example.MyBean" />
</beans>之后通過反射,將獲取到的全類名進(jìn)行加載,創(chuàng)建對(duì)象存放到 IoC 容器中。
當(dāng)有代碼使用了 DI 時(shí),從容器中找到(根據(jù)類名或類型查找)此實(shí)例進(jìn)行使用,如下代碼所示:
@Component
public class MyBean {
@Autowired
private MyBean myBean;
public void doSomething() {
System.out.println("Bean: " + myBean);
}
}課后思考
IoC 中的工廠模式對(duì)應(yīng)了 Spring 源碼中的哪個(gè)步驟?反射的核心實(shí)現(xiàn)代碼有哪些?




































