IOC和DI

IOC: 控制反转,将创建对象的控制权交给Spring容器,Spring自己去创建实例和管理实例
DI:依赖注入,对象之间的依赖关系通过IOC容器运行时动态注入。

IOC的三种注入方式

  • setter注入
  • 构造器输入
  • 注解

    AOP

    面向切面,对面向对象的补充,用于将和业务无关的但对多个对象产生影响的公共行为和逻辑抽象成一个可重用模块。
    AOP的关键在于代理模式,分为静态代理和动态代理。

    静态代理

    AspectJ,编译时增强,编译阶段产生AOP的代理类,并将AspectJ织入到Java字节码中,运行时的时候就是增江之后的AOP对象。

    动态代理

    Spring AOP采用的就是动态代理。分为JDK动态代理和Cglib动态代理。

    JDK动态代理

    只提供接口的代理,不支持类的代理,要求被代理的类实现接口。
    JDK动态代理的核心使InvocationHandler接口和Proxy类,在获取代理对象时,使用Proxy类来动态创建目标类的代理类,这个类继承Proxy接口。当调用真实对象方法时,InvocationHandler的invoke方法,通过反射,动态的将横切逻辑与业务编织在一起。

    Cglib动态代理

    代理类没有实现接口,就会使用Cglib代理。CGlib是一个代码生成类库,运行时动态生成指定类的一个子类对象,并覆盖其特定方法并添加增强代码,从而实现AOP。
    通过继承的方式做的动态代理。如果某个类被标记成final,无法使用CGLIB做动态代理。

动态代理和静态代理的区别: 生成AOP代理对象的时机不同。静态代理有更好的性能,但是AspectJ需要特定的编译处理;Spring AOP不需要。