什么是动态代理?
动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。可以理解为运行期间,对象中方法的动态拦截,在拦截方法的前后执行功能操作。
代理类在程序运行期间,创建的代理对象称之为动态代理对象。这种情况下,创建的代理对象,并不是事先在Java代码中定义好的。而是在运行期间,根据我们在动态代理对象中的“指示”,动态生成的。也就是说,你想获取哪个对象的代理,动态代理就会为你动态的生成这个对象的代理对象。动态代理可以对被代理对象的方法进行功能增强。有了动态代理的技术,那么就可以在不修改方法源码的情况下,增强被代理对象的方法的功能,在方法执行前后做任何你想做的事情。
二、为什么使用动态代理?
请看如下例子:一个演员cxk的本质工作是唱歌,跳舞等,但是演出前后为了吸引粉丝和大量的关注就需要进行各种业务的增强,如:联系业务、互联网造势、演出前的宣传、结算费用并纳税等一系列的操作。所以就用到了动态代理,我们可以把这个代理看成是经纪公司。
这样操作发现出现了大量重复的代码,如果有十个、一百个演员需要同样的处理那么代码需要重复十次、一百次。当然我们可以把这些功能封装成一个增强方法,然后在功能方法中进行调用,但是也出现了方法的十处、一百处的调用操作,一旦增强方法名字改变,就需要完成所有调用处代码的修改。或者有一天不需要这些增强操作了,就再次需要在这十处、一百处删除方法调用。所以这种操作不适用于大型的项目开发的需求,此时我们就必须使用Java的动态代理机制。
动态代理不需要修改源代码的基础上对原有类的功能进行增强。
在Java开发中如果一个类中的方法在基本功能之外需要进行功能扩充或者功能增强,如:事务控制、权限判断、日志记录等等操作,此时可以使用动态代理机制。
Java的JDK中Proxy类可以实现基于接口的动态代理,实现步骤示例如下:
三、如何使用动态代理:
1/因为Proxy类必须基于接口进行动态代理,所以首先创建接口,定义接口的规范,即功能方法的定义。
2.定义实现接口的子类,实现接口定义的方法,此方法只需要把核心功能实现即可,其他增强的操作可以在代理类中实现。
3.定义代理类,在代理类中对被代理对象进行方法增强
运行结果:
AOP
一、对AOP的初印象
二、什么是AOP?
在软件业,AOP为Aspect Oriented Programming的缩写,意为: 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术,AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
首先先给出一段比较专业的术语(来自百度):
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方
式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个
热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑
的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高
了开发的效率。
二、AOP基于XML配置的入门案例:
- 首先导入IOC和AOP所需要的jar包
- 创建BookService类,这个类完成核心功能操作。
3.创建Loger类,这个类是用来做功能的增强。
4.在spring的beans.xml中开始进行AOP的配置 :
首先把核心类和增强类的bean配置到IOC的容器中
使用<aop:config>标签在进行AOP的配置,先通过aop:aspect标签标明谁是增强类。然后在标签中进行aop:before(前置)、aop:after-returning(后置)、aop:after-throwing(异常)、aop:after(最终)的配置,让增强类的某个方法对核心功能类的某一类方法进行功能增强。
5.在测试类中测试
环绕通知
1.环绕通知是一种提供自由灵活对核心类方法进行增强的操作手段,首先还是在beans.xml中配置环绕通知。
2.接着我们需要在增强类中完善我们环绕通知的方法,这个方法需要定义一个ProceedingJoinPoint接口对象作为方法参数,且方法返回值是Object。
环绕通知的实现:其实就是通过ProceedingJoinPoint的实现类对象(spring框架会创建)获取要增强的那个类的方法参数、执行方法、获得方法返回值。然后在方法执行之前的操作就是前置通知、在方法执行后的操作就是后置通知、在异常处理中的操作就是异常通知、在finally中执行的操作就是最终通知。具体如下
基于注解的AOP配置
1.首先跟之前的步骤一样
2.首先关于定义IOC容器的bean标签使用注解替换。
3xml配置的切面配置信息我们在增强类中使用@Aspect注解替代
4 xml配置切入点的前置通知、后置通知、异常通知、最终通知分别使用@Before、@AfterReturning、@AfterThrowing、@After这四个注解替代,同时在注解中定义要增强那个包中那个类的那个方法,且使用表达式表示。
- 5 在beans.xml中配置注解的扫描,同时配置开启aop注解的支持。
- 6 在测试类中测试注解配置的操作是否生效。