JDK中的Proxy技术实现AOP功能
1.需求,用户在执行某个业务方法时我们需要对这个用户进行判断是否具有权限(或者说用户是否登录了)?
例如修改用户信息,我们在update()方法前判断当前用户user是否为null(表示没有权限或者没有登录),那么现在我们的需求如果变化了就需要再次修改代码进行判断,这种开发导致修改代码频繁代码不易维护。
那么可以使用AOP-代理对象技术
客户端在调用业务bean时并不是直接调用真正的目标对象,而是调用的代理对象,代理对象其实也是目标对象的一种实现,它具有目标对象的所有对象,客户段调用时可以执行一些方法,然后再委托给目标对象(调用目标对象的方法);
2.代理有动态代理和静态代理,现在讨论使用JDK中Proxy来实现动态代理
2.1在使用Proxy代理对象的时候,对需要代理的对象有一些要求,目标对象必须是实现了接口,及面向接口编程的。(其实就是去实现目标对象实现的所有接口)
注意:我们说对哪些方法需要拦截,这些方法我们可以称之为横切面关注点
2.2创建代理对象
那么现在我们已经可以拦截到目标对象的方法,我们可以在invoke的方法中添加自己的代码(权限判断),如果没有权限就不执行目标对象方法(不调用method.invoke())
测试
我们获取代理返回回来的值时应该使用它的接口去引用它
permission为空的时候
2.3.那么在实际的开发中我们的目标对象可能没有实现接口,那么我们就不能使用JDK的动态代理,我们可以使用第三方的实现方式(CGLIB).
测试
2.4从上面的代码中我们可以抽出一些概念
那么在这些通知的地方我们就需要我们来处理,来处理我们的业务逻辑,比如我们在service层我们可以在前置通知的地方 开启事务 在后置通知的时候提交事务 ,出现异常的时候回滚事务 在最终通知的地方释放数据库资源
3.从以上我们可以抽取出一些概念
a.我们拦截的某一个方法我们可以看作为一个切入点
b.许多切入点我们可以抽取出一个切面
c.在拦截到方法时我们在不同的地方处理的事就叫做不同的通知