AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。

AOP配置示例:

需要的包:aspectjweaver-1.8.4.jar

数据访问层:

package com.hanqi.dao;public class AppuserDao {public int deleteUser(int ids) {System.out.println(ids +"被删除");yichang();//抛出一个异常return 1;}public void yichang() {throw new RuntimeException("出现错误!");}
}

切面代理层:

package com.hanqi.util;public class LogginProxy {public void beforeMethod() {System.out.println("方法之前被调用!");}public void afterMethod() {System.out.println("方法之后被调用!");}public void returnMethod() {System.out.println("返回结果时被调用!");}public void throwMethod() {System.out.println("抛出异常时被调用!");}/*public void aroundMethod() {System.out.println("方法被调用");}*/
}

spring.xml配置AOP

?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"><bean id="logginProxy" class="com.hanqi.util.LogginProxy"></bean><bean id="appuserdao" class="com.hanqi.dao.AppuserDao"></bean><aop:config><!-- 配置切点 --><aop:pointcutexpression="execution(* com.hanqi.dao.*.*(..))" id="aoppointcut" /><!--execution:执行,这句意为在执行com.hanqi.dao下的所有类时都会执行切面类--><!-- 指明切面类 --><aop:aspect ref="logginProxy"><aop:before method="beforeMethod"  pointcut-ref="aoppointcut"/><aop:after method="afterMethod" pointcut-ref="aoppointcut"/><aop:after-returning method="returnMethod" pointcut-ref="aoppointcut"/><aop:after-throwing method="throwMethod" pointcut-ref="aoppointcut"/>    </aop:aspect></aop:config>
</beans>

JUnit Test测试:

package com.hanqi.util;import static org.junit.jupiter.api.Assertions.*;import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.hanqi.dao.AppuserDao;class JUnittest {private ClassPathXmlApplicationContext c;private AppuserDao appuserdao;@BeforeEachvoid setUp() throws Exception {c = new ClassPathXmlApplicationContext("spring.xml");appuserdao = c.getBean(AppuserDao.class);}@AfterEachvoid tearDown() throws Exception {c.close();}@Testvoid test() {appuserdao.deleteUser(55);}}

打印结果:

使用注解配置AOP

spring.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"><context:component-scan base-package="com.hanqi"></context:component-scan><!--配置扫描器-->
</beans>

数据访问层:

package com.hanqi.dao;import org.springframework.stereotype.Repository;@Repository//加到spring容器中,id名默认为类名首字母小写
public class AppuserDao {public int deleteUser(int ids) {System.out.println(ids +"被删除");yichang();return 1;}public void yichang() {throw new RuntimeException("出现错误!");}
}

AppuserService类:

package com.hanqi.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;import com.hanqi.dao.AppuserDao;
@Repository
public class AppuserService {@Autowired//从spring容器中将该类自动放到当前类中的成员变量中,默认的装配类型时byType//@Qualifier("dao")该注解可将bean中id="dao"的类装配到该成员变量中,用于区分当类型相同时;private AppuserDao appuserDao;public int deleteUser(int ids) {return appuserDao.deleteUser(ids);}
}

代理类:

package com.hanqi.util;import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Repository;@Repository//加到spring容器中,id名为类名首字母小写
@Aspect//声明当前类为切面类
@EnableAspectJAutoProxy//自动代理
public class LogginProxy {@Before("execution(* com.hanqi.dao.*.*(..))")//声明切点public void beforeMethod() {System.out.println("方法之前被调用!");}@After("execution(* com.hanqi.dao.*.*(..))")public void afterMethod() {System.out.println("方法之后被调用!");}@AfterReturning("execution(* com.hanqi.dao.*.*(..))")public void returnMethod() {System.out.println("返回结果时被调用!");}@AfterThrowing("execution(* com.hanqi.dao.*.*(..))")public void throwMethod() {System.out.println("抛出异常时被调用!");}/*public void aroundMethod() {System.out.println("方法被调用");}*/
}

测试类:

package com.hanqi.util;import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.hanqi.dao.AppuserDao;
import com.hanqi.service.AppuserService;class JUnittest {private ClassPathXmlApplicationContext c;private AppuserDao appuserdao;private AppuserService appuserService;@BeforeEachvoid setUp() throws Exception {c = new ClassPathXmlApplicationContext("spring.xml");//appuserdao = c.getBean(AppuserDao.class);appuserService = c.getBean(AppuserService.class);}@AfterEachvoid tearDown() throws Exception {c.close();}@Testvoid test() {//appuserdao.deleteUser(55);appuserService.deleteUser(66);}}

转载于:https://www.cnblogs.com/wyc1991/p/9245908.html

JAVA 框架-Spring-AOP面向切面相关推荐

  1. Java绝地求生—Spring AOP面向切面编程

    Java绝地求生-Spring AOP面向切面编程 背景 动态代理 构建被代理对象 自动生成代理 调用动态代理 Spring方法 方式一:使用Spring的API接口 方式二:使用自定义类 方式三:使 ...

  2. Spring AOP面向切面编程

    AOP面向切面编程: AOP(Aspect Oriented Programming),即面向切面编程,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公 ...

  3. java框架013——Spring AOP面向切面编程

    一.Spring AOP简介 AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程).它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编 ...

  4. Spring AOP 面向切面编程

    AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件 ...

  5. Spring AOP(面向切面编程)

    AOP(Aspect Oriented Programming),也就是面向切面编程,作为面向对象编程的一种补充,AOP已经成为一种比较成熟的编程方式.可以这样理解:OOP是从静态角度考虑程序结构,而 ...

  6. JavaEE——Spring AOP(面向切面编程)

    目录 1.面向切面编程(AOP) 2.AOP术语 3.AOP类型 4.AOP 的优势 5.Spring AOP 的代理机制 6.Spring AOP 连接点 7.Spring AOP 通知类型 8.基 ...

  7. Spring Aop面向切面编程自动注入

    1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...

  8. Spring AOP面向切面编程:理解篇(一看就明白)

    一直想着怎么去通俗的讲解AOP,看了一篇文章受到了启发(https://blog.csdn.net/qukaiwei/article/details/50367761),下面我加入自己的理解,咱们来说 ...

  9. Spring AOP 面向切面编程相关注解

    Aspect Oriented Programming 面向切面编程 在Spring中使用这些面向切面相关的注解可以结合使用aspectJ,aspectJ是专门搞动态代理技术的,所以比较专业. 需要在 ...

  10. Spring aop面向切面编程概述

    aop概述 1.AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.将程序中公用代码进行抽离,通过动态代理实现程序功能的统一维护的一种技术.使代码耦合性降低,提高 ...

最新文章

  1. 文巾解题 203. 移除链表元素
  2. laravel翻看php日志,关于Laravel的日志用法
  3. 计算机网络实验(华为eNSP模拟器)——第八章 动态主机配置协议(DHCP)
  4. SAP Customer Data Cloud(Gigya)登录的重定向问题
  5. 刘敏:优麒麟开源操作系统运营实践 | DEV. Together 2021 中国开发者生态峰会
  6. termux 开启 sshd
  7. 实践2.2 内核模块编译
  8. 为什么我tracert经过H3C设备的时候,老是*号,不回包
  9. Windows下安装JDK,配置环境变量
  10. sublime text3 炫酷主题
  11. Java系统程序员修炼之道
  12. 上海电信光猫超级管理员密码后门
  13. 手绘几何图形识别(上)
  14. 黑客游戏Hacknet下载(游戏分享一)
  15. 03_STM32新建工程
  16. 1.学生党如何查找文献书籍
  17. [python] 深度学习基础------人工神经网络实现鸢尾花分类(一)
  18. 在单元格中进行Excel换行的两种方法和取消换行符的方法
  19. IDEA安装激活一条龙服务
  20. python re import_完全搞懂Python 中的 import 与 from import

热门文章

  1. 7添加静态路由 hat red_win7系统使用dos命令添加静态路由的操作方法
  2. PAT_B_1060_Java(25分)
  3. db2 删除存储过程_数据库教程-SQL Server存储过程使用及异常处理
  4. Linux系统开机启动过程分析
  5. cpu和内存之间——地址映射
  6. opencv 创建图像_非艺术家的图像创建(OpenCV项目演练)
  7. usb2.0/3.0/3.1/3.2/4 各版本速率
  8. Detection and Classification of Acoustic Scenes and Events(DCASE2013详细介绍)
  9. 由中行IBM大型机宕机谈银行系统运维
  10. stepinto stepout stepover的区别