交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
aop第1 章:java代理
分享
未结
0
740
李延
LV6
2021-05-16
悬赏:20积分
# 内容说明 我们使用的aop就是基于代理的思想,方面我们快速的面向切面编程。在这一章节中,我们就介绍一下不使用aop的情况下如何使用代理,方便我们理解下面的源码。 # 示例 下面分别是3种不同的代理示例。 1.静态代理 2.java动态代理 3.cglib动态代理 ```java public class ProxyTest { /** * 静态代理 * */ public static class StaticProxy{ public static void main(String[] args) { AdminService adminService = new AdminServiceImpl(); AdminService adminServiceProxy = new AdminServiceProxy(adminService); adminServiceProxy.find(); adminServiceProxy.update(); } public interface AdminService{ void update(); Object find(); } public static class AdminServiceImpl implements AdminService{ public void update() { System.out.println("修改管理系统数据"); } public Object find() { System.out.println("查看管理系统数据"); return new Object(); } } public static class AdminServiceProxy implements AdminService { private AdminService adminService; public AdminServiceProxy(AdminService adminService) { this.adminService = adminService; } public void update() { System.out.println("判断用户是否有权限进行update操作"); adminService.update(); System.out.println("记录用户执行update操作的用户信息、更改内容和时间等"); } public Object find() { System.out.println("判断用户是否有权限进行find操作"); System.out.println("记录用户执行find操作的用户信息、查看内容和时间等"); return adminService.find(); } } } public static class DynamicProxy{ public static class AdminServiceInvocation implements InvocationHandler { private Object target; public AdminServiceInvocation(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("判断用户是否有权限进行操作"); Object obj = method.invoke(target); System.out.println("记录用户执行操作的用户信息、更改内容和时间等"); return obj; } } public static void main(String[] args) { StaticProxy.AdminService adminService = new StaticProxy.AdminServiceImpl(); StaticProxy.AdminService target = new StaticProxy.AdminServiceImpl(); AdminServiceInvocation invocation = new AdminServiceInvocation(adminService); StaticProxy.AdminService proxy2 = (StaticProxy.AdminService) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), invocation); Object obj2 = proxy2.find(); System.out.println("find 返回对象:" + obj2.getClass()); System.out.println("----------------------------------"); proxy2.update(); } } public static class CglibProxy{ public static class CglibProxyTest { public static void main(String[] args) { AdminCglibService target = new AdminCglibService(); AdminServiceCglibProxy proxyFactory = new AdminServiceCglibProxy(target); AdminCglibService proxy = (AdminCglibService)proxyFactory.getProxyInstance(); System.out.println("代理对象:" + proxy.getClass()); Object obj = proxy.find(); System.out.println("find 返回对象:" + obj.getClass()); System.out.println("----------------------------------"); proxy.update(); } } public static class AdminCglibService { public void update() { System.out.println("修改管理系统数据"); } public Object find() { System.out.println("查看管理系统数据"); return new Object(); } } public static class AdminServiceCglibProxy implements MethodInterceptor { private Object target; public AdminServiceCglibProxy(Object target) { this.target = target; } //给目标对象创建一个代理对象 public Object getProxyInstance() { //工具类 Enhancer en = new Enhancer(); //设置父类 en.setSuperclass(target.getClass()); //设置回调函数 en.setCallback(this); //创建子类代理对象 return en.create(); } public Object intercept(Object object, Method method, Object[] arg2, MethodProxy proxy) throws Throwable { System.out.println("判断用户是否有权限进行操作"); Object obj = method.invoke(target); System.out.println("记录用户执行操作的用户信息、更改内容和时间等"); return obj; } } } } ```
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号