Spring的AOP
代理模式【结构型模式】:
-
作用,什么时候使用:
- 当一个对象需要保护的时候【保护对象】;
- 需要给对象的功能增强;
- 对象之间无法直接交互的时候;
-
角色【使用着无法察觉代理过程】:
- 目标对象;
- 代理对象;
- 目标对象和代理对象的公共接口【共同点】;
-
静态代理:
-
统计方法解决办法:
-
直接修改源代码,设计统计时间【违背OCP】;
-
使用子类继承,统计时间【子类和父类,耦合度高】;
类与类的关系:
- 泛化【is a】和关联【has a】关系
-
静态代理模式;
- 通过公共接口传递对象【降低耦合度】;
- 静态代理,一个对对象对应一个代理对象【类膨胀,不好维护】;
-
-
-
动态代理:
- 动态的生成技术:在内存中动态生成代理类【运行阶段】;
- JDK动态代理类【基于接口代理】;
- CGLIB动态代理【基于继承代理,可以代理接口和类,不能代理final类,原理和继承的一致】;
- javassist动态代理;
-
JDK基于接口的动态代理;
OrderSerice proxyObj = (OrderSerice)Proxy.newProxyInstance(orderSericeImpl.getClass().getClassLoader(), orderSericeImpl.getClass().getInterfaces(), new TimerInvocationHandler());- 参数1:代理对象的类加载器,在内存中生成的class文件,也要又类加载器进行加载到jvm中;
- 参数2:代理对象和代理共有的接口;
- 参数3:调用处理器接口实例化对象【实现增强的代码逻辑,结构】,仅当代理调用代理方法的时候,会在底层调用invoke方法;
-
基于CGlib的代理,功能更强;
- 类的class对象,方法拦截接口的实现实例化,创建代理对象
Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(OrderSericeImpl.class); enhancer.setCallback(new TimerMethodInterceptor()); OrderSericeImpl cjlibProxy =(OrderSericeImpl)enhancer.create(); cjlibProxy.detail(); -
AOP,面向切面编程【编程思想,编程技术 】;
-
固定不变的,和业务逻辑无关的交叉业务
-
竖向业务核心,横向是交叉业务【日志,安全,事务等】;
-
将交叉业务提取出来,形成横向的切面;
-
AOP思想:将与核心业务模块无关的代码独立抽取出来,形成一个组件,然后以横向的方法应用到业务流程中去;
- 代码复用强;
- 可维护;
- 更好的关注业务逻辑;
-
Spring中的AOP是使用动态代理:JDK和CGLIB动态代理技术,如果是使用接口代理,默认使用JDK,如果类没有实现接口则会切换为CGLIB:
-
AOP术语:
-
连接点【JoinPoint】:可能织入切面的位置【位置】;
-
切点【PointCut】:类中真正织入的方法【方法】;
-
通知【Advice】:通知又叫增强,是具体增强的代码【代码】;
- 根据增强放在连接点的位置有:前置,后置,环绕,异常,最终
-
切面:切点 + 通知就是切面【等效实现处理器接口对象】;
-
织入:把通知应用到目标对象上的过程【动作】;
-
代理对象;
-
目标对象;
-
切点表达式:匹配切点;
execution([访问修饰符]返回值类型[全限定类名]方法名(形式参数列表)[异常])- 返回值类型:*,返回任意类型;
- 全限定类名:..,代表当前包及其子包下所有类,省略时,所有类;
- 方法名:*,所有方法,set*,表示所有set方法;
- 参数方法:..,参数类型和个数任意,*只有一个参数方法,(*,String),第一个参数随意;
-
-
-
Spring的AOP实现:
- Spring + AspectJ:基于注解,
- 切面顺序:@Order(number),数字越小,优先级越高;
- Spring + AspectJ:基于xml;
- Spring自己实现AOP,基于xml配置【舍】;
- 事务:注解式,和声明式;
- 安全日志;
- Spring + AspectJ:基于注解,
-
Spring的事务,在AOP的基础上再进行封装【二次封装】;
- 编程式事务;
- 声明式事务
- 基于注解
- 基于xml配置;
- 事务的属性:
- Propagation:传播特性【两个方法的事务】
- Requiered:有就加入,没有就新建事务【默认】;
- Supportts:有就加入,没有就不管了;
- Mandatory:有就加入,没有就抛异常;
- Requied_new:不管有没有,开启新事务【不存在嵌套关系,独立】;
- Not_supported:不支持事务,已有的,挂起;
- Never:不支持事务,有就抛异常;
- Nested:有事务就嵌套,没有就新建;
- 事务的关系【串行关系】,决定了事务的回滚和提交;
- 事务的隔离【并行关系】,决定事务的并发关系;
- 脏读【读到未提交事务中的数据】,可不重复读【在同一个事务中,每次读的数据不一样【数据修改】】,幻读【同一个事务中,每次读取的数据量不一样】
- 事务超时【秒为单位】:
- 超过时间后,事务中的DML语句没有执行完毕的话,会执行回滚。
- 时间是:到最后一条DML语句执行之后的时间。
- 最后一条DML语句后的业务逻辑,不算有效时间;
- 超过时间后,事务中的DML语句没有执行完毕的话,会执行回滚。
- 只读事务:【没有增删改,只有slect】;
- 启动spring的优化策略,提高select的执行效率;
- 设置选择性异常回滚;
- Propagation:传播特性【两个方法的事务】

浙公网安备 33010602011771号