1.什么是AOP?
- AOP意为:面向切面编程
- 是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
- AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
- 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
2.传统开发模式
当应用需要添加功能时,需要先建一个新类,然后在实现类中调用新类方法(多次修改源码):
3.AOP面向切面编程:
在运行时程序自动生成代理类,在代理类里添加删减功能,不破坏类的原有结构:
4.AOP内部原理
- JDK动态代理:
(使用接口)
public class GoodsJDKProxy {
public GoodsDao createProxy(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;
}
}
//测试类:
@Test
public void test(){
GoodsDao goodsDao = new GoodsDaoImpl();
GoodsJDKProxy goodsJDKProxy = new GoodsJDKProxy();
/*经过一系列处理,获取代理对象*/
GoodsDao proxy = goodsJDKProxy.createProxy(goodsDao);
proxy.save();
}
- Cglib动态代理
- Cglig是一个第三方开源代码库,用于生成类,动态添加类的属性以及方法
- 采用的是继承方式来产生的代理对象
- 在spring的核心包当中已经引入了cglib
public class UserDaoCglibProxy {
public UserDao createCglibProxy(UserDao userDao) {
//1.创建核心类
Enhancer enhancer = new Enhancer();
//2.设置父类,继承方式;创建一个子类,自动继承UserDao
enhancer.setSuperclass(userDao.getClass());
//3.设置回调
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//这里写自定义操作...
System.out.println("1111");
return methodProxy.invokeSuper(o,objects);
}
});
//4.创建代理对象,返回子类
UserDao obj = (UserDao)enhancer.create();
return obj;
}
}
//测试类:
@Test
public void test(){
UserDao userDao = new UserDao();
UserDaoCglibProxy userDaoCglibProxy = new UserDaoCglibProxy();
UserDao cglibProxy = userDaoCglibProxy.createCglibProxy(userDao);
cglibProxy.save();
}
5.AOP相关术语
- Joinpoint:连接点
可以被拦截到的方法,能够被增强的方法,这些方法就可以称为是连接点。
- Pointcut:切入点
真正被拦截的方法,真正被增加的方法。
- Advice:通知
增加的内容,通常都是封装成一个方法, 这个方法我们就称为通知
- Introduction:引介
类层面的增加,给原有的类添加一些新的属性方法,在开发中通常都是给方法进行增加
- Target:被增加的对象
- Weaving:织入
将通知应用到目标对象的过程
- Aspect:切面
多个通知和多个切入点的集合
- Proxy:代理对象