Spring2

Spring AOP:
AOP:Aspect Oriented Programming 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的同意维护的一种技术.
主要功能:日志记录,性能统计,安全控制,事务处理,异常处理
主要意图:将以上代码从业务逻辑中抽取出来
AOP和OOP的区别:
OOP:面向对象编程,针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分
AOP:针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果
OOD/OOP面向名词领域,AOP面向动词领域
相关术语:
目标对象 target:【***】
被增强的对象
连接点 join point
目标对象的方法
切入点 pointcut 【***】
被拦截的连接点
通知 advice 【***】
增强业务
引介 introduction
特殊通知,在不修改代码的前提下,在运行期动态添加方法或属性
切面 aspect 【***】
切入点+通知
织入 
创建出代理对象的过程
代理 proxy 【***】
代理类
Spring的AOP为动态AOP,实现技术为:JDK提供的动态代理和CGLIB(动态字节码增强技术) 【****】


JDK的动态代理:
Object object = Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h);

CGLIB的动态代理:
使用前提:
导入cglib的jar包和asm相关的jar包,而Spring框架的spring-core.jar集成了cglib和asm.
使用:
//1.创建Enhancer
Enhancer enhancer = new Enhancer();
//2.传递目标对象的CLass
enhancer.setSuperclass(target.getClass);
//3.设置回调操作
enhancer.setCallback(callback);
-->传递的是Callback的子接口MethodInterceptor
return enhancer.create();

Spring采用的是哪一种动态机制:【*****】
如果目标对象有接口,优先使用jdk的动态代理,基于接口
如果目标对象无接口,优先使用cglib动态代理,基于继承

Spring的Aop编程:
1、传统AOP编程:
支持的增强(advice):
1.前置通知  目标方法执行前增强  org.springframework.aop.MethodBeforeAdvice
2.后置通知  目标方法执行后增强 org.springframework.aop.AfterReturningAdvice
3.环绕通知  目标方法执行前后进行增强  org.aopalliance.intercept.MethodInterceptor
4.异常抛出通知 目标方法抛出异常后的增强 org.springframework.aop.ThrowsAdvice
5.引介通知 在目标类中添加一些新的方法或属性(了解)org.springframework.aop.IntroductionInterceptor
基本jar包:
bena/core/context/expression/aop/aop联盟依赖jar包
配置:
<!-- 目标targrt -->
<bean id="目标" class="">
<!-- 通知advice -->
<bean id="通知" class="">
<!-- 切点pointcut -->
<bean id="切点" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedNames">
<list>
<value>增强的方法名</value>
...
<list>
</property>
</bean>

<bean id="切点" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern" value="正则表达式指定增强的方法"></property>
</bean>
<!-- 切面 -->
<bean id="切面" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="通知"></property>
<property name="pointcut" ref="切点"></property>
</bean>
<!-- 代理proxy -->
<bean id="代理" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="目标"></property>
<property name="interceptorNames" value="切面"></property>
<property name="proxyInterfaces" value="实现的接口的全路径"></property>
</bean>

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"></bean> <!-- 自动代理 -->
2、基于aspectj切点传统开发:
前提条件:
在核心配置文件中导入aop的声明
使用aspectj的切面声明方式,需要导入aspectj的jar包-->com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
配置:
<!-- 目标targrt -->
<bean id="目标" class="">
<!-- 通知advice -->
<bean id="通知" class="">
<!-- 切面与切点的声明 -->
<aop:config> <!-- 自动代理 -->
<!-- 切点 -->
<aop:pointcut expression="切点表达式" id="切点名"/>
<!-- 切面 -->
<aop:advisor advice-ref="通知" pointcut-ref="切点名"/>
</aop:config>
切点表达式:
常用:
execution(pubic * *(..))所有public方法
execution(* com.yyy.xxx..*.*(..))所有xxx包及其子包下的索引类的方法
execution(* com.yyy.xxx.zzz.*(..))zzz接口的所有方法
execution(* com.yyy.xxx.zzz+.*(..))zzz接口的实现类的所有方法
execution(* save*(..))save开头的方法
3、Spring整合sqpectj框架实现aop
aspectj定义的通知类型:
前置通知 before
后置通知 afterReturning
环绕通知 around
抛出异常通知 afterThrowing
引介通知 declareParents
最终通知 after
配置:
<!-- 目标targrt -->
<bean id="目标" class="">
<!-- 通知advice -->
<bean id="通知" class="">
<!-- 切面与切点的声明 -->
<aop:config proxy-target-class="true/false"> <!-- 自动代理 -->
<aop:aspect ref="通知"> <!-- 配置切面 -->
<aop:pointcut expression="切点表达式" id="pointCut"/>
<aop:before method="before" pointcut-ref="pointCut"/>
<aop:after-returning method="afterReturning" pointcut-ref="pointCut" returning="返回值名"/>
<aop:around method="around" pointcut-ref="pointCut"/>
<aop:after-throwing method="afterThrowing" pointcut-ref="pointCut" throwing="异常名"/>
<aop:after method="after" pointcut-ref="pointCut"/>
</aop:aspect>
</aop:config>
关于通知上的参数:
1、前置通知的参数:
JoinPoint jp-->获取目标相关的信息
-->拦截目标类:jp.getSignature().getDeclaringTypeName()
-->拉结方法:jp.getSignature.getName();
-->完成日志记录,权限控制
2、后置通知的参数:
JoinPoint jp-->
Object val-->目标方法的返回值,需要在配置文件上配置returning="val"
3、环绕通知的参数:
ProceedingJoinPoint pjp-->执行目标行为
-->Object value = pjp.proceed();
-->日志操作,权限操作,性能监控,事务管理
4、抛出异常通知的参数:
JoinPoint jp-->
Throwable ex-->接收抛出的异常,需要在配置文件上配置throwing="ex"
5、最终通知上的参数:
JoinPoint-->
-->可以完成资源释放
关于代理的选择:
配置:
<aop:config proxy-target-class="true/false">
-->false为默认值,
-->配置true表示始终使用cglib代理
4、基于annotation的aop实现
前提条件:
需要配置注解的配置:
<context:component-scan base-packafe="扫描的包"/>
需要配置开启sapectj注解自动代理:
<aop:aspect-autoproxy/>
编写增强:
在类上:
@Comonent
@Aspect //声明当前类就是一个切面
前置通知:
@Before(切点表达式)
后置通知
@AfterReturning(value="切点表达式",retruning="返回值名")
环绕通知:
@Around("切点表达式")
异常抛出通知:
@AfterThrowing(value="切点表达式",throwing="抛出异常名")
z最终通知:
@After("切点表达式")
-->注解定义切点:
@Point("切点表达式")
private void xxx(){}
-->通知中可不写切点表达式,写定义切点的方法名xxx(),可定义多个切点,切点之间允许逻辑运算符结合,xxx()||yyy()
代理方式的选择:
可在开启aspectj注解自动代理中配置
-->proxy-rtarget-class="true/false"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值