zoukankan      html  css  js  c++  java
  • Spring(七)Spring中的四种增强和顾问

    Spring中的四种增强有那四种?

    前置增强    后置增强  环绕增强  异常增强

    先编写接口和实体类  ISomeService和SomeServiceImpl

    package demo10;
    
    /**
     * Created by mycom on 2018/3/8.
     */
    public interface ISomeService {
        public void doSome();
    }
    package demo10;
    
    /**
     * Created by mycom on 2018/3/8.
     */
    public class SomeServiceImpl implements ISomeService {
        public void doSome() {
            System.out.println("=================");
        }
    }

    先来说第一个前置增强,直接用例子来说明

    package demo10;
    
    import org.springframework.aop.MethodBeforeAdvice;
    
    import java.lang.reflect.Method;
    
    /**
     * Created by mycom on 2018/3/8.
     */
    public class BeforeAdvice implements MethodBeforeAdvice {
        public void before(Method method, Object[] objects, Object o) throws Throwable {
            System.out.println("=========before");
        }
    }

    在配置文件中

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    
        <bean id="service" class="demo10.SomeServiceImpl"></bean>
        <bean id="beforeAdvice" class="demo10.BeforeAdvice"></bean>
        <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="target" ref="service"></property>
            <property name="interceptorNames" value="beforeAdvice"></property>
        </bean>
    
    
    </beans>
    @Test
        public void t1(){
            ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextBefore.xml");
            ISomeService proxyService =(ISomeService) context.getBean("proxyService");
            proxyService.doSome();
        }

    运行的结果是

    2.后置增强和前置增强一样,只是改一改配置文件里的名称就可以

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    
        <bean id="service" class="demo11.SomeServiceImpl"></bean>
        <bean id="afterAdvice" class="demo11.AfterAdvice"></bean>
        <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="target" ref="service"></property>
            <property name="interceptorNames" value="afterAdvice"></property>
        </bean>
    
    
    </beans>

    3.环绕增强

    直接饮用上面的接口和实现类了

    在创建另一个类 MethodAdvice

    package demo12;
    
    
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    
    /**
     * Created by mycom on 2018/3/8.
     */
    public class MethodAdvice implements MethodInterceptor {
    
    
        public Object invoke(MethodInvocation methodInvocation) throws Throwable {
            System.out.println("前置增强");
            Object result = methodInvocation.proceed();
            System.out.println("后置增强");
            return result;
        }
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    
        <bean id="service" class="demo12.SomeServiceImpl"></bean>
        <bean id="methodAdvice" class="demo12.MethodAdvice"></bean>
        <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="target" ref="service"></property>
            <property name="interceptorNames" value="methodAdvice"></property>
        </bean>
    
    
    </beans>

    4.异常增强

    package demo13;
    
    
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    import org.springframework.aop.ThrowsAdvice;
    
    /**
     * Created by mycom on 2018/3/8.
     */
    public class MyThroesAdvice implements ThrowsAdvice {
        public void afterThrowing(Exception ex){
            System.out.println("网络出现错误");
        }
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    
        <bean id="service" class="demo13.SomeServiceImpl"></bean>
        <bean id="throwsAdvice" class="demo13.MyThroesAdvice"></bean>
        <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="target" ref="service"></property>
            <property name="interceptorNames" value="throwsAdvice"></property>
        </bean>
    
    
    </beans>
    @Test
       public void t2(){
           ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextThrows.xml");
           ISomeService proxyService =(ISomeService) context.getBean("proxyService");
           try{
               proxyService.doSome();
           }catch (Exception ex){
               ex.printStackTrace();
           }

    5.advisor  是顾问的意思  正对某一个方法增强

    还有一个词是通知  advice  我自己的理解是  通知视同只所有人,顾问是针对某个人顾问,这样方便记忆,顾问包括通知

    通知的方法有两种名称匹配方法切入点顾问和正则方法切入点顾问

    先看第一种:

    现在在ISomeService接口中在添加一个方法doAny(),在实现类中重写这个方法

    那么在配置文件中

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    
        <bean id="service" class="demo14.SomeServiceImpl"></bean>
        <bean id="beforeAdvice" class="demo14.BeforeAdvice"></bean>
        
        <!--与其他不一样的地方-->
        <bean id="advisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
            <property name="advice" ref="beforeAdvice"></property>
            <property name="mappedNames" value="do*"></property>
        </bean>
        <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="target" ref="service"></property>
            <property name="interceptorNames" value="advisor"></property>
        </bean>
    
    
    </beans>

    这个配置文件可以对比着之前写的配置文件看看有什么不同之处

    @Test
       public void t2(){
           ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextAdvisor.xml");
           ISomeService proxyService =(ISomeService) context.getBean("proxyService");
           proxyService.doSome();
           proxyService.doAny();
       }

     第二种方法:正则方法切入点顾问

    同样是饮用上面的接口和实现类,在配置文件中:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    
        <bean id="service" class="demo16.SomeServiceImpl"></bean>
        <bean id="beforeAdvice" class="demo16.BeforeAdvice"></bean>
    
        <bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
            <property name="advice" ref="beforeAdvice"></property>
            <property name="pattern" value=".*do.*"></property>
        </bean>
        <bean id="proxyService" class="org.springframework.aop.framework.ProxyFactoryBean">
            <property name="target" ref="service"></property>
            <property name="interceptorNames" value="advisor"></property>
        </bean>
    
    
    </beans>
    <property name="pattern" value=".*do.*"></property>

    这个节点中name还有一个值是:patterns,其value值是:

    <property name="patterns" value=".*Some,.*Any"></property>

    这种方法用的是正则的符号

  • 相关阅读:
    从程序员到技术总监,分享10年开发经验
    CF739E Gosha is hunting
    hdu 4891 模拟
    hdu4888 最大流(构造矩阵)
    hdu4888 最大流(构造矩阵)
    hdu4885 有 限制的最短路
    hdu4885 有 限制的最短路
    hdu4884 模拟
    hdu4884 模拟
    POJ1789简单小生成树
  • 原文地址:https://www.cnblogs.com/my-123/p/8533263.html
Copyright © 2011-2022 走看看