一 . 概述
本节是一个示例i程序的演示,说明之前讲解的这些知识.
二 .演示
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String name() default ""; }
首先我们定义了一个注解,这个注解有一个参数name.
定义我们的切面类:
@Aspect @Component public class MyAspect { //此处表示的意思是,des的注解信息被注入到des变量上面去. @Around(value="@annotation(des)") public void around(ProceedingJoinPoint point,MyAnnotation des) throws Throwable { //现在我们的方法可以切入到含有指定注解的方法之中. System.out.println("被拦截的类为-->"+point.getSourceLocation().getWithinType().getName()); //获取方法的名称 String mathodName = point.getSignature().getName(); System.out.println("方法的名字是:-->" + mathodName); //获取方法的参数 System.out.println("方法的参数为-->"+Arrays.toString(point.getArgs())); //获取注解的内容 String name = des.name(); System.out.println("目标对象上的注解的name属性的值为-->" + name);//执行目标方法 point.proceed(); } }
目标对象:
@Component public class Proxy { @MyAnnotation(name="abc") public void proxy(String name) { System.out.println("proxy..."); } }
配置类:
@Configuration @EnableAspectJAutoProxy(proxyTargetClass=true) @ComponentScan("com.trek.demo") public class Config { }
需要注意的就是,我们一定要开启AOP注解驱动.
测试代码:
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class); Proxy proxy = (Proxy) context.getBean("proxy"); proxy.proxy("trek");
三 .总结
[1] 我们通过注解的方式可以完成注解属性的获取,以后这个例子就可以作为一个模板
[2]其实point.getSourceLocation()就是获取类的信息
[3]其实point.getSignature()就是获取代理method对象的方法.