什么是AOP?
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程
通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
什么是AspectJ?
Spring的AOP有自己的实现方式,但是这种方式非常繁琐。AspectJ 是一个AOP的框架,Spring放弃了自己传统的方式 ,引入AspectJ作为自身AOP的开发
传统开发中存在的问题
传统开发采用的是纵向继承,而AOP采用的是很像抽取机制。在不破坏原来的类,生成一个代理类,在原来的类的基础上进行扩展增强,可以随时添加、取消功能。
JDK动态代理(必须要有接口)
public class GoodsDaoImpl implements GoodsDao {
@Override
public void save() {
System.out.println("保存操作");
}
}
public class GoodsJdkProxy {
public GoodsDao creatProxy(GoodsDao goodsDao){
// 增强
GoodsDao goodsDaoProxy = (GoodsDao) Proxy.newProxyInstance(goodsDao.getClass().getClassLoader(), goodsDao.getClass().getInterfaces(), new InvocationHandler() {
@Override
/** 当调用对象的时候,所有方法都会来到这里 */
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("invoke");
return method.invoke(goodsDao, args);
}
});
return goodsDaoProxy;
}
}
public class GoodsDaoTest {
@Test
public void test(){
GoodsDao goodsDao = new GoodsDaoImpl();
GoodsJdkProxy goodsJdkProxy = new GoodsJdkProxy();
GoodsDao proxy = goodsJdkProxy.creatProxy(goodsDao);
proxy.save();
}
}
cglib动态代理
Cglig是一个第三方开源代码 生成类库,动态添加类的属性和方法。在spring的核心包当中已经引入了cglib,采用的是继承方式来产生的代理对象。
public class UserDao {
public void save(){
System.out.println("保存!");
}
}
public class UserDaoCglibProxy implements MethodInterceptor {
public UserDao createCglibProxy(UserDao userDao){
// 创建核心类
Enhancer enhancer = new Enhancer();
// 设置父类 - 创建一个子类,自动继承自UserDao
enhancer.setSuperclass(userDao.getClass());
// 设置回调
enhancer.setCallback(this);
// 创建代理对象 - 就是把子类给你
UserDao o = (UserDao) enhancer.create();
return o;
}
@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);
}
}
public class UserDaoTest {
@Test
public void test(){
UserDao userDao = new UserDao();
UserDaoCglibProxy userDaoCglibProxy = new UserDaoCglibProxy();
UserDao cglibProxy = userDaoCglibProxy.createCglibProxy(userDao);
cglibProxy.save();
}
}
AOP相关术语
①Joinpoint:连接点
可以被拦截到的方法,即能够被增强的方法,这些方法就称为连接点
②Pointcut:通知
增强的内容,通常就封装在一个方法里,这个方法就称为通知
③ Introduction:引介
是类层面上的增强,给原有的类里添加一些新的属性、方法,在开发中通常是给方法进行增强
④Target:被增强的对象
⑤Weaving:织入
将通知应用到目标对象的过程
⑥Proxy:代理对象
⑦Aspect:切面
多个通知和多个切入点的集合