Spring中的AOP实现思路

AOP是面向切面编程,为什么在切面中写一个注解方法@Before,这个方法会在目标方法前面执行呢

基于JDK动态代理实现上面说的情况

自定义注解

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface ExtBefore {
    String value() default "";
}

切面类,里面定义了一个注解方法

public class Aspect {

    @ExtBefore
    public void before() {
        System.out.println("beforeMethod ..... ");

    }

}

测试类

 private  static Object getProxy(final Object target ,  Object  aspect) 
这个方法传入的是要代理的目标类,和切面类。这样就可以在目标方法前和后执行我们在切面类加了注解的方法
public class ProxyTest {

    public static void main(String[] args) {
        
        List target = new ArrayList<String>();
        Collection proxy = (Collection)getProxy(target, new Aspect());
        System.out.println(proxy.add("A"));
        
    }
    
    
    private  static Object getProxy(final Object target ,  Object  aspect) {
        Object proxy  =  Proxy.newProxyInstance(target.getClass().getClassLoader(), 
                new Class[]{Collection.class},  new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //调用切面中before方法
                        Class<?> clazz = aspect.getClass();
                        Method[] methods = clazz.getDeclaredMethods();
                        for(Method m : methods) {
                            if(m.getDeclaredAnnotation(ExtBefore.class) != null) {
                                m.invoke(aspect);
                            }
                        }
                        //目标方法
                        Object retVal = method.invoke(target, args);
                        return retVal;
                    }
                });
        return proxy;
    }
}
原文地址:https://www.cnblogs.com/moris5013/p/11081924.html