20160126--springaop

package com.hanqi;

public interface IJiSuanQi {

    public int jia(int a , int b);
    public int jian(int a , int b);
    public int cheng(int a, int b);
    public int chu(int a, int b);

}

IJiSuanQi

package com.hanqi;

public class MyJSQ implements IJiSuanQi {

    @Override
    public int jia(int a, int b) {
        // 记录日志
//        System.out.println("加法调用前");
        return a + b;
    }

    @Override
    public int jian(int a, int b) {
        // 记录日志
//        System.out.println("减法调用前");
        return a - b;
    }

    @Override
    public int cheng(int a, int b) {
        // 记录日志
//        System.out.println("乘法调用前");
        return a * b;
    }

    @Override
    public int chu(int a, int b) {
        // 记录日志
//        System.out.println("除法调用前");
        return a / b;
    }

}

MyJSQ

package com.hanqi;

public class Main {

    public static void main(String[] args) {

        IJiSuanQi jsq = new MyJSQ();

        //生成代理
        LoggingProxy lo = new LoggingProxy(jsq);

        jsq = lo.getProxy();

        System.out.println("加法 = " + jsq.jia(100, 200));
        System.out.println("减法 = " + jsq.jian(100, 200));
        System.out.println("乘法 = " + jsq.cheng(100, 200));
        System.out.println("除法 = " + jsq.chu(100, 20));

    }

}

Main

package com.hanqi;

import java.lang.reflect.*;

/*
 *   代理类
 */
public class LoggingProxy {

    public LoggingProxy(IJiSuanQi target) {
        super();
        this.target = target;
    }

    //要代理的对象,目标对象
    private IJiSuanQi target;

    //应用通知,并产生代理对象
    public IJiSuanQi getProxy()
    {
        IJiSuanQi rtn = null;

        //应用通知
//        ClassLoader        //类加载器
        ClassLoader cl = target.getClass().getClassLoader();

        Class[] al = new Class[] {IJiSuanQi.class};

        InvocationHandler ih = new InvocationHandler() {

            /*
             * proxy: 代理对象,一般不使用该对象
             *  method:正在被调用的方法
             *  args: 调用方法传入的参数
             */

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                // 加通知  日志
                System.out.println(method.getName() + "开始调用");

                //反射调用
                Object obj = method.invoke(target, args);

                // 加通知  日志
                System.out.println(method.getName() + "结束调用");

                return obj;
            }
        };

        //产生代理对象
        /**
         * loader: 代理对象使用的类加载器
         * interfaces:指定代理对象的类型,即代理对象中可以有哪些方法
         * h: 当具体调节代理对象的方法时,应该如何进行响应,实际上就是调用  InvocationHandler  的    Invocation
         */
        rtn = (IJiSuanQi)Proxy.newProxyInstance(cl, al, ih);

        return rtn;

    }

}

LoggingProxy

时间: 2024-10-11 11:36:59

20160126--springaop的相关文章

spring-AOP之通知和顾问

通知和顾问都是切面的实现形式,其中通知可以完成对目标对象方法简单的织入功能. 而顾问包装了通知,可以让我们对通知实现更加精细化的管理,让我们可以指定具体的切入点. 通知分为前置通知,环绕通知及后置通知. 前置通知:在目标方法执行之前执行,不改变方法的执行流程及执行结果,前置通知的实现类要实现"MethodBeforeAdvice"这个接口. 环绕通知:也叫方法拦截器,可以改变方法的执行流程及执行结果,环绕通知的实现类要实现"MethodInterceptor"这个接

Spring-AOP实践

Spring-AOP实践 公司的项目有的页面超级慢,20s以上,不知道用户会不会疯掉,于是老大说这个页面要性能优化.于是,首先就要搞清楚究竟是哪一步耗时太多. 我采用spring aop来统计各个阶段的用时,其中计时器工具为StopWatch. 文章结构: 遇到的问题 创建项目 AOP-HelloWorld 时间统计 bug final 压力测试 源码 其中,遇到的问题: 1.少包aspectjweaver 添加依赖后才可以使用@Aspect 2.环绕通知加入多个point 刚开使用&&连

Spring声明式事务配置的两种策略SpringAop和Bean后处理器的代理BeanNameAutoProxyCreator

Spring的事务配置有两种:1编程式事务管理配置:2声明式事务管理配置.下面介绍两种声明式事务的配置,声明式事务相比于编程式事务代码耦合更低,无序书写任何事务管理的先关代码.两种声明式事务配置策略分别是:SpringAop事务管理和Bean后处理器的代理BeanNameAutoProxyCreator管理事务. 1.SpringAop事务管理配置 1.1.配置数据源: <bean id="pycDataSource" class="com.mchange.v2.c3p

AOP技术应用和研究--SpringAop实现原理

Spring 的AOP实现遵守了AOP联盟的约定.同时 Spring 又扩展了它,增加了如 Pointcut.Advisor 等一些接口使得更加灵活.在Spring的AOP模块中,包括AOP的基本概念,通知,切入点等,以及最核心的AopProxy代理对象生成和Spring AOP拦截器调用的实现. 1,Spring Aop的基本概念 我们在前面 AOP基本概念对AOP基本概念进行了理论上的定义,现在我们将Spring AOP基本概念作为例子来说明AOP的基本概念,这样可以更好的理解AOP基本概念

Spring-AOP用法总结

前言     Spring AOP的实现方法很多,在项目开发中具体采用什么方式,需要按实际情况来选择,每一种的用法,有其一定的实用价值,所以本文将各种使用方法进行了具体实现.主要包括Advice的before.after.throwing.around四种拦截方式的实现,如何进行正则匹配,自动化代理及AspectJ注解形式的实现. AOP的定义 Spring AOP(Aspect-oriented programming) 面向切面编程,是一种特殊的拦截器,将一组程序中的公共部分抽离出来进行单独

SpringAOP简介

AOP(Aspect Orient Programming) --- 面向切面编程 将分散在各个业务逻辑中的相同代码 通过 "横向"切割方式抽取到独立模块中 方式抽取到独立模块中;[它针对的是程序运行中的各个步骤] 优点:增强代码复用性,使编程人员专注业务于逻辑的实现: Spring AOP简介: Spring AOP是基于动态代理的 Spring AOP既支持JDK动态代理,也支持CGLib动态代理 l  如果目标对象实现了接口,默认釆用JDK动态代理 l  当然可以强制使用CGLi

springAop 使用@Around,@After等注解时,代码运行两边的问题

springAop使用@Around,@After等注解时,代码运行两边的问题 将@Component注解删掉就好了

SpringAOP与Redis搭建缓存

SpringAOP与Redis搭建缓存 近期项目查询数据库太慢,持久层也没有开启二级缓存,现希望采用Redis作为缓存.为了不改写原来代码,在此采用AOP+Redis实现. 目前由于项目需要,只需要做查询部分: 数据查询时每次都需要从数据库查询数据,数据库压力很大,查询速度慢,因此设置缓存层,查询数据时先从redis中查询,如果查询不到,则到数据库中查询,然后将数据库中查询的数据放到redis中一份,下次查询时就能直接从redis中查到,不需要查询数据库了. redis作为缓存的优势: 1.内存

Spring-aop实现切面的四种方式(1)

Spring实现AOP的4种方式 先了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一 个"时机",这些"时机"就是连接点,例如方法被调用时.异常被抛出时等等.3.切入点(Pointcut)通知定义了切面要发生的"故事"和时间,那么切入点就定义了"故事"发生的地点,例如某个类或方法的名称,spri

spring-aop学习

 SpringAOP学习 author:luojie 1.  AOP中的基本概念 AOP的通用术语,并非spring java所特有.很遗憾AOP的术语不是特别的直观.但如果让Spring java来定义自己的专用名词,可能会更加教人糊涂. 方面(Aspect):对横向分布在多个对象中的关注点所做的模块化.在企业应用中,事务管理就是一个典型的横切关注点.Spring java将方面实现为Advisor或拦截器(interceptor).(按:Advisor是通知和切入点的组合,拦截器实际就是指通