spring ioc和aop

本文详细介绍了Spring框架中的IoC(控制反转)和AOP(面向切面编程)核心概念及其工作原理。探讨了依赖注入(DI)机制如何在运行时动态地向对象提供所需的其他对象,同时解析了Spring AOP如何通过横向切割方式处理业务逻辑中的重复代码。此外,还深入对比了静态代理与动态代理的不同应用场景,并解释了JDK动态代理和CGLIB动态代理的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring ioc原理详解

ioc的理解

    传统方法:在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类耦合起来

ioc的思想

    所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。

DI(依赖注入)

    在系统运行中,动态的向某个对象提供它所需要的其他对象

如何注入

    通过反射机制实现,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中,最后它将这个类的实例返回给我们,我们就可以用了

aop

    将分散在各个业务逻辑中的相同代码,通过横向切割的方式抽取到一个独立的模块中,还业务逻辑类一个清新的世界。

    aop是基于动态代理实现的  

详看  spring AOP的实现原理

代理

    代理的目的:在不修改目标(被代理)对象的前提下,对目标对象功能进行扩展

静态代理

    静态代理只能代理一个具体的类,如果要代理一个接口的多个实现的话需要定义不同的代理类。所以需要动态代理

   静态代理要求代理对象和被代理对象要实现同一个接口

动态代理

    代理类继承了 Proxy 类,并实现了 ISubject 接口,由此也可以看到 JDK 动态代理为什么需要实现接口,已经继承了 Proxy是不能再继承其余类了。

其中实现了 ISubjectexecute() 方法,并通过 InvocationHandler 中的 invoke() 方法来进行调用的。

   动态代理中,代理对象不需要实现接口,被代理对象要实现接口

cglib动态代理(也叫子类代理)

    JDK的动态代理有一个限制,就是使用动态代理的对象必须要实现一个或多个接口,有时候被代理没有实现接口,那就需要Cglib代理。

    cglib代理:也叫做子类代理,他是在内存中构建一个子类对象,从而实现对目标对象功能的扩展。cglib代理是对ASM框架的封装,特点是继承于被代理类,这就要求被代理类不能被 final 修饰。

    spring AOP中的拦截器(interceptertion)用的就是cglib代理

spring AOP中的代理

  1.     如果加入容器的目标对象实现了接口,用JDK动态代理
  2.     如果目标对象没实现接口,用cglib代理






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值