• Aop面向切面编程


     

     

    aop在spring中的作用

     

    • 提供声明式事务,允许用户自定义切面
    • 横切关注点:跨域引用程序多个模块的方法或功能,即是,与我们业务逻辑无关的,但是我们需要
    • 关注的部分,就是横切关注点,如日志,安全,缓存,事务等等。
    • 切面:aspect :横切关注点,被模块化的特殊对象,即,它是一个类
    • 通知:切面必须要完成的工作,它是类中一个方法
    • 目标:被通知对象
    • 代理:向目标对象引用通知之后创建的对象,
    • 切入点:切面通知执行的地点的定义,
    • 连接点:与切入点匹配的执行点。

     

     

    如图所示:

          

     

     

     

     

    即:可以理解为在不改变原有的代码的情况下,去增加新的功能。

     

     

    添加依赖:

    1. org.aspectj
    2. aspectjweaver
    3. 1.9.4

     

    第一种方式:

    首先编写我们的业务接口和实现类

    1. public interface UserService {
    2. //增
    3. public void add();
    4. //删除
    5. public void delete();
    6. //改
    7. public void update();
    8. // 查
    9. public void select();
    10. }

     

     

     

    实现类

    1. public class UserServiceImpl implements UserService{
    2. @Override
    3. public void add() {
    4. System.out.println("增加一个用户");
    5. }
    6. @Override
    7. public void delete() {
    8. System.out.println("删除了一个用户");
    9. }
    10. @Override
    11. public void update() {
    12. System.out.println("更新了一个用户");
    13. }
    14. @Override
    15. public void select() {
    16. System.out.println("查询了一个用户");
    17. }
    18. }

     

     

    然后去写我们的增强类,编写两个一个前置增强,一个后置增强。 

    前置增强:

    1. public class Log implements MethodBeforeAdvice {
    2. //重写接口抽象方法 method 要执行的目标对象的方法
    3. @Override
    4. public void before(Method method, Object[] args, Object target) throws Throwable {
    5. // 参数 //目标对象
    6. // 获取反射对象 然后.getname()
    7. System.out.println(target.getClass().getName()+""+"的"+method.getName()+"被执行了");
    8. }
    9. }

     

     

     

    后置增强:

    1. public class AfterLog implements AfterReturningAdvice {
    2. @Override
    3. public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
    4. System.out.println("执行了"+method.getName()+"方法,返回的结果为:"+returnValue);
    5. }
    6. }

     

     

     

    最后在去spring中注册,并且实现aop切入实现,并且导入约束。 

    1. "1.0" encoding="UTF-8"?>
    2. "http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    4. xsi:schemaLocation="http://www.springframework.org/schema/beans
    5. http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    6. "pointcut" expression="execution(* com.kuang.service.UserServiceImpl.*(..))"/>
    7. "log" pointcut-ref="pointcut"/>
    8. "afterLog" pointcut-ref="pointcut"/>

     

     

     

    测试结果:

     

     

    第二种方式:

    自定义类来实现:

    目标业务不变依旧是:userServiceImpl

    第一步:写我们自己的一个切入类,

    1. // 自定义一个类,变成他的切面。
    2. public class DiyPointCut {
    3. public void before(){
    4. System.out.println("*****方法执行前**********88");
    5. }
    6. public void after(){
    7. System.out.println("*****方法执行后************");
    8. }
    9. }

     

    到spring中去配置:

    1. "diy" class="com.kuang.diy.DiyPointCut"/>
    2. "diy"
    3. >
    4. "point" expression="execution(* com.kuang.service.UserServiceImpl.*(..))"/>
    5. "before" pointcut-ref="point"/>
    6. "after" pointcut-ref="point"/>

     

    测试结果:

     

    '

  • 相关阅读:
    Scss
    神经网络梯度是什么意思,神经网络输出层节点数
    Ubuntu20.04+1080Ti通过docker进行NVIDIA GPU环境搭建
    Python的常用排序算法实现
    深入理解Linux网络笔记(四):内核是如何发送网络包的
    本地虚拟机centos7通过docker安装主从redis3.2
    【Android,Kotlin,TFLite】移动设备集成深度学习轻模型TFlite(物体检测篇)
    Android的六大布局详解
    LeetCode 面试题 04.08. 首个共同祖先
    数据结构--排序(2)
  • 原文地址:https://blog.csdn.net/qq_54250695/article/details/134056990