发表于: 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方式配置




返回列表 返回列表
评论

    分享到