zoukankan      html  css  js  c++  java
  • 静态普通方法名匹配切面

    连接点:

    程序执行的摸个特定位置,如类开始初始化之前、类初始化之后、类中某个方法调用前和调用后,方法抛出异常后等等都是 连接点。但是Spring只支持方法的连接点,所以仅能在方法调用前,调用后,抛出异常后植入增强。

    切点:

    通过数据库查询的概念来理解切点和连接点的关系在合适不过了:连接点相当于数据库中的记录,而切点相当于查询条件。切 点和连接点不是一对一的关系,一个切点可以匹配多个连接点。

    增强:

    增强时植入目标类连接点上的一段代码。

    切点加上增强就是切面,就是包含了需要植入的代码以及植入的位置信息。

    1.编写需要植入逻辑的代码

    首先编写一个Waiter类,它有两个方法,greetTo和serveTo;然后编写一个Seller类,它也有一个greetTo方法。

    Waiter类

    public class Waiter {
        public void greetTo(String name){
            System.out.println("waiter greet to :"+name);
        }
        public void serveTo(String name){
            System.out.println("waiter serve to :"+name);
        }
    }

    Seller类

    public class Seller {
        public void greetTo(String name){
            System.out.println("seller greet to :"+name);
        }
    }

    2.编写需要植入的逻辑即增强

    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    
    public class RoundGreeting implements MethodInterceptor {
        @Override
        public Object invoke(MethodInvocation methodInvocation) throws Throwable {
            Object[] args = methodInvocation.getArguments();
            String name = (String) args[0];
            System.out.println("how are you :Mr"+name);
    
            Object obj = methodInvocation.proceed();
    
            System.out.println("Please enjoy yourself!");
    
            return obj;
        }
    }

    3.定义一个切面,可以通过类,方法名,以及方法方位等信息灵活的定义切面的连接点(即添加增强的地方)

    import org.springframework.aop.ClassFilter;
    import org.springframework.aop.support.StaticMethodMatcherPointcutAdvisor;
    
    import java.lang.reflect.Method;
    
    public class GreetingAdvisor extends StaticMethodMatcherPointcutAdvisor {
        @Override
        public boolean matches(Method method, Class<?> aClass) {
            return "greetTo".equals(method.getName());
        }
    
        @Override
        public ClassFilter getClassFilter() {
            return new ClassFilter() {
                @Override
                public boolean matches(Class<?> aClass) {
                    return Waiter.class.isAssignableFrom(aClass);
                }
            };
        }
    }

    4.在xml文件中定义各种Bean

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="waiter" class="aspect.Waiter"/>
        <bean id="seller" class="aspect.Seller"/>
        <bean id="advice" class="aspect.RoundGreeting"/>
    
        <bean id="advisor" class="aspect.GreetingAdvisor"
              p:advice-ref="advice"
                />
        <bean id="parent" abstract="true"
              class="org.springframework.aop.framework.ProxyFactoryBean"
              p:interceptorNames="advisor"
              p:proxyTargetClass="true"
              />
        <bean id="proxyWaiter" parent="parent"
              p:target-ref="waiter"
                />
        <bean id="proxySeller" parent="parent"
                p:target-ref="seller"
                />
    
    </beans>
  • 相关阅读:
    模电电路分析
    正式答辩提问
    Dockerfile
    Docker常用命令
    docker镜像与容器
    Docker容器与容器数据
    docker命令自动安装
    Docker与虚拟机
    Java Lambda表达式 Stream
    Java Lambda表达式
  • 原文地址:https://www.cnblogs.com/ironmantony/p/3477278.html
Copyright © 2011-2022 走看看