1.代理模式
为什么我们要学习代理模式呢?因为这就是SpringAOP的底层!【面试必问的SpringAOP和SpringMVC】
代理的模式的分类:
- 静态代理
- 动态代理
1.1静态代理
角色分析:
- 抽象角色:一般会使用接口或者抽象类来解决
- 真实角色:被代理的角色
- 代理角色:代表真实的角色,代理真实角色后,我们一般会做一些附属操作
- 客户:访问代理模式的人
代码:
1.接口
package com.lwq.demo01;
/**
* @author
* @since 2020/6/11 21:08
*/
//租房的接口
public interface Rent {
public void rent();
}
2.真实角色
package com.lwq.demo01;
/**
* @author
* @since 2020/6/11 21:08
*/
//房东
public class Host implements Rent {
public void rent() {
System.out.println("房东要出租房子····");
}
}
3.代理角色
package com.lwq.demo01;
/**
* @author
* @since 2020/6/11 21:10
*/
public class Proxy implements Rent { //中介也要帮房东租房子
private Host host;
public Proxy() {
}
public Proxy(Host host) {
this.host = host;
}
public void rent() {
seeHouse();
fare();
contract();
host.rent();
}
//看房
public void seeHouse(){
System.out.println("中介带你看房");
}
//收中介费
public void fare(){
System.out.println("收中介费");
}
//收中介费
public void contract(){
System.out.println("签租房合同");
}
}
4.访问代理角色的对象
package com.lwq.demo01;
/**
* @author
* @since 2020/6/11 21:09
*/
public class Client {
public static void main(String[] args) {
//房东要租房子
Host host = new Host();
//代理,中介帮房东租房子,代理一般会有一些附属操作(比如中介费)
Proxy proxy = new Proxy(host);
//你不用找房东,直接找中介租房即可
proxy.rent();
}
}
代理模式的好处:
- 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
- 公共业务就交给了代理角色(中介),实现了业务的分工!
- 公共业务发生扩展的时候,方便集中管理!
缺点:
- 一个真实角色就会产生一个代理模式;代理量会翻倍,开发速度会变慢
1.2 静态代理加深理解
代码
接口
package com.lwq.demo02;
/**
* @author
* @since 2020/6/13 14:09
*/
public interface UserService {
public void addUser();
public void deleteUser();
public void updateUser();
public void queryUser();
}
实现类
package com.lwq.demo02;
/**
* @author
* @since 2020/6/13 14:11
*/
//真实对象
public class UserServiceImpl implements UserService {
public void addUser() {
System.out.println("增加了一个用户");
}
public void deleteUser() {
System.out.println("删除了一个用户");
}
public void updateUser() {
System.out.println("修改了一个用户");
}
public void queryUser() {
System.out.println("查询了一个用户");
}
}
测试类
package com.lwq.demo02;
/**
* @author
* @since 2020/6/13 14:14
*/
public class Client {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
UserServiceProxy proxy = new UserServiceProxy();
proxy.setUserService((UserServiceImpl) userService);
proxy.updateUser();
}
}
代理类(在不改变实现类的基础上,增加功能)
package com.lwq.demo02;
/**
* @author
* @since 2020/6/13 14:21
*/
public class UserServiceProxy implements UserService {
private UserServiceImpl userService;
public UserServiceImpl getUserService() {
return userService;
}
public void setUserService(UserServiceImpl userService) {
this.userService = userService;
}
public void addUser() {
log("addUser");
userService.addUser();
}
public void deleteUser() {
log("deleteUser");
userService.deleteUser();
}
public void updateUser() {
log("updateUser");
userService.updateUser();
}
public void queryUser() {
log("queryUser");
userService.queryUser();
}
//日志方法
public void log(String msg) {
System.out.println("使用了" + msg + "方法");
}
}
1.3动态代理
- 动态代理和静态代理的角色一样
- 动态代理的类是动态生成的,不是我们写好的
- 动态代理分为两大类:基于接口的动态代理,基于类的动态代理
基于接口-----JDK的动态代理
基于类:cglib
java字节码实现:javassist
需要了解两个类:Proxy:代理, InvocationHandler:调用处理程序
动态代理的好处:
- 可以使真实角色的操作更加纯粹!不用去关注一些公共的业务
- 公共业务就交给了代理角色(中介),实现了业务的分工!
- 公共业务发生扩展的时候,方便集中管理!
- 一个动态代理类代理的是一个接口,一般就是对应的一类业务
- 一个动态类可以代理多个类,只要是实现了一个接口即可