AOP简介
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
开发存在 的问题


JDK动态代理
package com.itlike.demo1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class GoodsJDKProxy {
public GoodsDao createProxy(GoodsDao goodsDao) {
// 增强代码 使用JDK动态代理
GoodsDao goodsDaoProxy = (GoodsDao) Proxy.newProxyInstance(
goodsDao.getClass().getClassLoader(),// 加载对象
goodsDao.getClass().getInterfaces(),// 接口
new InvocationHandler() { // 匿名内部类
/* 当调用对象的使用所以的方法都会来到这里 */
@Override // 这个方法并不是立即执行 ,而是当代理对象里面的 方法执行时才会来到invoke
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/* 当前代理对象方法到这里时执行 */
if("save".equals(method.getName())){
System.out.println("权限校验---进行做处理"); // 假如是一个功能
GoodsDao goodsDao1 = (GoodsDao) method.invoke(goodsDao, args); // 获取到代理对象
System.out.println("日志添加");
return goodsDao1; // 返回代理对象
}
return method.invoke(goodsDao, args);
}// 回调
});
/* 当代理对象里面的方法执行的时候就会来到 回调 */
return goodsDaoProxy;
}
}
cglib动态代理
package com.itlike.demo1;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class UserDaoCglibProxy implements MethodInterceptor {
public UserDao createCglibProxy(UserDao userdao){
// 1.创建核心类
Enhancer enhancer = new Enhancer();
// 2.设置父类 使用的是继承的方式 创建一个子类,自动的继承 userDao
enhancer.setSuperclass(userdao.getClass());// 创建出来的类继承谁
// 3.设置回调
enhancer.setCallback(this);
// 4.创建代理对象 就是把子类给你
UserDao obj = (UserDao) enhancer.create();
return obj;
};
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
if("save".equals(method.getName())){
System.out.println("权限----------");
return methodProxy.invokeSuper(o, objects);
}
return methodProxy.invokeSuper(o, objects);
}
}
Cglig是一个第三方开源代码 生成类库,动态添加类的属性和方法。在spring的核心包当中已经引入了cglib

Spring的AOP简介 AOP思想最早是由AOP联盟组织提出的 Spring使用这种思想最好的框架 AspectJ Spring的AOP有自己的实现方式,但是这种方式非常繁琐 AspectJ 是一个AOP的框架 Spring放弃了自己传统的方式 ,引入AspectJ作为自身AOP的开发
网友评论