java动态代理及spring框架的aop

什么是动态代理

举个例子,生活中一般在打官司的时候都会请代理律师,为什么要请律师呢?是因为开庭的时候大部人对于打官司没有经验,只会说出自己案件的陈述,并不会根据法律等争取自己权益的最大化,此时就可以请律师帮助自己不仅完成对案件的陈述,还能争取权益最大化。那么Java中也是一样,如果要对功能进行增强就可以使用动态代理

为什么要用动态代理

动态代理作为一种设计模式,其主要功能是在不改变目标对象的原始代码的情况下,动态地增加一些额外的操作。常见的应用场景包括:
事务管理:通过动态代理,在方法执行前后开启、提交或回滚事务;
缓存:通过动态代理,在调用目标方法时先查询缓存,如果缓存中有结果则直接返回,否则再调用目标方法并将结果保存到缓存中;
日志记录:通过动态代理,在调用目标方法前后记录相关日志信息;
权限控制:通过动态代理,在调用目标方法前进行权限验证,如果没有权限则抛出异常或返回错误信息。
使用动态代理可以大大减少重复的代码量,提高代码的重用性和可维护性,同时也可以将关注点(如事务管理、缓存、日志记录等)与业务逻辑分离开来,使得代码更加清晰易懂。

举例

请看如下例子,一个演员的本质工作是做音乐表演、舞蹈表演、娱乐表演等,但是目前疫情管控,演出前不得不配合政府做好防疫管控。最基本的实现方法是直接对方法进行改造,添加对应的功能。

1.因为Proxy类必须基于接口进行动态代理,所以首先创建接口,定义接口的规范,即功能方法的定义。

package com.yyz.service.impl;

import com.yyz.service.Actor;

public class ActorImpl implements Actor {
   

    @Override
    public void musicAct(int money) {
   
//        System.out.println("核酸检测...........");
//        System.out.println("健康码检测........");
//        System.out.println("行程码检测");
        System.out.println("音乐消费...." +money);

    }

    @Override
    public void danceAct(int money) {
   
//        System.out.println("核酸检测...........");
//        System.out.println("健康码检测........");
//        System.out.println("行程码检测");
        System.out.println("跳舞消费...." +money);

    }

    @Override
    public void yuLeAct(int money) {
   
//        System.out.println("核酸检测...........");
//        System.out.println("健康码检测........");
//        System.out.println("行程码检测");
        System.out.println("娱乐消费...." +money);

    }
}

2.这样操作发现出现了大量重复的代码,如果有十处、一百处需要同样的处理那么代码需要重复十次、一百次。当然我们可以把这些功能封装成一个增强方法,然后在功能方法中进行调用,但是也出现了方法的十处、一百处的调用操作,一旦增强方法名字改变,就需要完成所有调用处代码的修改。或者有一天不需要这些增强操作
2.了,就再次需要在这十处、一百处删除方法调用。所以这种操作不适用于大型的项目开发的需求,此时我们就必须使用Java的动态代理机制。

在Java开发中如果一个类中的方法在基本功能之外需要进行功能扩充或者功能增强,如:事务控制、权限判断、日志记录等等操作,此时可以使用动态代理机制。Java的JDK中Proxy类可以实现基于接口的动态代理,实现步骤示例如下:

1.因为Proxy类必须基于接口进行动态代理,所以首先创建接口,定义接口的规范,即功能方法的定义。

package com.yyz.service;

public interface Actor {
   
    void musicAct(int money);

    void danceAct(int money);

    void yuLeAct(int money);

}

2.定义实现接口的子类,实现接口定义的方法,此方法只需要把核心功能实现即可,其他增强的操作可以在代理类中实现。

package com.yyz.service.impl;

import com.yyz.service.Actor;

public class ActorImpl implements Actor {
   

    @Override
    public void musicAct(int money) {
   
        System.out.println("音乐消费...." +money)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的甘蔗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值