Spring AOP自定义注解样例
参考:http://www.cnblogs.com/shipengzhi/articles/2716004.html
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Ann {
String value();
}
注解处理器
public class AnnoSupport {
/**
* 处理过程
* @param joinPoint AOP切入点
* @return
* @throws Throwable
*/
public Object doSupport(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("doSupport");
try {
return process(joinPoint);
} catch (Throwable t) {
throw t;
}
}
/**
* 处理过程
* @param joinPoint AOP切入点
* @return
* @throws Throwable
*/
private Object process(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("process");
Class<?> clazz = joinPoint.getTarget().getClass();
String className = clazz.getSimpleName();//获取类名
Signature signature = joinPoint.getSignature();
Method method = ((MethodSignature) signature).getMethod();
String methodName = method.getName();//获取方法名
Method realMethod = clazz.getMethod(methodName, method.getParameterTypes());
if (realMethod.isAnnotationPresent(Ann.class)) {
... ...
Ann ann = realMethod.getAnnotation(Ann.class);//获取注解
System.out.println("ann:" + ann.value());
}
return joinPoint.proceed();//执行方法
}
}
spring配置
<bean id="annoSupport" class="com.test.AnnoSupport"/>
<bean id="TestAnn" class="com.test.TestAnn">
</bean>
<!- 注册注解处理器 -->
<aop:aspectj-autoproxy/>
<aop:config>
<aop:aspect ref="annoSupport">
<aop:pointcut id="supportMethod"
expression="@annotation(com.test.Ann)"/>
<aop:around pointcut-ref="supportMethod" method="doSupport"/>
</aop:aspect>
</aop:config>
测试类
public class TestAnn {
@Ann("test")
public String ann(String test){
return test;
}
public static void main(String[] args){
ApplicationContext ac = new FileSystemXmlApplicationContext("file:D:\\workspace\\src\\main\\java\\com\\test\\applicationContext.xml");
TestAnn test = (TestAnn)ac.getBean("TestAnn");
test.ann("Test ann");
}
}