AOP基于注解实现

古城微笑少年丶 2022-02-24 01:52 418阅读 0赞

切面类
@Component //控制反转
@Aspect //声明切面类
public class ForumAdvisor {
//execution(* com.mitu.aspect.*.removeTopic(..))切点
@Before(“execution(* com.mitu.aspect.*.removeTopic(..))”) //声明前置增强
public void before(JoinPoint jPoint) throws Throwable {
System.out.println(“这是前置增强”);

  1. //获取目标对象包全名
  2. String classType=jPoint.getTarget().getClass().getName();
  3. Class<?> clazz=Class.forName(classType);
  4. String className = clazz.getName();
  5. System.out.println(className);
  6. //获取目标对象类名
  7. String classSimpleName = clazz.getSimpleName();
  8. System.out.println(classSimpleName);
  9. //获取目标对象方法名
  10. String methodName = jPoint.getSignature().getName();
  11. System.out.println(methodName);
  12. //获取目标对象参数值
  13. Object\[\] args = jPoint.getArgs();
  14. System.out.println("参数:"+args\[0\]);
  15. \}
  16. @After("execution(\* com.mitu.aspect.\*.\*(..))") //声明后置增强
  17. public void after() \{
  18. System.out.println("这是后置增强");
  19. \}
  20. @Around("execution(\* com.mitu.aspect.\*.\*(..))") //声明环绕增强
  21. public Object around(ProceedingJoinPoint point) throws Throwable\{
  22. //计算方法耗时
  23. System.out.println("这是环绕增强(前置增强)");
  24. long start = System.currentTimeMillis();
  25. Object object = point.proceed();
  26. System.out.println("这是环绕增强(后置增强)");
  27. long end = System.currentTimeMillis();
  28. //获取目标对象包全名
  29. String classType=point.getTarget().getClass().getName();
  30. Class<?> clazz=Class.forName(classType);
  31. String className = clazz.getName();
  32. //获取目标对象方法名
  33. String methodName = point.getSignature().getName();
  34. System.out.println(className+":"+methodName+"耗时"+(end-start));
  35. return object;
  36. \}
  37. @AfterThrowing(pointcut="execution(\* com.mitu.aspect.\*.\*(..))",throwing="ex") //声明抛出异常增强
  38. public void afterThrowing(Exception ex) \{
  39. System.out.println("这是抛出异常增强");
  40. \}

}

aop.xml配置:
<?xml version=”1.0” encoding=”UTF-8”?>






接口类:
public interface IForumService {
public void removeTopic(int topicId);
public void removeForum(int forumId);
}

实现类:
@Component //控制反转
public class ForumServiceImp implements IForumService{

  1. @Override
  2. public void removeTopic(int topicId) \{
  3. try \{
  4. System.out.println("删除论坛帖子:"+topicId);
  5. //Thread.currentThread()获取当前线程
  6. Thread.currentThread().sleep(600);
  7. \} catch (InterruptedException e) \{
  8. // TODO Auto-generated catch block
  9. e.printStackTrace();
  10. \}

// throw new RuntimeException(“抛出运行时异常”);
}

  1. @Override
  2. public void removeForum(int forumId) \{
  3. try \{
  4. System.out.println("删除论坛板块:"+forumId);
  5. Thread.currentThread().sleep(2000);
  6. \} catch (InterruptedException e) \{
  7. e.printStackTrace();
  8. \}
  9. \}

}

测试类:
public class AnnonationAopTest {
public static void main(String[] args) {
ApplicationContext aContext = new ClassPathXmlApplicationContext(“com/mitu/annonationaop/aop.xml”);
//注意强制类型转换的类型为:接口IForumService
IForumService forumService = (IForumService)aContext.getBean(“forumServiceImp”);
forumService.removeForum(200);
forumService.removeTopic(150);
}
}

发表评论

表情:
评论列表 (有 0 条评论,418人围观)

还没有评论,来说两句吧...

相关阅读

    相关 基于注解实现AOP

    动态代理分为JDK动态代理和cglib动态代理,当目标类有接口的情况使用JDK动态代理和cglib动态代理,没有接口时只能使用cglib动态代理。 JDK动态代理动态生成的代