Spring阶段性学习总结(十)AOP编程入门学习之动态代理实现代码的优化

1 public interface Calculator {
2     int add(int i, int j);
3     int sub(int i, int j);
4     int mul(int i, int j);
5     int div(int i, int j);
6 }
 1 public class CalculatorImp  implements  Calculator{
 2         /*
 3         * 如果在每个方法中添加想赢的输出日志,那么维护起来相当困难,而且,
 4         * 代码结构也破坏了,掺杂了多余的非功能性代码,所以这种方式不可取。
 5         * 首先使用动态代理的方式解决这个问题,进而引出AOP切面编程的思路
 6         * */
 7     @Override
 8     public int add(int i, int j) {
 9         int result=i+j;
10         return result;
11     }
12
13     @Override
14     public int sub(int i, int j) {
15         int result=i-j;
16         return result;
17     }
18
19     @Override
20     public int mul(int i, int j) {
21         int result=i*j;
22         return result;
23     }
24
25     @Override
26     public int div(int i, int j) {
27         int result=i/j;
28         return result;
29     }
30 }
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class CalculatorLoggingProxy {
    //定义一个构造函数接收Calculator对象
    public CalculatorLoggingProxy(Calculator calculator){
        this.target=calculator;
    }
    //定义一个要代理的对象
    private Calculator target;

    public Calculator getLoggingProxy() {
        Calculator proxy = null;
        //定义一个类加载器,为代理对象服务
        ClassLoader classLoader = target.getClass().getClassLoader();
        //代理对象的类型,即其中有哪些方法
        Class[] interfaces = new Class[]{Calculator.class};
        //当调用代理对象所拥有的方法时,以下代码会被执行
        InvocationHandler h = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                System.out.println("Method:"+method.getName()+" BeginWith:"+ Arrays.asList(args));
                Object result = method.invoke(target, args);
                //Object result = h.invoke(target, args);
                System.out.println("The Method end with :"+result.toString());
                return result;
            }

        };
        proxy = (Calculator) Proxy.newProxyInstance(classLoader, interfaces, h);
        return proxy;
    }
}
 3 public class Main {
 4     public static void main(String[] args) {
 5         Calculator calculator=new CalculatorImp();
 6         Calculator loggingProxy = new CalculatorLoggingProxy(calculator).getLoggingProxy();
 7         int result=loggingProxy.add(1,2);
 8         result=loggingProxy.div(4,2);
 9
10     }
11 }

原文地址:https://www.cnblogs.com/zhang188660586/p/11577801.html

时间: 2024-08-21 23:02:16

Spring阶段性学习总结(十)AOP编程入门学习之动态代理实现代码的优化的相关文章

Struts2+Spring+Ibatis用户注册、登录、管理入门学习实例源码下载

原文:Struts2+Spring+Ibatis用户注册.登录.管理入门学习实例源码下载 源代码下载地址:http://www.zuidaima.com/share/1550463735532544.htm Struts2+Spring+Ibatis用户注册.登录.管理入门学习实例源码下载 项目截图: jar包和sql文件都在源码包中. 运行截图: 用户注册页面: 用户管理页面:

OPENSSL编程入门学习

相关学习资料 http://bbs.pediy.com/showthread.php?t=92649 https://www.openssl.org https://www.google.com.hk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CDoQFjAD&url=http%3a%2f%2fidning-ebook%2egooglecode%2ecom%2fsvn%2ftrunk%2fopenss

3.1、2、3(什么是springAOP)(AOP术语)(JDK动态代理)

2:AOP术语 3:JDK动态代理 原文地址:https://www.cnblogs.com/jiafeng1996/p/12362568.html

Python编程入门学习:最常见加密方式和Python实现

前言 我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes. 所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错. 将字符串和Bytes互相转换可以使用encode()和decode()方法.如下所示: # 方法中不传参数则是以默认的utf-8编码进行转换In [1]: '南北'.encode()Out[1]: b'\xe5\x8d\x97\xe5\x8c\x97'In [2]: b'\xe5\x8d\x97\xe

我整理的一些不错的Java学习书籍和学习教程,送给正在入门学习Java的你!

书籍推荐: 1. Effective Java 3rd Edition 如果你之前都没读过这本书,那么它绝对是你要阅读的第一本书,这个版本按说很早就应该出版了,此版本涵盖了JDK 7.8 和 9 的新特性事实上,我在 2018 年 1 月份就已经入手这本书了,并且花了一周左右的时间来阅读,我会在阅读过程中,寻找新的知识点,特别是关于 Java 8 和 Java 9 的.我从这本书中很好的理解了 Java 的模块化,它也帮我理清了之前对于 Java 8 特性的一些误解.2. Modern Java

Spring AOP详解 、 JDK动态代理、CGLib动态代理

AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中. 一.AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前.类初始化之后.类某个方法调用前.调用后等:一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就成为“连接点”,Spring仅支持方法的连接点,即

【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理

原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中. 一.AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前.类初始化之后.类某个方法调用前.调用后等:一个类

大数据学习:hive篇,入门学习大数据开发

大数据开发之路漫漫其修远兮,吾将上下而求索.对于很多入门学习大数据开发的小伙伴,可能第一个接触到的,是我们的大数据领域的数据仓库工具hive.在大数据生态中,hive一般作为数据仓库来使用. Hive本身是不做数据存储的,它是构建在分布式存储系统HDFS之上,我们平常看到的表数据其实本质上来说还是HDFS的文件. Hive把这些HDFS数据文件,通过元数据规则映射为数据库的表,并且可以提供SQL操作的功能.Hive总体结构比较简单,总体有三个组件:用户接口.元数据系统.驱动器.用户通过用户接口来

【框架】[Spring] 基于Spring框架的Web应用演示(附带cglib工具进行动态代理)

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 前言: Spring也差不多学了Ioc控制反转和实现AOP技术的两种方式了,分享一个学习Spring,用来入门挺好的例子. 如果你是刚刚学习Spring,那么此实例应该可以很好的帮助你应用Spring到Web项目中. 里面的DAO层-提交数据库的事务我并没有使用Spring 的注解功能,而是用spring的AOP来实现的.这样更灵活,其实,框架为我们做的事越多,我们就越受框架的约束