• Spring——5种增强方式


    一、前置增强

    二、后置增强

    三、环绕增强

       环绕增强相当于前置增强和后置增强的结合体,可以使用<aop:around>进行处理,这里我采用代理工厂的方式

      1.接口及其实现类

    public interface ProService {
        public void doSome();
    }
    public class ProServiceImpl implements ProService {
        @Override
        public void doSome() {
            System.out.println("123");
        }
    }

      2.增强类

    public class around implements MethodInterceptor {
        @Override
        public Object invoke(MethodInvocation methodInvocation) throws Throwable {
            System.out.println("before");
            Object proceed = methodInvocation.proceed();
            System.out.println("after");
            return proceed;
        }
    
    
    }

      3.配置文件

        <!--注入bean-->
        <bean id="proService" class="cn.spring.around.ProServiceImpl"></bean>
        <!--切面-->
        <bean id="aroundAdvice" class="cn.spring.around.around"></bean>
        <!--代理工厂实现增强-->
        <bean id="ProFactory" class="org.springframework.aop.framework.ProxyFactoryBean">
            <!--将增强和业务织入到一起-->
            <property name="target" ref="proService"></property>
            <!--拦截增强类-->
            <property name="interceptorNames" value="aroundAdvice"></property>
            <!--更换代理方式   默认值为false  jdk动态代理,当没有接口时,自动改成cglib-->
            <property name="proxyTargetClass" value="true"></property>
        </bean>

        或者使用aop:config

    <!--将目标对象声明到Spring容器中-->
    <bean id="doSomeService" class="com.cmy.service.impl.DoSomeServiceImpl"></bean>
    <!-- 声明增强方法所在的Bean -->
    <bean id="advice" class="com.cmy.around.AroundLogger"></bean>
    <!-- 配置切面 -->
    <aop:config>
       <aop:aspect ref="advice">
          <aop:around method="aroundLogger" pointcut="execution(* com.cmy.*.*.*(..))"/>
       </aop:aspect>
    </aop:config>

    四、异常增强

      异常增强处理,在目标方法抛出异常后织入;使用<aop:after-throwing>处理,这里我依旧采用代理工厂的方法

      1.接口及其实现类

    public interface IdoSomeService {
        public void doSome() throws Exception;
    }
    /**
     * 原始对象
     */
    public class IdoSomeServiceImpl implements IdoSomeService {
        public void doSome() throws Exception{
            int result=5/0;
            System.out.println("=========真实业务===========");
        }
    }

      2.增强类

    package cn.spring.throwadvice;
    
    import org.springframework.aop.AfterAdvice;
    import org.springframework.aop.AfterReturningAdvice;
    import org.springframework.aop.ThrowsAdvice;
    
    import java.lang.reflect.Method;
    
    public class MyAdvice {
        public void afterThrowing(Exception ex){
            System.out.println("=====发生了异常,执行增强操作===============");
        }
    
    
    }

      3.配置文件

    <bean id="proxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean">
              <!-- 将增强和业务织入到一起-->
                <property name="target" ref="idoSomeService"></property>
                <!--拦截增强类;-->
                <property name="interceptorNames" value="myThrowAdvice"></property>
               <!-- 更换代理方式       proxyTargetClass默认值为false     默认是jdk动态代理,但是当目标对象没有接口时,自动改为cglib -->
                <property name="proxyTargetClass" value="true"></property>
            </bean>

        或者采用aop:after-throwing

    <aop:config>
            <aop:pointcut id="pointcut" expression="execution(* *..throwadvice.*.*(..))"/>
            <aop:aspect ref="myAdvice">
                <aop:after-throwing method="afterThrowing" throwing="ex" pointcut-ref="pointcut"></aop:after-throwing>
               
        </aop:config>

    五、最终增强

       无论方法是否抛出异常,都会在目标方法后做织入的增强处理,即该增强一定会执行,有点类似try-catch-finally块中的finally,一般用于释放资源。 使用<aop:after>处理最终增强。这里依旧运用代理工厂实现

      1.增强类

     public void afterAdvice(){
            System.out.println("======执行最终异常===============");
        }

      2.配置文件

    <aop:config>
            <aop:pointcut id="pointcut" expression="execution(* *..throwadvice.*.*(..))"/>
            <aop:aspect ref="myAdvice">
                <aop:after method="afterAdvice" pointcut-ref="pointcut"></aop:after>
            </aop:aspect>
        </aop:config>

      

      

  • 相关阅读:
    win8下Source Insight has not been installed completely问题的解决
    linux命令学习——ps
    linux命令学习——file
    树莓派进阶之路 (023)
    树莓派进阶之路 (022)
    树莓派进阶之路 (021)
    树莓派进阶之路 (020)
    ubuntu下安装gedit插件
    C语言学习笔记 (004)
    C语言学习笔记 (003)
  • 原文地址:https://www.cnblogs.com/xiao-ran/p/11760140.html
Copyright © 2020-2023  润新知