发表于: 2018-01-05 22:46:59
1 500
今天完成的事:
学习AOP
遇到的困难:
1、顾问
原因:应该是ref
<property name="target" value="some"/>
明天计划:
收获:
1、什么是aop?
AOP是面向切面编程,OOP是面向对象编程。
AOP底层是采用动态代理模式实现的,CGLIB动态代理与jdk动态代理。
面向切面编程,是将交叉业务逻辑封装成切面,利用aop容器将切面织入到主业务逻辑中,所谓的交叉业务逻辑是指通用的与主业务逻辑无关的,例如事务,日志,权限等。
2、相关概念:
Aspect--切面,即定义的一个类,包含交叉业务逻辑
Weaving--织入,将切面插入到主业务逻辑中
JointPoint--连接点,可以插入切面的点,但不一定要插入切面
Pointcut--切入点,切入点肯定是连接点,已经插入切面
Target--目标对象,可以是类,可以是方法
Advice--通知,是切面的一种实现,目标对象只能是类,将切面织入到目标类的所有 方法中
Advisor--顾问,是切面的一种实现,是Advice的增强版,可以更复杂的切面织入功能,PointcutAdvisor是顾问的一种,可以指定具体的切入点,顾问将通知进行包装,会根据不同的通知类型,在不同的时间点,将切面织入到不同的切入点。
3、在spring配置文件中的配置
1、配置目标对象---->2、配置切面--->3、配置代理,代理中的属性有目标对象,要实现的接口,切面
<!--1、配置目标对象-->
<bean id="some" class="com.aop.ISomeImpl"></bean>
<!--交叉业务逻辑称为切面,要增强的内容-->
<bean id="beforeAdvice" class="com.aop.Before"></bean>
<bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--target目标对象-->
<property name="target" ref="some"/>
<!--要实现的接口-->
<property name="interfaces" value="com.aop.ISome"/>
// 切面:前置通知,切面名称
<property name="interceptorNames" value="beforeAdvice"/>
4、切面的分类:
前置通知:
实现MethodBeforeAdvice接口,在目标方法之前执行
<bean id="beforeAdvice" class="com.aop.Before"></bean>
后置通知:
实现AfterReturningAdvice接口,在目标方法之后执行
<bean id="myAfterReturningAdvice" class="com.aop.MyAfterReturningAdvice"/>
环绕通知:
实现MethodIntercetor接口,在目标方法执行前后执行,可以改变目标方法的返回值,也可以改变程序的执行流程
<bean id="myMethodInterceptor" class="com.aop.MyMethodInterceptor"/>
异常通知:
实现ThrowsAdvice接口,主要作用是在目标方法抛出异常后,根据异常的不同做出相应的处理,当处理完异常后,急哦简单的将异常再次抛给目标方法。
给目标方法织入多个切面
<!--插入多个切面-->
<property name="interceptorNames" >
<list>
<value>beforeAdvice</value>
<value>myAfterReturningAdvice</value>
</list>
</property>
5、顾问
<1>名称匹配的方法切入顾问
<!--顾问-->
<bean id="myAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<!--配置通知-->
<property name="advice" ref="beforeAdvice"/>
<!--指定切入点为first方法-->
<property name="mappedName" value="first"/>
</bean>
注意 interceptorNames,切面名称
<!--配置代理-->
<bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="some"/>
<property name="interfaces" value="com.aop.ISome"/>
<property name="interceptorNames" value="myAdvisor"/>
</bean>
<2>正则表达式方式切入顾问
6、代理自动生成
<1>默认自动代理生成器,只能是顾问
<!--默认自动代理生成器,只能是Advisor-->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
<2>bean名称自动代理生成器,可以是顾问和通知
<!--bean名称自动代理生成器-->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames" value="some"/>
<property name="interceptorNames" value="beforeAdvice,myAfterReturningAdvice"/>
</bean>
采用自动代理生成器,在测试当中getBean引入的bean的id就是目标类的id,而不是代理的id
整个过程都是在spring配置文件中,采用的事xml方式配置
评论