静态代理
来源:互联网 发布:工商管理就业知乎 编辑:程序博客网 时间:2024/05/22 13:15
静态代理
1、静态代理的角色分析:
抽象角色 ------ 一般使用接口或者抽象类来实现 。
真实角色 ------ 被代理角色 。
代理角色 ------ 代理真实角色 (代理真实角色后一般会做一些附属操作,比如房屋中介的附属操作是带人看房,收中 介费)
客户 ------ 使用代理角色来进行一些操作 。
2、代码实现:
项目结构如下:
Rent.java --- 抽象角色
package cn.myspring.staticproxy;public interface Rent {/** * 房屋出租 */public void rent() ;}
Host.java --- 真实角色
package cn.myspring.staticproxy;/** * 房东 */public class Host implements Rent{@Overridepublic void rent() {System.out.println("房屋出租");}}
Proxy.java --- 代理角色
package cn.myspring.staticproxy;/** * 中介 */public class Proxy implements Rent {private Host host;public Proxy() {}public Proxy(Host host) {super();this.host = host;}public void setHost(Host host) {this.host = host;}@Overridepublic void rent() {seeHouse() ;host.rent();fare() ;}//看房private void seeHouse() {System.out.println("带房客看房");}//收中介费private void fare() {System.out.println("收取中介费");}}
Client.java --- 客户
package cn.myspring.staticproxy;/** * 租客 */public class Client {public static void main(String[] args) {Host host = new Host() ;Proxy proxy = new Proxy(host) ;proxy.rent() ;}}
控制台打印运行结果
3、使用静态代理的好处:
使得真实角色处理的业务更加纯粹,不在去关注一些公共的事情。
公共的业务由代理来完成 --- 实现业务的分工。
公共业务发生扩展时,更加集中和方便 。
缺点:
类多了 --- 多代理类,工作量变大,开发效率变低了。
解决静态代理的这些缺点的办法是,使用动态代理。
动态代理
分为两类:
1、基于接口的动态代理 -- JDK动态代理。
2、基于类的动态代理 -- cglib 。
现在大多使用javasist来生成动态代理。
3、jdk动态代理 --- Proxy类和invocationHandler接口
态代理是代理接口的,只要有接口就能代理
下面来看看具体的例子:
项目结构如图:
动态代理类ProxyInocationHandler代码:
package cn.my.dynamicproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * 动态代理类 */public class ProxyInocationHandler implements InvocationHandler {private Object target;// 真实对象public void setTarget(Object target) {this.target = target;}/** * 生成代理类 * * @return */public Object getProxy() {return Proxy.newProxyInstance(this.getClass().getClassLoader(),this.target.getClass().getInterfaces(), this);}/** * proxy:代理类 ; method:代理类的调用处理程序的方法对象 */@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {log(method.getName()) ;// target是真实对象Object result = method.invoke(target, args);return result;}public void log(String methodName) {System.out.println("执行" + methodName + "方法");}}
房屋出租接口--抽象角色 Rent代码:
package cn.my.dynamicproxy;public interface Rent {/** * 出租房屋 */public void rent() ;}
房屋拥有者--真实角色 Host代码:
package cn.my.dynamicproxy;/** * 房东 */public class Host implements Rent{@Overridepublic void rent() {System.out.println("房屋出租");}}
另一个抽象角色UserService代码:
package cn.myspring.service;/** * 抽象角色 */public interface UserService {public void add() ;public void update() ;public void delete() ;public void search() ;}
真实角色UserServiceImpl代码:
package cn.myspring.service;/** * 真实角色 */public class UserServiceImpl implements UserService {@Overridepublic void add() {System.out.println("增加用户");}@Overridepublic void update() {System.out.println("修改用户");}@Overridepublic void delete() {System.out.println("删除用户");}@Overridepublic void search() {System.out.println("查询用户");}}
客户端角色Client代码:
package cn.my.dynamicproxy;import cn.myspring.service.UserService;import cn.myspring.service.UserServiceImpl;/** * 租客 */public class Client {public static void main(String[] args) {//动态代理类ProxyInocationHandler pih = new ProxyInocationHandler() ;//真实角色类Host host = new Host() ;pih.setTarget(host) ;//Rent的代理对象Rent proxy = (Rent) pih.getProxy() ;proxy.rent() ;//真实角色类UserService userService = new UserServiceImpl() ;pih.setTarget(userService) ;//UserService的代理对象UserService uproxy = (UserService) pih.getProxy() ;System.out.println("---------------------------");uproxy.add() ;System.out.println("---------------------------");uproxy.update();System.out.println("---------------------------");uproxy.delete() ;System.out.println("---------------------------");uproxy.search() ;}}
运行Client代码,控制台打印信息如下:
态代理是代理接口的,只要有接口就能代理
比如下面:
其中这个打印信息 : 执行 。。。方法 , 是动态代理类ProxyInocationHandler中的log日志方法打印的
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 静态代理
- 简述CDN原理
- mybatis+spring boot, mapper 提示Could not autowire. No beans of … type found
- MySql 申明变量以及赋值
- RE:JAVA学习-了解内存管理+继承的意义
- FPGA功能仿真,门级仿真,后仿真的区别
- 静态代理
- Oracle执行出现正在提交的原因及解决办法
- Unity3D 脚本实现动画效果
- Apache Flink:详细入门
- LeetCode 560. Subarray Sum Equals K
- C++STL复习
- Bloom Filter(布隆过滤器)的概念和原理
- kill bugs
- spring aop基础