先上代码:
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: