Spring DI依赖注入
依赖注入(DI)和控制反转(IOC)分别是什么?二者有什么区别?
依赖注入(DI): 假如有A和B俩个不同的类,A依赖与B,A中有一个方法使用到了B,就将对象B注入到A中,依赖注入就是程序运行过程中,如果遇到一个对象需要另一个对象协助时,不用代码中创建调用者,通过依赖与外部的注入来完成。
控制反转(IOC): 控制反转时Spring的核心,所有的类都会在Spring的容器来登记,来告诉Spring你是个什么东西,需要什么东西,然后Spring会在系统运行到适当的时候,把你需要的东西主动交给你,同时也把你交给需要你的东西。所有的类的创建,销毁都是由Spring来控制。对于某个具体的对象而言,以前是它控制对象,现在是所有对象都被Spring控制,程序中的之间的关系,不用代码来控制,而是完全是由容器来控制。
依赖注入和控制反转的区别: 他们都降低了代码的耦合度,依赖注入要依赖与控制反转的容器,应用程序需要控制反转容器来提供外部需要的资源。依赖注入强调关系的注入是由容器运行时完成的,而控制反转强调关系是由容器控制。
DI和直接实例化一个对象有什么区别?
本质上都是创建对象,没有区别。在类一多区别就体现出来了。例如A依赖B, B依赖C, C依赖D。要创建A, 用new就废了,b,c,d先new一遍再new a。用IOC就快多了,A(B b),其他自动创建,是不是快多了?尤其是在很多类又用了很多包的时候。
还有一个生命周期管理。
创建应用组件之间协作的行为通常称为装配(wiring)
Spring装配机制
-
在XML中进行显式配置。
-
在Java中进行显式配置。
-
隐式的bean发现机制和自动装配。
Spring自动装配
-
组件扫描(component scanning):Spring会自动发现应用上下文中所创建的bean。
-
自动装配(autowiring):Spring自动满足bean之间的依赖
@Component注解。这个简单的注解表明该类会作为组件类
作用域
-
单例(Singleton):在整个应用中,只创建bean的一个实例。
-
原型(Prototype):每次注入或者通过Spring应用上下文获取的 时候,都会创建一个新的bean实例。
-
会话(Session):在Web应用中,为每个会话创建一个bean实例。
-
请求(Rquest):在Web应用中,为每个请求创建一个bean实例。