spring ioc原理详解
ioc的理解
传统方法:在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类耦合起来
ioc的思想
所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。
DI(依赖注入)
在系统运行中,动态的向某个对象提供它所需要的其他对象
如何注入
通过反射机制实现,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中,最后它将这个类的实例返回给我们,我们就可以用了
aop
将分散在各个业务逻辑中的相同代码,通过横向切割的方式抽取到一个独立的模块中,还业务逻辑类一个清新的世界。
aop是基于动态代理实现的
代理
代理的目的:在不修改目标(被代理)对象的前提下,对目标对象功能进行扩展
静态代理
静态代理只能代理一个具体的类,如果要代理一个接口的多个实现的话需要定义不同的代理类。所以需要动态代理
静态代理要求代理对象和被代理对象要实现同一个接口
动态代理
代理类继承了 Proxy
类,并实现了 ISubject
接口,由此也可以看到 JDK 动态代理为什么需要实现接口,已经继承了 Proxy
是不能再继承其余类了。
其中实现了 ISubject
的 execute()
方法,并通过 InvocationHandler
中的 invoke()
方法来进行调用的。
动态代理中,代理对象不需要实现接口,被代理对象要实现接口
cglib动态代理(也叫子类代理)
JDK的动态代理有一个限制,就是使用动态代理的对象必须要实现一个或多个接口,有时候被代理没有实现接口,那就需要Cglib代理。
cglib代理:也叫做子类代理,他是在内存中构建一个子类对象,从而实现对目标对象功能的扩展。cglib代理是对ASM框架的封装,特点是继承于被代理类,这就要求被代理类不能被 final
修饰。
spring AOP中的拦截器(interceptertion)用的就是cglib代理
spring AOP中的代理
- 如果加入容器的目标对象实现了接口,用JDK动态代理
- 如果目标对象没实现接口,用cglib代理