您的位置:首页 > 运维架构

自定义AOP注解的应用

2017-07-31 22:46 302 查看
         以下结合工作中的需求,对自定义AOP注解有了进一步学习。现在通过以下几个方面进行学习

一 是什么?

二 做什么?

三 怎么用?

xml配置:

<aop:aspectj-autoproxy proxy-target-class="true" />
<!-- bean 必须配置在这里 -->
<bean id="testAdvice" class="cn.enn.ygego.webapps.aop.Test"></bean>
自定义注解的类:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Admin {

public boolean value() default true;

}

自定义AOP的类:
import java.lang.reflect.Method;
import java.util.Arrays;
import javax.annotation.PostConstruct;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Aspect
public class Test {

private final static Logger logger = LoggerFactory.getLogger(Test.class);

@PostConstruct
public void init() {
logger.info("11111111111111111");
}

@Pointcut(value = "@annotation(cn.enn.ygego.webapps.aop.Admin)")
public void adminPointCut() {
}

@Before(value = "adminPointCut()")
public void doBefore(JoinPoint point) {
logger.info(
"@before:目标方法为:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName());
MethodSignature methodSignature = (MethodSignature) point.getSignature();
Method method = methodSignature.getMethod();
Admin a = method.getAnnotation(Admin.class);
logger.info("@before:目标方法注解为:" + a.value());
logger.info("@before:参数为:" + Arrays.toString(point.getArgs()));
logger.info("@before:被织入的目标对象为:" + point.getTarget());
logger.info("before do something------------------------------------------------");
}

@Around(value = "adminPointCut()")
public Object doAround(ProceedingJoinPoint point) throws Throwable {
logger.info("around start-------------");
Object obj = point.proceed();
logger.info("around end-------------");
return obj;
}

@After(value = "adminPointCut()")
public void dobefore(JoinPoint point) {
logger.info("after do something 类似finally ------------------------------------------------");
}

}
Controller的应用:
@RestController
public class UserController {

@Admin(false)
@RequestMapping(value = "/test")
@ResponseBody
public Object test() {
System.out.println("实际上的逻辑处理");
return new Date().toString();
}
}

通过以上的配置就可以实现自定义注解!加油哦!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: