Spring
AOP
1.AOP概念*(“Aspect Oriented Programming”)*
-
面向切面编程:
- 不修改源码进行功能增强
- 使用AOP的目的:对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
-
底层原理——动态代理:
无接口:使用CGLIB动态代理(使用子类)
有接口:使用JDK动态代理(使用接口)
- 创建接口,定义方法
- 创建接口实现类,实现方法
-
调用Proxy中的newProxyInstance方法:
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
-
第一参数,类加载器
-
第二参数,增强方法所在的类,这个类实现的接口(支持多个接口
-
第三参数,实现这个接口
InvocationHandler
,创建代理对象,写增强的方法
-
-
JDK实现动态代理(AOP封装):
public class ProxyDemo { public static void main(String[] args) { Class[] interfaces = {DemoDao.class}; DemoImpl dao = new DemoImpl(); //创建代理对象 DemoDao demoDao = (DemoDao) Proxy.newProxyInstance(ProxyDemo.class.getClassLoader(), interfaces, new DemoDaoProxy(dao)); demoDao.show("notnull"); } } //创建代理类 class DemoDaoProxy implements InvocationHandler { private Object obj; public DemoDaoProxy(Object obj) { this.obj = obj; } //功能增强 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("方法前执行----" + method.getName() + "传递的参数是" + Arrays.toString(args)); Object res = method.invoke(obj, args); System.out.println("方法后执行----" + obj); return res; } }
-
AOP术语
-
连接点: 类中可以被增强的方法
-
切入点: 实际被增强的方法
-
通知(增强): 实际增强的逻辑部分
-
类型:
前置通知(方法前)
后置通知(方法后)
环绕通知(方法前后)
异常通知(exception)
最终通知(finally)
-
-
切面: 把通知应用到切入点的过程
-
2.AOP操作
-
准备:
-
Spring中一般基于AspectJ实现AOP操作
- AspectJ:独立AOP框架,一般把AspectJ和Spring框架一起进行AOP操作
-
基于AspectJ实现AOP操作
- 基于xml配置文件实现
- 基于注解方式实现(使用)
-
在项目工程里面引入AOP相关依赖
-
切入点表达式
-
作用:知道对哪个类的哪个方法进行增强
-
语法结构:
execution
( [权限修饰符] [返回类型] [类全路径] [方法名称] ( [参数列表] ) )- 举例1:对com.spring.aop类中的add方法增强
execution(*com.spring.aop.add(..))
- 举例2:对com.spring.aop类中的所有方法增强
execution(*com.spring.aop.*(..))
- 举例3:对com.spring包中的所有方法增强
execution(*com.spring.*.*(..))
-
-
AOP操作(Aspect注解)
-
创建类,在类中定义方法
-
创建增强类,编写增强逻辑(用不同的方法代表不同的通知)
-
进行通知的配置
- 开启注解扫描
- 创建User和UserProxy对象
- 在增强的类上面添加注解
@Aspect
- 在Spring配置文件中开启生成代理对象
<!--开启AspectJ生成代理对象--> <!--扫描@AspectJ,生成代理对象--> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
-
配置不同类型的通知
- 在增强类的里面,在通知方法上添加通知类注解,使用切入点表达式配置
-
AOP操作(Aspect配置文件):使用aop相关标签配置切入点,切面,通知等(略)