`
luhantu
  • 浏览: 200051 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring 代理模拟(I)

阅读更多
public interface IUserDAO {
    @Transactional
    String add();
    String query();
}

   

public class UserDAOImpl implements IUserDAO {

    public String add() {
        System.out.println("add ok!");
        return "add";
    }
    public String query() {
        System.out.println("query ok!");
        return "query";
    }
}

 

import org.junit.Test;
import org.springframework.transaction.annotation.Transactional;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Spring事务代理可以分为JDK动态代理和CGLIB代理模式,
 * JDK动态代理是依赖于接口的,
 * java.lang.reflect.Proxy.newProxyInstance方法根据传入的接口类型 (obj.getClass.getInterfaces())动态构造一个代理类实例返回,
 * 这也说明了为什么动态代理实现要求其所代理的对象一定要实现 一个接口。
 * 这个代理类实例在内存中是动态构造的,它实现了传入的接口列表中所包含的所有接口。
 *
 *
 * 就是通过这样一个动态代理对所有需要事务管理的Bean进行加载,并根据配置在invoke方法中对当前调用的 方法名进行判定,
 * 并在method.invoke方法前后为其加上合适的事务管理代码,这样就实现了Spring式的事务管理。
 * Spring中的AOP实 现更为复杂和灵活,不过基本原理是一致的
 * Created by kenny.dong on 2018/4/6.
 */
public class JDKProxyTest {
    @Test
    /**
     * jdk动态代理测试
     */
    public void jdkProxyTest(){
        //01.先创建出接口实现类
        final IUserDAO dao=new UserDAOImpl();
        //02.类Proxy
        IUserDAO proxy=(IUserDAO) Proxy.newProxyInstance(dao.getClass().getClassLoader(), //获取实现类的类加载器
                dao.getClass(). getInterfaces(), // 获取实现类接口
                new InvocationHandler() {  //Invocation(调用 ) Handler (处理)
                            /**proxy  代理对象本身
                             * method 被代理对象 方法  add()
                             * args add方法的参数
                             */
                            public Object invoke(Object proxy, Method method, Object[] args)
                                    throws Throwable {
                                if(method.getAnnotation(Transactional.class) != null){
                                    System.out.println("start Transaction");
                                    //code 1
                                    //真正业务
                                    //执行dao对象的add方法,传入的是args参数,返回值是result
                                    Object result = method.invoke(dao, args);
                                    //code 2
                                    System.out.println("commit Transaction");
                                    return result;
                                }else{
                                    return method.invoke(dao, args);
                                }
                            }
          });
        String add = proxy.add();
        System.out.println("add 方法运行结果" + add);//"add"
        proxy.query();
    }

}

 

 

 

 

0
0
分享到:
评论

相关推荐

    通过动态代理模拟Spring AOP

    通过动态代理模拟Spring AOP,通过动态代理模拟Spring AOP

    简单模拟spring cglib代理

    NULL 博文链接:https://lochen514.iteye.com/blog/1271194

    Spring模拟aop静态代理案例

    这是一个基于spring AOP静态代理模拟的案例,可以更好的理解spring的aop作用

    spring jdk动态代理

    spring aop jdk 动态代理的底层实现解析模拟

    个人用java动态代理模拟实现spring aop

    NULL 博文链接:https://zlx19900228.iteye.com/blog/843289

    java 动态代理实现,模拟spring aop

    java 动态代理实现,模拟了spring实现aop的原理,对学习面向切面编程的朋友有帮助!

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    本资源将深入探讨Spring框架中使用的两种关键的动态代理方式:JDK动态代理和CGLib动态代理。这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好...

    Spring的学习笔记

    第三课:模拟Spring功能 5 第四课:搭建sping的运行环境 8 一、 建立一个新的项目 8 二、 建立spring的配置文件 8 三、 引入spring的jar包 8 四、 测试代码: 8 五、 注意接口的使用: 8 第五课:IOC(DI)配置及应用 ...

    模拟spring aop【一】基于jdk动态代理实现的aop

    NULL 博文链接:https://johnyi.iteye.com/blog/385443

    Spring.3.x企业应用开发实战(完整版).part2

    16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体功能结构 17.1.2 论坛用例描述 17.1.3 主要...

    Spring.net框架

    由于接口在进行“动态代理” 时仍能保持类型信息,而抽象类可能由于代理的原因导致继承关系的“截断”(如MixIn等)。除此之外,对于单继承的C#语言而言,使用接口可以拥有更大 的弹性。 二、接口依赖 既然类之间的...

    Spring AOP运用Spring AOP技术,要求包含前置通知、后置通知、环绕通知、返回通知、异常返回通知。

    2、编写UserDao接口及其实现类UserDaoImpl,要求包含两个模拟方法,分别模拟用户的添加和删除。 3、使用JDK动态代理技术,对目标类UserDaoImpl生成代理类,此时目标类中的方法成为切入点,通过代理技术,将切面类的...

    spring2.5 学习笔记

    第三课:模拟Spring功能 5 第四课:搭建sping的运行环境 8 一、 建立一个新的项目 8 二、 建立spring的配置文件 8 三、 引入spring的jar包 8 四、 测试代码: 8 五、 注意接口的使用: 8 第五课:IOC(DI)配置及应用 ...

    Spring in Action(第2版)中文版

    4.3.1为spring切面创建自动代理 4.3.2自动代理@aspectj切面 4.4定义纯粹的pojo切面 4.5注入aspectj切面 4.6小结 第二部分企业spring 第5章使用数据库 5.1spring的数据访问哲学 5.1.1了解spring数据访问的...

    Spring in Action(第二版 中文高清版).part2

    4.3.1 为Spring切面创建自动代理 4.3.2 自动代理@AspectJ切面 4.4 定义纯粹的POJO切面 4.5 注入AspectJ切面 4.6 小结 第二部分 企业Spring 第5章 使用数据库 5.1 Spring的数据访问哲学 5.1.1 了解Spring数据...

    Spring in Action(第二版 中文高清版).part1

    4.3.1 为Spring切面创建自动代理 4.3.2 自动代理@AspectJ切面 4.4 定义纯粹的POJO切面 4.5 注入AspectJ切面 4.6 小结 第二部分 企业Spring 第5章 使用数据库 5.1 Spring的数据访问哲学 5.1.1 了解Spring数据...

    Spring MVC 3.0实战指南.ppt

    使用Spring的Servlet API代理类 使用IO对象作为入参 其他类型的参数 HttpMessageConverter HttpMessageConverter实现类 使用@RequestBody/@ResponseBody 使用HttpEntity<T>/ResponseEntity<T> 输出XML和JSON 使用...

    Spring3MVC注解教程.ppt

    使用Spring的Servlet API代理类 使用IO对象作为入参 其他类型的参数 HttpMessageConverter HttpMessageConverter实现类 使用@RequestBody/@ResponseBody 使用HttpEntity<T>/ResponseEntity<T> 输出XML和JSON ...

    Spring3.x企业应用开发实战(完整版) part1

    16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体功能结构 17.1.2 论坛用例描述 17.1.3 主要...

Global site tag (gtag.js) - Google Analytics