zoukankan      html  css  js  c++  java
  • Spring中的AOP应用

    AOP被称为面向切面编程,AOP中的几个重要概念是:

    1。切面。切面就是要实现的功能。切面通常是在多数方法中会用到的相同功能,如写日志。

    2。连接点。连接点就是应用程序执行过程中插入切面的地点。如:方法的调用,异常的抛出。

    3。通知。通知就是某个切入点要执行的代码,Spring中有四种通知类型:环绕通知(around),前置通知,后置通知和异常通知。

    4。切入点。切入点定义了通知应该应用在那些连接点上。

    5。引入。引入允许你为已存在的类添加新方法和属性。

    6。目标对象。目标对象就是被通知的对象。

    7。代理。将通知应用到目标对象后创建的对象。

    8。织入。织入就是将切面应用到目标对象从而创建一个新的代理对象的过程。

    接下来,我们看看Spring中的四种通知的用法。

    1。前置通知。就是在目标对象执行前执行的通知。

    实现前置通知只需要实现MethodBeforeAdvice接口,并且实现它的public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable就可以了,在方法中编写需要执行的逻辑,其中arg0表示当前调用的方法,arg1表示的是该方法中传递的参数,arg2表示调用该方法的对象。通知写好后,需要在applicationContext.xml文件中告知应用通知的目标对象是谁。

    首先将目标对象和通知都注入到Spring容器中:

    <bean id="cat" class="com.lovo.bean.CatBean">
      <property name="msg">
       <value></value>
      </property>
     </bean>
    
    <bean id="myAdvice" class="com.lovo.advise.TestAdvice"></bean> 

    然后使用拦截器实现对目标对象的那些行为进行拦截,即定义切入点:

    <bean id="myInteceptor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
      <property name="advice" ref="myAdvice"></property>
      <property name="pattern" value="com.lovo.bean.(CatBean|DogBean).*"></property>
     </bean> 

    上面使用的是正则表达式来验证切入点,即CatBean和DogBean的所有方法在调用时都将被拦截器拦截,并且先执行通知里面的代码,然后再执行我们的调用的方法。

    最后还要使用代理来创建代理对象:

    <bean id="superBean" class="org.springframework.aop.framework.ProxyFactoryBean" abstract="true">
      <property name="interceptorNames">
       <list>
        <value>myInteceptor</value>
       </list>
      </property>
     </bean>
     <bean id="superDog" parent="superBean">
      <property name="target" ref="dog">
      </property>
     </bean>

    SuperDog就是由代理创建的代理对象,如果要常见DogBean对象,就不需要new出来了,可以这样做:

    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

    DogBean db = (DogBean)context.getBean("superDog");

    实现环绕通知只需实现MethodInterceptor接口,并实现public Object invoke(MethodInvocation arg0) throws Throwable方法即可,不过方法的实地执行就要由arg0.proceed()来执行了。也就是说实地方法的执行是在invoke方法里面执行的。

    实现后置通知只需实现AfterReturningAdvice接口,并实现public void afterReturning(Object arg0, Method arg1, Object[] arg2,  Object arg3) throws Throwable方法。后置通知会在方法执行后执行,可以得到方法执行后返回的结果。

    异常通知只需实现ThrowsAdvice接口,并实现public void afterThrowing(Exception ex)方法,在方法执行过程中抛出异常时,会调用该方法。

    可以根据需要选择一种或几种结合使用。

  • 相关阅读:
    HTML onblur 事件属性
    插入光标颜色 | caret-color (Basic User Interface) – CSS 中文开发手册
    gc (Runtime) – Python 中文开发手册
    《宾狗》
    《凭什么相信你,我的CNN模型?(篇二:万金油LIME)》
    《凭什么相信你,我的CNN模型?(篇一:CAM和Grad-CAM)》
    《如何利用CAM(类激活图)动态可视化模型的学习过程》
    《Attention最新进展》
    TCP-IP四书五经
    《统计学习方法》
  • 原文地址:https://www.cnblogs.com/coprince/p/4504805.html
Copyright © 2011-2022 走看看