Srping AOP基于注解和配置文件方式实现前通知,后通知,环绕通知,异常通知,最终通知

青旅半醒 2022-06-05 02:58 373阅读 0赞

Srping AOP基于注解和配置文件方式实现前通知,后通知,环绕通知,异常通知,最终通知

注解方式:

1、切面类

  1. package cn.sz.aspect;
  2. import org.aspectj.lang.JoinPoint;
  3. import org.aspectj.lang.ProceedingJoinPoint;
  4. import org.aspectj.lang.annotation.After;
  5. import org.aspectj.lang.annotation.AfterReturning;
  6. import org.aspectj.lang.annotation.AfterThrowing;
  7. import org.aspectj.lang.annotation.Around;
  8. import org.aspectj.lang.annotation.Aspect;
  9. import org.aspectj.lang.annotation.Before;
  10. import org.springframework.stereotype.Component;
  11. //这是一个横向抽取非主要业务方法的类
  12. @Component
  13. @Aspect
  14. public class MyAspect {
  15. @Before(value = "execution(* cn.sz.dao.impl.*.*(..))")
  16. public void login(JoinPoint jp) {
  17. // 获取连接点的信息
  18. Object o = jp.getThis();
  19. System.out.println(o);
  20. // ((UserDao)o).delete();
  21. System.out.println("login.......");
  22. }
  23. @AfterReturning(value = "execution(* cn.sz.dao.impl.*.*(..))")
  24. public void log4j() {
  25. System.out.println("log4j......");
  26. }
  27. @Around(value = "execution(* cn.sz.dao.impl.*.*(..))")
  28. public void rou(ProceedingJoinPoint pjp) throws Throwable {
  29. System.out.println("round......1");
  30. pjp.proceed();
  31. System.out.println("round......2");
  32. }
  33. @AfterThrowing(value = "execution(* cn.sz.dao.impl.*.*(..))")
  34. public void exception() {
  35. System.out.println("exception......");
  36. }
  37. @After(value = "execution(* cn.sz.dao.impl.*.*(..))")
  38. public void finallyF() {
  39. System.out.println("finallyF......");
  40. }
  41. }

2、主配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xmlns:user="http://www.springframework.org/schema/p"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
  11. ">
  12. <!-- 扫描:当前包中的类和子包中的类 -->
  13. <context:component-scan base-package="com.sz"></context:component-scan>
  14. <aop:aspectj-autoproxy/>
  15. <bean id="userDao" class="com.sz.dao.impl.UserDaoImpl"></bean>
  16. </beans>

3、测试接口 UserDAO

  1. package cn.sz.dao;
  2. public interface UserDAO {
  3. public void save();
  4. }

4.接口实现类

  1. package cn.sz.dao.impl;
  2. import cn.sz.dao.UserDAO;
  3. //主要业务功能类
  4. public class UserDAOImpl implements UserDAO {
  5. @Override
  6. public void save() {
  7. // 测试出异常
  8. // String a = null;
  9. // a.length();
  10. System.out.println("save...");
  11. }
  12. }

5、测试类

  1. package cn.sz.test;
  2. import org.junit.Test;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. import cn.sz.dao.UserDAO;
  6. public class AopTest {
  7. @Test
  8. public void test1() {
  9. ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
  10. UserDAO userDAO = ac.getBean("userDao", UserDAO.class);
  11. userDAO.save();
  12. }
  13. }

配置文件方式:

1、切面类

  1. package cn.sz.aspect;
  2. import org.aspectj.lang.JoinPoint;
  3. import org.aspectj.lang.ProceedingJoinPoint;
  4. import org.aspectj.lang.annotation.After;
  5. import org.aspectj.lang.annotation.AfterReturning;
  6. import org.aspectj.lang.annotation.AfterThrowing;
  7. import org.aspectj.lang.annotation.Around;
  8. import org.aspectj.lang.annotation.Aspect;
  9. import org.aspectj.lang.annotation.Before;
  10. import org.springframework.stereotype.Component;
  11. //这是一个横向抽取非主要业务方法的类
  12. public class MyAspect {
  13. public void login(JoinPoint jp) {
  14. // 获取连接点的信息
  15. Object o = jp.getThis();
  16. System.out.println(o);
  17. // ((UserDao)o).delete();
  18. System.out.println("login.......");
  19. }
  20. public void log4j() {
  21. System.out.println("log4j......");
  22. }
  23. public void rou(ProceedingJoinPoint pjp) throws Throwable {
  24. System.out.println("round......1");
  25. pjp.proceed();
  26. System.out.println("round......2");
  27. }
  28. public void exception() {
  29. System.out.println("exception......");
  30. }
  31. public void finallyF() {
  32. System.out.println("finallyF......");
  33. }
  34. }

2、主配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xmlns:user="http://www.springframework.org/schema/p"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
  11. ">
  12. <!-- 创建非主要业务方法类的对象:切面 -->
  13. <bean id="myAspect" class="com.sz.aspect.MyAspect"></bean>
  14. <bean id="userDao" class="com.sz.dao.impl.UserDaoImpl"></bean>
  15. <!-- 实现将非主要业务方法切入到主要业务方法中去 -->
  16. <aop:config>
  17. <!-- 将切面对象引入 -->
  18. <aop:aspect ref="myAspect" id="my">
  19. <!-- 定义切入点:在哪些地方实现切入 -->
  20. <aop:pointcut expression="execution(* com.sz.dao.impl.UserDaoImpl.*(..))" id="p1"/>
  21. <!-- 配置前通知 -->
  22. <!-- method配置非主要业务方法/通知/关注点 -->
  23. <aop:before method="login" pointcut-ref="p1"/>
  24. <!-- 配置后通知 -->
  25. <aop:after-returning method="log4j" pointcut-ref="p1"/>
  26. <!-- 配置环绕通知 -->
  27. <aop:around method="rou" pointcut-ref="p1"/>
  28. <!-- 配置异常后通知 -->
  29. <aop:after-throwing method="exception" pointcut-ref="p1"/>
  30. <!-- 配置最终通知 -->
  31. <aop:after method="finallyF" pointcut-ref="p1"/>
  32. </aop:aspect>
  33. </aop:config>
  34. </beans>

3、测试接口UserDAO

  1. package cn.sz.dao;
  2. public interface UserDAO {
  3. public void save();
  4. }

4.接口实现类

  1. package cn.sz.dao.impl;
  2. import cn.sz.dao.UserDAO;
  3. //主要业务功能类
  4. public class UserDAOImpl implements UserDAO {
  5. @Override
  6. public void save() {
  7. // 测试出异常
  8. // String a = null;
  9. // a.length();
  10. System.out.println("save...");
  11. }
  12. }

5、测试类

  1. package cn.sz.test;
  2. import org.junit.Test;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. import cn.sz.dao.UserDAO;
  6. public class AopTest {
  7. @Test
  8. public void test1() {
  9. ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
  10. UserDAO userDAO = ac.getBean("userDao", UserDAO.class);
  11. userDAO.save();
  12. }
  13. }

发表评论

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

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

相关阅读