1.动态代理的实现原理
在Spring中,如果想要了解AOP,就必须了解动态代理的原理,因为AOP就是基于动态代理实现的。而动态代理要从JDK说起。
在Jdk的java.lang.reflect包下有个Proxy类,它正是构造代理类的入口。在这个类中,有一个方法newProxyInstance就是创建代理对象的方法。这个方法需要三个参数,ClassLoader,用于加载代理类的Loader类,通常这个Loader和被代理的类是同一个Loader类。Interfaces,是要被代理的那些接口。InvocationHandler,就是用于执行除了被代理接口中方法之外的用户自定义的操作,他也是用户需要代理的最终目的。用户调用目标方法都被代理到InvocationHandler类中定义的唯一方法invoke中。
以上图来自其他博客,这里附上原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/
这是一个生成代理类的过程,比较清晰。。。
总结就是:代理的目的是调用目标方法时,我们可以转而执行InvocationHandler类的invoke方法,所以,如何实现在InvocationHandler上做文章就是Spring实现AOP的关键所在。
在Spring中,它又扩展了一些接口(Joinpoint,Poincut,Advice,Introduction,Target,Weaving,Proxy,Aspect),使这个AOP过程更加灵活。
Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在Spring中,这些点指的是方法,因为spring只支持方法类型的连接点。
Pointcut(切入点):就是指我们要对哪些Joinpoint进行拦截的定义。就是我们要对哪些方法进行增强。
Advice(通知/增强):指拦截到Joinpoint之后所要做的事情就是通知。
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field。
Target(目标对象):代理的目标对象
Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程
Proxy(代理):一个类被AOP织入增强后,就产生了一个结果代理类
Aspect(切面):是切入点通知(引介)的结合
2.spring中的设计模式分析
在spring中使用了很多设计模式:工厂模式、单例模式、代理模式等。
代理模式原理:
代理模式就是给某一个对象创建一个代理对象,而由这个代理对象控制对原对象的引用,而创建这个代理对象就是可以在调用原对象时增加一些额外的操作。
在代理模式结构中,
- Subject:抽象主题,它是代理对象的真实对象要实现的接口,当然这可以由多个接口组成。
- ProxySubject:代理类除了实现抽象主题定义的接口外,还必须持有所代理对象的引用
- RealSubject:被代理的类,是目标对象。
工厂模式:
通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象。
一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。
单例模式:
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为spring管理的是是任意的java对象。
核心提示点:Spring下默认的bean均为singleton,可以通过singleton=“true|false” 或者 scope=“?”来指定