原理(概念)
AOP,面向切面编程,它是一种约定流程的编程方式。
什么是切面呢?
我们把在业务逻辑中一个对象的方法想象成就是一个切面,切面编程就是在这个方法的前前后后进行一些列的相关操作,比如在方法执行之前设置一个函数编写我们自定义的程序代码,或者在方法执行之后,或者在方法抛错后等等。
初学者此时可能会提出问题,既然是在方法的前后编写自定义的程序,那直接写在方法前面或者后面不就可以了么?可以,但是!这样做大大增加了代码的耦合度。我们的目的,是在方法执行之时,以这个方法执行为触发点,自动的调用我们自定义的前前后后的方法。从而实现解耦。
举个例子,我们在向数据库插入数据时,每次的执行是这样的:连接数据库>调用方法执行sql语句>关闭连接。每次都要重复的去执行连接数据库和关闭连接,这样太繁琐。这个时候,如果对"调用方法执行sql语句"这一步进行切面编程,让每次这个方法执行时,在其执行前执行一个我们自定义的方法(连接数据库),在其执行后执行一个我们自定义的方法(关闭连接),这样问题就解决了。
原理(代码)
aop是怎样实现的呢?想像一下糖葫芦。假设我们串糖葫芦时,竹签串的是没有糖衣的纯净版山楂,这时候就相当于我们系统执行了一个对象的某个方法。当我们把山楂淋上糖衣之后,糖衣相当于一个新的对象,我们再用竹签串山楂时,我们其实串的是糖衣,也就是说我们操作的是另一个对象的方法,而在糖衣当中我们又串了山楂。没错,我们就是这样在山楂这个对象方法的前前后后自定义了糖衣,我们操作的是包裹着的糖衣而不是纯净的山楂了,糖衣也就等于是山楂的代理对象了。aop就是这样利用代理对象实现的。
HelloService helloService = new HelloServiceImpl();
HelloService proxy = (HellowService) ProxyBean.getProxyBean(helloService,new MyInterceptor());
proxy.sayHello();//这时执行方法时,就会有我们说的前前后后的自定义事件了。
那ProxyBean类是怎样的呢?
public class ProxyBean implements InvocationHandler