Spring AOP的实现

代理模式

        在了解AOP之前,我们先了解一种设计模式:代理模式

·       代理模式是AOP实现的底层原理

那么使用代理模式和不使用代理模式有什么区别?代理模式能给我们带来什么?

        我们先使用一个web中常用到的业务案例来说一下,在web开发中常见的业务是,我们需要对数据库crud,这里我们简单模拟一下

  创建一个接口定义规范

package com.sheng.demo2;

public interface UserServise {
    public void add();
    public void delect();
    public void update();
    public void select();
}

创建一个接口实现类 

package com.sheng.demo2;

public class UserServiceImpl implements UserServise {
    public void add() {
        System.out.println("增加了一个用户");
    }

    public void delect() {

        System.out.println("删除了一个用户");
    }

    public void update() {

        System.out.println("修改了一个用户");
    }

    public void select() {

        System.out.println("查询了一个用户");
    }
}

   创建一个测试类

package com.sheng.demo2;

public class Client {
    public static void main(String[] args) {
       UserServiceImpl userService=new UserServiceImpl();
        userService.add();
        userService.select();
        userService.update();
        userService.delect();
    }
}

结果如下: 

业务要求,我现在已经实现完毕 。 程序运行的很好,可是不久后,用户或者公司有新的要求,比如说,我要监听你的增删改查啥时候在用的,怎么办?加呗!那么我们增加业务(简单实现一下)。

        根据要求,我们对接口的实现类做出修改

package com.sheng.demo2;

public class UserServiceImpl implements UserServise {
    public void add() {
        System.out.println("使用了add");
        System.out.println("增加了一个用户");
    }

    public void delect() {
        System.out.println("使用了delect");
        System.out.println("删除了一个用户");
    }

    public void update() {
        System.out.println("使用了update");
        System.out.println("修改了一个用户");
    }

    public void select() {
        System.out.println("使用了select");
        System.out.println("查询了一个用户");
    }
}

好了,老板和用户的业务需求我完成了, 

又过了一段时间,老板或者客户又有新的需求了,我要你在用户调用增删改查的时候显示出当前时间(自己随便列的需求),

你听着一乐,按照老办法,在add,delect,update,select中分别加入可以显示当前时间的代码,可是随着时间的推移,业务需求的增多,你发现自己的老办法,好费劲啊,每次增加一个需求我都要在源代码上修改,代码多了,本来我能完整运行的代码,那一天你给我搞崩了咋办。

我问你哈,当年在做一件事情的时候,这个事务越来越多,变得繁忙,你会怎么想,你会想,哎呀,这个时候要是有个人能来帮我办事,我自己不用管多好啊。

再比如啊,你是一家房子的房东,出租房子打了半个月的广告,无人问津,这个时候你想再麻烦自己了,我去找中介,让中介去帮我找客户 ,自己不就舒服了。

那咱们怎么就不能效仿咧,我们来试试

还是

  •         定义一个规范化的接口如上的UserService
  •         定义一个实现接口类的实例如上的UserServiceImpl

那好,现在老板让你去实现一下,你在增删改查时候的监听,啥时候用的,你一听,怎么又有需求啊,那不行我得找个代理去帮我实现,嘿,好戏来了,那么这个时候代理需要干什么?首先肯定要实现你现有的业务你们共同要实现的,增删改查,然后咧,当然是要代理去实现一个日志啦,啥时候调用的增删改查,这就是你的需求啊,、

        那好,定义一个代理类

package com.sheng.demo2;

public class UserServiceProxy implements UserServise{

    UserServiceImpl userService;

    public void setUserService(UserServiceImpl userService) {
        this.userService = userService;
    }

    public void add() {
        userService.add();
    }

    public void delect() {
        userService.delect();
    }

    public void update() {
        userService.update();
    }

    public void select() {
        userService.select();
    }

   
}

很明显我们的代理类同样需要实现我们定义的规范化接口,因为这个接口是我们要共同实现的,并且在代理类中我们需要知道一个对象,什么对象?我总得要知道是谁找得代理吧,我要去帮谁实现扩展业务,所有需要UserServiceImpl对象

         有了新的需求,那么我们的代理类就要行动了,增加代码如下

package com.sheng.demo2;

public class UserServiceProxy implements UserServise{

    UserServiceImpl userService;

    public void setUserService(UserServiceImpl userService) {
        this.userService = userService;
    }

    public void add() {
        log("add");
        userService.add();
    }

    public void delect() {
        log("delect");
        userService.delect();
    }

    public void update() {
        log("update");
        userService.update();
    }

    public void select() {
        log("select");
        userService.select();
    }

    //日志方法
    public voi
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值