您的位置:首页 > 编程语言 > Java开发

spring源码分析,重新认识spring三(总结,总结下 ioc 和 aop,同时提出疑惑)

2017-09-22 09:21 423 查看
        spring ioc 重要的就是 三个概念,控制反转、依赖注入、容器。

        IOC 主要就是 从前由自己去实例化对象,new 对象,现在由spring 容器来管理和产生对象,并且通过 set 方法,构造器方法设置值,没有set 方法就通过反射修改 private 属性的权限,强行赋值,主要有 set,构造器,实例工厂,静态工厂四种方式注入。由于bean 之间是相互引用的,所以他的注入思路是 先实例化好依赖链中所有的bean,然后再一个一个去注入。

      aop 就是面向切面编程,切面是什么,一个苹果切成两半,这两半就是切面,而面向切面编程主要 就是解耦和重用,把整体的局部抽离出来封装用于重复使用,由于局部抽离出来后面还需要合起来一起使用,所以需要使用接口去作为规范规定,这就是面向切面编程,而 在spring 中 实现的 技术主要是动态代理,动态代理 三个要素,一,必须 有两个角色1.代理对象,2被代理对象,二 业务场景是 被代理对象的方法必须要去调用,做但是不想直接自己去调用,三 代理对象必须持有被代理对象的引用。

主要实现是  jdk 的动态代理和cglib的动态代理

1.用jdk 的动态来实现接口的代理,主要是通过传入的接口集合去生成一个实现被代理类的接口并且继承 proxy 的代理类,在该代理类中调用 invocationHander 的invoke 方法,invoke 方法通过反射去调用被代理类的方法,这样就可以很方便的在调用前后分别加上一段逻辑。

2.用cglib 的动态代理来实现类的代理,主要是通过传入被代理类的class 去用asm 开源包去修改字节码,生成一个 继承该实现类的一个子类作为代理对象返回,调用该子类的方法的时候,该子类会 去调用 methodIntercept 的 intercept 方法,在该方法中 反射调用 父类的方法,同样可以很方便的在执行前后 分别加上一段逻辑。

思考:为什么 jdk 的动态代理不能实现 不继承 proxy 类,像cglib 一样继承 被代理类,不行吗, 不是可以达到 既可以 接口接受 又可以实现类接受。

同样 cglib 也是,为什么不能既实现类的代理又实现接口的代理,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring源码