`
luhantu
  • 浏览: 204052 次
  • 性别: 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 cglib代理

    Spring框架是目前Java企业开发中最为流行...总结来说,通过模拟Spring的CGLIB代理,我们可以更深入地理解AOP的实现机制和代理模式的工作原理。这对于加深对Spring框架的理解以及开发高质量的Java应用都是非常有帮助的。

    自己动手模拟spring

    【标题】:“自己动手模拟spring” 【描述】:在该主题中,我们将深入理解Spring框架的核心概念,并通过编码实践来模拟其工作原理。参考链接提供了一个CSDN博客文章,作者详细介绍了如何从零开始创建一个简易版的...

    通过动态代理模拟Spring AOP

    总的来说,通过Java的动态代理模拟Spring AOP可以帮助我们理解AOP的基本原理,并在实际项目中实现一些简单的切面逻辑。然而,对于更复杂的需求,如跨越多个方法的事务管理,Spring AOP提供了更全面的解决方案。熟悉...

    以注解方式模拟Spring IoC AOP

    - **基于代理的AOP**:Spring使用JDK动态代理或CGLIB动态代理创建目标对象的代理,代理对象在调用目标方法前后执行切面逻辑。 - **基于注解的AOP**:Spring支持在方法上直接定义切面注解,如`@Before`, `@After`, `...

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

    在本主题中,我们将探讨如何使用Java动态代理来模拟实现Spring AOP的功能。 首先,我们需要了解Java中的两种动态代理机制:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于目标对象实现了接口的情况...

    Spring模拟aop静态代理案例

    本案例"Spring模拟aop静态代理案例"旨在帮助开发者深入理解Spring AOP在实际应用中的运作方式,特别是静态代理的概念。 AOP(Aspect Oriented Programming)是一种编程范式,它允许程序员将关注点(如日志、事务...

    java模拟spring ioc

    不过,需要注意的是,Spring框架提供了更高级的功能,如自动扫描、AOP代理、事务管理等,这些都是纯Java模拟可能难以完全复现的。因此,尽管模拟有助于学习,但在实际项目中,直接使用Spring框架会更加高效和便捷。

    Spring AOP简单模拟

    **Spring AOP 简单模拟** 在Java开发中,Spring框架因其强大的功能和灵活性而被广泛应用,其中Spring AOP(面向切面编程)是它的重要特性之一。AOP允许程序员将关注点从核心业务逻辑中分离出来,比如日志记录、事务...

    spring原理模拟

    Spring AOP通过动态代理机制,在运行时织入切面,提供声明式事务管理等功能。 让我们通过一个简单的例子来模拟Spring的实现。假设我们有一个`UserService`需要依赖`DatabaseService`,在传统模式下,`UserService`...

    模拟spring aop技术

    **模拟Spring AOP技术** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组件,它提供了一种在不修改源代码的情况下,通过代理模式来实现横切关注点(如日志、事务管理等)的...

    使用反射和注解模拟Spring的依赖注入

    然而,实际的Spring框架提供了更高级的功能,如AOP(面向切面编程)、代理模式、基于XML或Java配置的bean定义、条件注解等,使得依赖注入更加灵活和强大。 总的来说,理解和掌握反射与注解对于深入学习Spring框架至...

    模拟 Spring 的实现

    模拟Spring并不是重新创建一个完整的Spring框架,而是为了学习和理解Spring的工作原理,通过编写简单的代码来实现IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)的核心...

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

    模拟Spring AOP的过程大致如下: 1. **定义目标对象**:这是我们要添加切面逻辑的对象,它通常包含了业务逻辑。 2. **定义切面**:切面定义了我们想要插入到目标对象的行为,如日志记录、事务管理等。 3. **创建...

    Java模拟的spring实现

    当我们谈论"Java模拟的spring实现"时,这意味着我们要通过纯Java代码来模拟Spring框架的一些关键特性。这有助于我们深入理解Spring的工作原理,并能在没有Spring环境的情况下进行教学、学习或测试。 首先,让我们来...

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

    本篇文章将探讨如何通过JDK动态代理实现Spring AOP的基础知识。 首先,我们要理解什么是JDK动态代理。在Java中,动态代理机制允许我们在运行时创建一个实现了特定接口的新类。这个新类的实例可以代理目标对象,执行...

    简单模拟spring框架原理

    在Spring中,AOP通过代理模式实现。我们可以定义切面(Aspect),包含切点(Pointcut)和通知(Advice)。切点是代码执行过程中的特定位置,而通知是在这些位置执行的操作。 例如,我们可以定义一个简单的日志切面...

    使用CGLIB模拟spring的拦截器

    当Spring无法通过传统的Java代理(JDK Proxy)对无接口类进行代理时,就会转向CGLIB。CGLIB通过创建目标类的子类并覆盖其方法来实现动态代理,即使目标类没有实现任何接口。 首先,我们需要理解Spring拦截器的基本...

    模拟Spring架构的简易实现

    4. **AopProxy**:模拟AOP代理,用于在方法调用前后插入拦截逻辑。 5. **Advisor**和**Advice**:模拟Spring的顾问和通知,定义切面的逻辑。 6. **Pointcut**:模拟切点,定义哪些方法或类会被切面所影响。 在这个...

    模拟spring工厂模式底层实现。

    6. **AOP代理**:如果Bean配置了AOP相关的注解,Spring会创建一个代理对象,该代理对象在调用实际Bean的方法前/后执行相应的切面逻辑。 7. **单例Bean的缓存**:对于单例模式的Bean,Spring会将其缓存,后续请求...

Global site tag (gtag.js) - Google Analytics