AOP-面向切面编程
什么是AOP,为什么要学习AOP
- 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
- oop面向对象编程,aop是oop的延伸和扩展
- 在不修改源码的情况下,对程序进行增强
AOP的相关术语:
AOP底层实现原理
假设对Dao类中的save方法进行增强。
编写Dao 类和Dao的impl类():增删改查
编写一个类MyJdkProxy implement InvokeHandle
public class MyJdkProxy implements InvocationHandler { private UserDao userDao; public MyJdkProxy(UserDao userDao) { this.userDao = userDao; } public Object createProxy() { Object proxy = Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(),this); return proxy; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if("save".equals(method.getName())) { System.out.println("权限校验"); return method.invoke(userDao,args); } return method.invoke(userDao,args); } }
其中重写的invoke方法中写相关加强代码,return method.invoke(userdao)返回的原方法
在测试类中,调用MyJdkProxy中的createProxy方法,并用代理类执行userdao中的相关方法
public void demo1() { UserDao userDao = new UserDaoImpl(); UserDao proxy = (UserDao)new MyJdkProxy(userDao).createProxy(); proxy.save(); proxy.delete(); proxy.find(); proxy.update(); }
使用Cglib生成代理
1.动态代理有两种:JDK代理和Cglib代理,默认JDK代理
JDK代理:要代理的类需要实现接口类
cglib代理:代理类不需要实现接口,也可以增强;
代理知识总结
1.Spring AOP的底层就是使用的JDK的动态代理或者Cglib的动态代理为目标bean执行横向织入。
- 若目标对象实现了若干接口,那么spring用JDK的动态代理实现。
- 若目标对象没有实现任何接口,那么spring使用cglib生成目标对象的子类。
2.程序中应优先对接口创建代理,便于程序解耦维护。
- 标记为final的方法,不能被代理,因为无法进行覆盖
- spring 只支持方法连接点,不提供属性连接点