开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
简介
- 代理是常见的设计模式,简单的说他就是控制对一个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理 。 spring中的aop特性就是通过代理类实现的。
静态代理
-
所谓的静态代理就是说在编译前就产生代理类。实际上就是我们手动提供一个实现类。实现类中转发到真实对象中。下面我们简单实现下静态代理
-
逻辑分析:我们的代理实现类构造需要一个真实的实现类。方便代理他所以需要传一个真实的实现类。然后在转发到真实方法前或者后我们自定义了一些自己的行为。 我们实现逻辑很简单。真实实现类有两个方法一个获取用户名,一个注册用户。因为这里是为了模拟所以直接输出注册用户的日志了。getUserName中我们打印了一句获取用户名的日志。registerUser直接拦截了。不进行转发。
jdk动态代理
-
jjdk动态代理通过Proxy进行创建代理对象的。通过java.lang.reflect.InvocationHandler接口控制方法代理拦截的。dk动态代理是Java提供的一种方式,最大的特点是保留了静态代理的风格。jdk动态代理只能代理接口。这也是他和cglib的区别,也是他的缺点。
-
接口类
-
小结 上面的就是静态代理。我们不难发现静态代理有个很大的问题就是代理类很多。而且代理类构造器需要真实类。总结一句话就是代码量很多。代理类必须实现接口的方法。
动态代理
-
因为静态代理的麻烦,静态代理类只能为一个接口服务,所以我们的动态代理就产生了。动态代理是通过反射机制进行方法的代理。这大大方便我们代码的编写。下面我们简单通过两种方式实现动态代理。
-
和jdk代理逻辑一样,先根据方法上BlogLogin注解判断是否要进行登录拦截。这里因为代理的是对象本身所以这里除了获取类上方法的BlogLogin注解,还会获取接口上BlogLogin注解,接口的注解起到默认作用。类上的注解会起到覆盖默认的作用。因为项目的需求我在cglib中登录拦截到未登录并不是抛出异常而是进行自动登录。
总结
- 代理类对于我们使用这来说是无感知的。因为他和委托类继承同一个接口,所以我们在调用的时候方法都是一样的。只不过在代理类内部会在转发到委托类之前和之后进行相应的处理。代理分为静态代理和动态代理。而动态代理我们常见的有jdk动态代理、cglib动态代理。