zoukankan      html  css  js  c++  java
  • spring增强方式

    一、前置增强

    二、后置增强

    三、环绕增强

       环绕增强相当于前置增强和后置增强的结合体,可以使用<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>
  • 相关阅读:
    list转datatable c#
    按钮靠右css小结
    IE浏览器打印合格证相关问题
    vue项目插入视频-mp4
    vue项目bug-Couldn’t find preset "es2015"
    Mac打开swf文件
    mac+windows下从git上拉取项目及运行
    echarts.js制作中国地图
    前端数据可视化echarts.js
    vue-router 基本使用
  • 原文地址:https://www.cnblogs.com/ringqq/p/11764619.html
Copyright © 2011-2022 走看看