Spring静态代理再理解(狂神)

先上代码:

1、接口

package com.qi.demo02;

//抽象角色接口
public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void query();
}

2、真实的对象

package com.qi.demo02;

//真实的对象 去实现抽象角色接口
public class UserServiceImpl implements UserService{

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

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

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

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

3、客户端

package com.qi.demo02;

//客户端访问代理角色
public class Client {
    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();
        userService.add(); //这样的话我们只会输出业务的具体内容

     
    }
}

4、结果

现在有个要求:

公司给了个任务:在实现增删改查业务的前面都添加一个日志。

方法一(跑路):可以在业务代码里面直接添加,如:System.out.println("【Debug】使用了add方法!");

package com.qi.demo02;

//真实的对象 去实现抽象角色接口
public class UserServiceImpl implements UserService{

    public void add() {
        System.out.println("【Debug】使用了add方法!");
        System.out.println("增加了一个用户!");
    }

    public void delete() {
        System.out.println("【Debug】使用了delete方法!");
        System.out.println("删除了一个用户!");
    }

    public void update() {
        System.out.println("【Debug】使用了update方法!");
        System.out.println("修改了一个用户!");
    }

    public void query() {
        System.out.println("【Debug】使用了query方法!");
        System.out.println("查询了一个用户!");
    }
}


但是这会改变原来的业务代码,这是公司的最大禁止。这时我们可以用 代理 来实现在增删改查业务的前面添加日志功能。

方法二、正确的做法:用代理

结构:

1、接口

package com.qi.demo02;

//抽象角色接口
public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void query();
}

2、真实角色

package com.qi.demo02;

//真实的对象 去实现抽象角色接口
public class UserServiceImpl implements UserService{

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

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

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

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

3、代理角色

package com.qi.demo02;

//代理角色,也去做增删改查业务
public class UserServiceProxy implements UserService{

    //代理真实角色
    private UserServiceImpl userService;

    //Spring推荐用set方法注入,只需要调UserServiceProxy.setUserService即可
    public void setUserService(UserServiceImpl userService) {
        this.userService = userService;
    }

    public void add() {
        log("add");
        userService.add(); //这个还是真实角色的增删改业务,只是给代理角色管理了(托管)

    }

    public void delete() {
        log("delete");
        userService.delete();

    }

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

    }

    public void query() {
        log("query");
        userService.query();

    }

    //添加一个日志方法
    public void log(String msg){
        System.out.println("【DeBug】使用了"+msg+"的方法");

    }

}

4、客户端代理角色调用真实角色

package com.qi.demo02;

//客户端访问代理角色
public class Client {
    public static void main(String[] args) {
        //真实角色
        UserServiceImpl userService = new UserServiceImpl();
        //userService.add(); //这样的话我们只会输出业务的具体内容

        /*
        公司给了个任务:在实现增删改查业务的前面都添加一个日志。
        可以在业务代码里面直接添加,如:System.out.println("【Debug】使用了add方法!");
        但是这会改变原来的业务代码,这是公司的最大禁止。这时我们可以用代理来实现在增删改查业务的前面添加日志功能。
        public void add() {
            System.out.println("【Debug】使用了add方法!");
            System.out.println("增加了一个用户!");
        }
        */

        //代理角色。拿到真实角色
        UserServiceProxy proxy = new UserServiceProxy();
        proxy.setUserService(userService);

        //代理角色调用真实角色的增删改业务
        proxy.add();
        proxy.delete();
        proxy.update();
        proxy.query();

    }
}

输出结果:

实现公司添在增删改查业务前面加日志的需求。

聊聊AOP:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值