spring——AOP面向切面编程—— 一般切面的 AOP 开发

╰半夏微凉° 2024-03-31 17:34 230阅读 0赞

一般切面的 AOP 开发

当我们在使用 Spring AOP 开发时,若没有对切面进行具体定义,Spring AOP 会通过 Advisor 为我们定义一个一般切面(不带切点的切面),然后对目标对象(Target)中的所有方法连接点进行拦截,并织入增强代码。

#

工程依赖:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>org.example</groupId>
  7. <artifactId>ssw</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <properties>
  10. <maven.compiler.source>8</maven.compiler.source>
  11. <maven.compiler.target>8</maven.compiler.target>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-context</artifactId>
  17. <version>5.3.6</version>
  18. </dependency>
  19. </dependencies>
  20. </project>

d7b1d3b16fae75101dbee5f4e4c4ef0b.png

userdao接口:

  1. package org.example.dao;
  2. public interface UserDao
  3. {
  4. public void add();
  5. public void delete();
  6. public void modify();
  7. public void get();
  8. }

aa9d541a200eda456fae8270edce288d.png

实现userdao接口:

  1. package org.example.dao.impl;
  2. import org.example.dao.UserDao;
  3. public class UserDaoImpl implements UserDao
  4. {
  5. @Override
  6. public void add() {
  7. System.out.println("正在执行 UserDao 的 add() 方法……");
  8. }
  9. @Override
  10. public void delete() {
  11. System.out.println("正在执行 UserDao 的 delete() 方法……");
  12. }
  13. @Override
  14. public void modify() {
  15. System.out.println("正在执行 UserDao 的 modify() 方法……");
  16. }
  17. @Override
  18. public void get() {
  19. System.out.println("正在执行 UserDao 的 get() 方法……");
  20. }
  21. }

6bb30e13da1c78f7f562f0a17b4c7a8b.png

设置前置正确方法UserDaoBeforeAdvice:

  1. package org.example.advice;
  2. import org.springframework.aop.MethodBeforeAdvice;
  3. import java.lang.reflect.Method;
  4. /**
  5. * 增强代码
  6. * MethodBeforeAdvice 前置增强
  7. *
  8. * @author c语言中文网 c.biancheng.net
  9. */
  10. public class UserDaoBeforeAdvice implements MethodBeforeAdvice
  11. {
  12. @Override
  13. public void before(Method method, Object[] args, Object target) throws Throwable
  14. {
  15. System.out.println("正在执行前置增强操作…………");
  16. }
  17. }

faaa1dc79d4a58fbce5a0c491861a7e9.png

  1. 设置bean.xml
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <beans xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd">
  10. <!--******Advisor : 代表一般切面,Advice 本身就是一个切面,对目标类所有方法进行拦截(* 不带有切点的切面.针对所有方法进行拦截)*******-->
  11. <!-- 定义目标(target)对象 -->
  12. <bean id="userDao" class="org.example.dao.impl.UserDaoImpl"></bean>
  13. <!-- 定义增强 -->
  14. <bean id="beforeAdvice" class="org.example.advice.UserDaoBeforeAdvice"></bean>
  15. <!--通过配置生成代理 UserDao 的代理对象 -->
  16. <bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  17. <!-- 设置目标对象 -->
  18. <property name="target" ref="userDao"/>
  19. <!-- 设置实现的接口 ,value 中写接口的全路径 -->
  20. <property name="proxyInterfaces" value="org.example.dao.UserDao"/>
  21. <!-- 需要使用value:增强 Bean 的名称 -->
  22. <property name="interceptorNames" value="beforeAdvice"/>
  23. </bean>
  24. </beans>

8ac274fe855af2e18b8ae8c0955eecdb.png

  1. 执行方法:
  2. package org.example;
  3. import org.example.dao.UserDao;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;
  6. public class Main
  7. {
  8. public static void main(String[] args)
  9. {
  10. //获取 ApplicationContext 容器
  11. ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
  12. //获取代理对象
  13. UserDao userDao = context.getBean("userDaoProxy", UserDao.class);
  14. //调用 UserDao 中的各个方法
  15. userDao.add();
  16. userDao.delete();
  17. userDao.get();
  18. userDao.modify();
  19. }
  20. }

170aec35845dac54782d6f235a57ec77.png

=======================================================================================

设置后置增强:

创建UserDaoAfterAdvice类:

  1. package org.example.advice;
  2. import org.springframework.aop.AfterReturningAdvice;
  3. import java.lang.reflect.Method;
  4. public class UserDaoAfterAdvice implements AfterReturningAdvice
  5. {
  6. @Override
  7. public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable
  8. {
  9. System.out.println("正在执行后置增强操作…………");
  10. }
  11. }

847ec1e1c749aa0c16096173548876b3.png

修改bean.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context.xsd">
  9. <!--******Advisor : 代表一般切面,Advice 本身就是一个切面,对目标类所有方法进行拦截(* 不带有切点的切面.针对所有方法进行拦截)*******-->
  10. <!-- 定义目标(target)对象 -->
  11. <bean id="userDao" class="org.example.dao.impl.UserDaoImpl"></bean>
  12. <!-- 定义增强 -->
  13. <bean id="beforeAdvice" class="org.example.advice.UserDaoBeforeAdvice"></bean>
  14. <!-- 定义增强 -->
  15. <bean id="afterAdvice" class="org.example.advice.UserDaoAfterAdvice"></bean>
  16. <!--通过配置生成代理 UserDao 的代理对象 -->
  17. <bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  18. <!-- 设置目标对象 -->
  19. <property name="target" ref="userDao"/>
  20. <!-- 设置实现的接口 ,value 中写接口的全路径 -->
  21. <property name="proxyInterfaces" value="org.example.dao.UserDao"/>
  22. <!-- <!– 需要使用value:增强 Bean 的名称 –>-->
  23. <!-- <property name="interceptorNames" value="beforeAdvice"/>-->
  24. <!-- 需要使用value:增强 Bean 的名称 -->
  25. <property name="interceptorNames" value="afterAdvice"/>
  26. </bean>
  27. </beans>

0b6d6cf1a184adb27c1efe470bda6292.png

执行代码:

  1. package org.example;
  2. import org.example.dao.UserDao;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. public class Main
  6. {
  7. public static void main(String[] args)
  8. {
  9. //获取 ApplicationContext 容器
  10. ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
  11. //获取代理对象
  12. UserDao userDao = context.getBean("userDaoProxy", UserDao.class);
  13. //调用 UserDao 中的各个方法
  14. userDao.add();
  15. userDao.delete();
  16. userDao.get();
  17. userDao.modify();
  18. }
  19. }

20701dc7a65115a634c39a83f603df92.png

=======================================================================================

环绕增强:

创建UserDaoAroundAdvice类:

  1. package org.example.advice;
  2. import org.aopalliance.intercept.MethodInterceptor;
  3. import org.aopalliance.intercept.MethodInvocation;
  4. public class UserDaoAroundAdvice implements MethodInterceptor
  5. {
  6. @Override
  7. public Object invoke(MethodInvocation methodInvocation) throws Throwable
  8. {
  9. System.out.println("基于Spring AOP的环绕增强前置处理.....");
  10. Object res = null;
  11. try
  12. {
  13. res=methodInvocation.proceed();//调用目标方法 返回目标方法的返回结果
  14. }
  15. catch (Throwable e)
  16. {
  17. e.printStackTrace();
  18. }
  19. System.out.println("基于Spring AOP的环绕增强后置处理.....");
  20. return res;
  21. }
  22. }

13f70feb4cd6088f8bb0e7e5dc1ffb3f.png

修改bean.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context.xsd">
  9. <!--******Advisor : 代表一般切面,Advice 本身就是一个切面,对目标类所有方法进行拦截(* 不带有切点的切面.针对所有方法进行拦截)*******-->
  10. <!-- 定义目标(target)对象 -->
  11. <bean id="userDao" class="org.example.dao.impl.UserDaoImpl"></bean>
  12. <!-- 定义增强 -->
  13. <bean id="beforeAdvice" class="org.example.advice.UserDaoBeforeAdvice"></bean>
  14. <!-- 定义增强 -->
  15. <bean id="afterAdvice" class="org.example.advice.UserDaoAfterAdvice"></bean>
  16. <!-- 定义增强 -->
  17. <bean id="aroundAdvice" class="org.example.advice.UserDaoAroundAdvice"></bean>
  18. <!--通过配置生成代理 UserDao 的代理对象 -->
  19. <bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  20. <!-- 设置目标对象 -->
  21. <property name="target" ref="userDao"/>
  22. <!-- 设置实现的接口 ,value 中写接口的全路径 -->
  23. <property name="proxyInterfaces" value="org.example.dao.UserDao"/>
  24. <!-- <!– 需要使用value:增强 Bean 的名称 –>-->
  25. <!-- <property name="interceptorNames" value="beforeAdvice"/>-->
  26. <!-- <!– 需要使用value:增强 Bean 的名称 –>-->
  27. <!-- <property name="interceptorNames" value="afterAdvice"/>-->
  28. <!-- 需要使用value:增强 Bean 的名称 -->
  29. <property name="interceptorNames" value="aroundAdvice"/>
  30. </bean>
  31. </beans>

939ef7ea3a20619fdb859edd0648c8c9.png

99b8f9032c30e2f6b95a1e545d8cabd3.png

执行代码:

  1. package org.example;
  2. import org.example.dao.UserDao;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. public class Main
  6. {
  7. public static void main(String[] args)
  8. {
  9. //获取 ApplicationContext 容器
  10. ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
  11. //获取代理对象
  12. UserDao userDao = context.getBean("userDaoProxy", UserDao.class);
  13. //调用 UserDao 中的各个方法
  14. userDao.add();
  15. userDao.delete();
  16. userDao.get();
  17. userDao.modify();
  18. }
  19. }

a6728026423d41bf2c82341e8e5acd95.png

=======================================================================================

cbdf206cc176c29ecd606158c651ab93.png

5682f92902008f08b192afd71f7762bf.png

4b7a938d88c9bf813fc39374de88b6a1.png

75ed7fd2763381ac0a5b95c1d6802f8d.png

63d0f16ff10f1fdde216aeed427f8635.png

发表评论

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

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

相关阅读

    相关 面向切面编程AOP

    1. 定义 AOP意为:[面向切面编程][Link 1],通过[预编译][Link 2]方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP可以对业务逻辑的各...

    相关 AOP面向切面编程

    [1.引言][1.]         原文地址:[点击打开链接][1.] 软件开发的目标是要对世界的部分元素或者信息流建立模型,实现软件系统的工程需要将系统分解成可以创

    相关 AOP面向切面编程

    AOP 面向切面编程 1.使用场景还原 当我们打开京东 app 进入首页,如果当前是没有网络的状态,里面的按钮点击是没有反应的。只有当我们打开网络的情况下,点击按钮