Aop动态代理解决问题
使用动态代理解决上述问题
代理设计模式的原理: 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象. 任何对原始对象的调用都要通过代理. 代理对象决定是否以及何时将方法调用转到原始对象上.
package com.learn.spring.aop;public interface ArithmeticCalculator {public int add(int i, int j );public int sub(int i, int j );public int mul(int i, int j );public int div(int i, int j );
}
package com.learn.spring.aop;public class ArithmeticCalculatorImpl implements ArithmeticCalculator {@Overridepublic int add(int i, int j) {int result = i + j ;return result;}@Overridepublic int sub(int i, int j) {int result = i - j ;return result; }@Overridepublic int mul(int i, int j) {int result = i * j ;return result;}@Overridepublic int div(int i, int j) {int result = i / j ;return result;}}
package com.learn.spring.aop;public class ArithmeticCalculatorLoggingImpl implements ArithmeticCalculator {@Overridepublic int add(int i, int j) {//System.out.println("learn==>The method add begins with ["+i+","+j+"]");int result = i + j ;//System.out.println("learn==>The method add ends with "+ result );return result;}@Overridepublic int sub(int i, int j) {System.out.println("learn==>The method sub begins with ["+i+","+j+"]");int result = i - j ;System.out.println("learn==>The method sub ends with "+ result );return result; }@Overridepublic int mul(int i, int j) {System.out.println("learn==>The method mul begins with ["+i+","+j+"]");int result = i * j ;System.out.println("learn==>The method mul ends with "+ result );return result;}@Overridepublic int div(int i, int j) {System.out.println("learn==>The method div begins with ["+i+","+j+"]");int result = i / j ;System.out.println("learn==>The method div ends with "+ result );return result;}}
package com.learn.spring.aop;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;//代理类
public class ArithmeticCalculatorLoggingProxy {//1.被代理的对象 目标对象private ArithmeticCalculator target ; // 实际上是ArithmeticCalculatorImpl对象.//通过构造器的方式将目标对象传入public ArithmeticCalculatorLoggingProxy(ArithmeticCalculator target){this.target = target ;}//获取代理对象public ArithmeticCalculator getLoggingProxy(){//定义代理对象ArithmeticCalculator proxy ;/*** loader: ClassLoader 类加载器* interfaces: 目标类的所有接口,目的是获取接口中的方法* h: InvocationHandler*/ClassLoader loader = target.getClass().getClassLoader();Class[] interfaces = target.getClass().getInterfaces();InvocationHandler h = new InvocationHandler() {/*** proxy:代理对象 在invoke方法中一般不会用* method:正在调用的方法* args:调用方法传入的参数*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {String methodName = method.getName();//加日志System.out.println("learn===>The method "+methodName+" begins with "+ Arrays.asList(args));//执行目标方法Object result = method.invoke(target, args);//加日志System.out.println("learn===>The method "+methodName+" ends with " + result );return result;}};proxy = (ArithmeticCalculator)Proxy.newProxyInstance(loader, interfaces, h);return proxy ;}}
package com.learn.spring.aop;public class Main {public static void main(String[] args) {//目标对象ArithmeticCalculator target = new ArithmeticCalculatorImpl();//获取代理对象ArithmeticCalculator proxy = new ArithmeticCalculatorLoggingProxy(target).getLoggingProxy();System.out.println("proxy:" + proxy.getClass().getName());int result = proxy.add(1, 1); // 实际上要去执行invoke方法System.out.println("result=====>"+result);}
}
Aop动态代理解决问题相关推荐
- AOP动态代理的实现机制
2019独角兽企业重金招聘Python工程师标准>>> 1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字 ...
- spring中AOP动态代理的两种方式
AOP动态代理的两种方式 Spring AOP动态代理的方式(spring的AOP默认是JDK Proxy) 浅谈这两种动态代理 JDK的动态代理,需要有实现接口 动态代理--JDK Proxy ⚫ ...
- Spring AOP源码解析——AOP动态代理原理和实现方式
2019独角兽企业重金招聘Python工程师标准>>> Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和 ...
- Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题
Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题 参考文章: (1)Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代 ...
- Spring AOP动态代理
导入依赖: <dependency><groupId>org.springframework</groupId><artifactId>spring-a ...
- AOP||动态代理||AOP专业术语;
AOP:(Aspect Oriented Programming)面向切面编程: OOP:(Object Oriented Programming )面向对象编程: 面向切面编程:基于OOP基础之上新 ...
- [Spring手撸专栏学习笔记]——把AOP动态代理,融入到Bean的生命周期
本文是学习<Spring 手撸专栏>第 10 章笔记,主要记录我的一些debug调试过程,方便后期复习.具体学习,大家可以去看一下这个专栏,强烈推荐. 方案 其实在有了AOP的核心功能实现 ...
- Spring之AOP动态代理详解
动态代理 动态代理和静态代理角色一样 动态代理类是动态生成的,不是我们直接写好的. 动态代理分为两大类:基于接口的动态代理:JDK动态代理[我们在这里使用]基于类的动态代理:cglibjava字节码: ...
- spring aop 动态代理模拟
CGLIB 动态代理 public class HouserHost { public void rentHouse() { System.out.println("出租房屋了") ...
最新文章
- Xilinx基于模型的设计工具—Model Composer
- LeetCode Factorial Trailing Zeroes(计算阶乘结果尾部有几个0)
- MySql的安装、配置(转)
- 关于SQL的几个备忘
- Keras MNIST
- 高并发负载均衡(一):网络协议原理
- LeetCode之Happy Number
- urlconnection java_java成神之——HttpURLConnection访问api
- java求指数与对数
- Http协议规范及格式
- qt中将数据存入文档再读出------------ writeRawData 与readRawData成对使用
- 通过高德地图获取 经纬度 以及地理位置等
- 港交所、中芯国际、京东、诺基亚等公司高管变动
- 三角形度数计算机公式,三角形角度计算公式
- [proxy:0:0@WORKSTATION-DEV] HYDU_sock_write (utils/sock/sock.c:256): write error (Broken pipe)
- 出现Ncat: bind to 0.0.0.0:9999: Address already in use. QUITTING.如何解决?
- cad修改快捷键_【扮家家云渲染】CAD快捷键修改干货教程
- RPA 项目经验分享
- MES系统价格具体跟哪些因素相关?
- EventLog Analyzer应用程序日志管理