标签:target Spring Object 切面 aspect AOP 思路 public proxy
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; } }
标签:target,Spring,Object,切面,aspect,AOP,思路,public,proxy 来源: https://www.cnblogs.com/moris5013/p/11081924.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。