`

spring aop的实现原型模拟

 
阅读更多

我们都知道spring的配置文件中可以进行声明式事务管理,其基于的原理是spring aop 切片编程,aop是基于动态代理的,动态代理可以从jvm加载类时通过反射对方法进行额外的处理。

 

1,先定义一个接口,把我们要做的事情写成接口方法

public interface IOstocy{
   void sayHello(String name);

   void sayGoodBye(String name);

}

 2,我们给与IOstocy一个实现类

public class Ostocy implements IOstocy{
  public void sayHello(String name){
      System.out.println("hello"+name);
  }
  
  public void sayGoodBye(String name){
      System.out.println(name+"goodsBye!");
  }
}

 3,定义一个接口,用来保存你需要对IOstocy逻辑进行额外处理的方法,例如记录sayHello的对象是谁

public interface IOperation{
  void start(Method method);

  void end(Method method);

}

 定义了一个开始和结束接口方法,接下来需要给一个实现类

 

4,定义个实现类,去实现IOperation接口

public class LoggerOperation implements IOperation {

    public void end(Method method) {
        Logger.logging(Level.DEBUGE, method.getName() + " Method end .");
    }

    public void start(Method method) {
        Logger.logging(Level.INFO, method.getName() + " Method Start!");
    }

}

 

5,要写一个代理类了,这个代理类,会把IOstocy和IOperation分开处理,IOstocy中的方法是很被动的,就呆着那里,等IOperation在他随便哪个位置进来。到底从前还是后进来,就要看你自己怎么处理了,这涉及到@after @before的实现原理了。

public class DynaProxyHello implements InvocationHandler {
    /**
     * 操作者
     */
    private Object proxy;
    /**
     * 要处理的对象(也就是我们要在方法的前后加上业务逻辑的对象,如例子中的Hello)
     */
    private Object delegate;

    /**
     * 动态生成方法被处理过后的对象 (写法固定)
     * 
     * @param delegate
     * @param proxy
     * @return
     */
    public Object bind(Object delegate,Object proxy) {
        
        this.proxy = proxy;
        this.delegate = delegate;
        return Proxy.newProxyInstance(
                this.delegate.getClass().getClassLoader(), this.delegate
                        .getClass().getInterfaces(), this);
    }
    /**
     * 要处理的对象中的每个方法会被此方法送去JVM调用,也就是说,要处理的对象的方法只能通过此方法调用
    * 此方法是动态的,不是手动调用的
     */
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Object result = null;
        try {
            //反射得到操作者的实例
            Class clazz = this.proxy.getClass();
            //反射得到操作者的Start方法
            Method start = clazz.getDeclaredMethod("start",
                    new Class[] { Method.class });
            //反射执行start方法
            start.invoke(this.proxy, new Object[] { method });
            //执行要处理对象的原本方法
            result = method.invoke(this.delegate, args);
//            反射得到操作者的end方法
            Method end = clazz.getDeclaredMethod("end",
                    new Class[] { Method.class });
//            反射执行end方法
            end.invoke(this.proxy, new Object[] { method });

        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

}

 6,测试下

public class Test {
    public static void main(String[] args) {
        IOstocy ostocy= (IOstocy)new DynaProxyHello().bind(new Ostocy(),new LoggerOperation());
        ostocy.sayGoogBye("Double J");
        ostocy.sayHello("Double J");
        
    }
}

 我的想法是在代理对象的public Object invoke(Object proxy, Method method, Object[] args)方法里面加上个if(),对传进来的method的名字进行判断,判断的条件存在XML里面.这样我们就可以配置文件时行解藕了.如果有兴趣的朋友可以把操作者,被代理者,都通过配置文件进行配置 ,那么就可以写一个简单的SpringAOP框架了.

谢谢 http://www.blogjava.net/DoubleJ/archive/2008/03/04/183796.html

 

分享到:
评论

相关推荐

    简单模拟Spring的beanFactory

    这可以通过单例模式、原型模式或其他策略实现。Spring默认使用CGLIB或Java反射进行实例化。 3. **依赖注入**:这是Spring的核心功能之一。`BeanFactory`解析bean定义中的依赖,并将它们注入到相应的bean属性中。...

    spring 3 依赖包_part3

    Spring AOP是基于AspectJ实现的,它使得在Spring应用中实现横切关注点如日志、事务管理等变得简单。 以上这些库在Spring 3中扮演着不同的角色,共同构建了一个强大而全面的开发环境。通过理解和掌握这些依赖,...

    Spring的学习笔记

    - **动态代理**:Spring AOP通过动态代理技术实现切面,包括JDK动态代理和CGLIB代理。 **AOP配置** - **注解方式**:使用@Aspect,@Before,@After等注解定义切面、通知和切入点表达式。 - **XML方式**:在配置...

    Spring 5.0.9 完整jar包

    此外,Spring还支持原型和单例两种bean的作用域,以及接口和实现类的自动装配。 2. **AOP(面向切面编程)**:Spring的AOP模块允许开发者实现关注点分离,通过切面定义跨越多个对象的行为。它可以用于日志记录、...

    手写高仿真提炼Spring.zip

    最后,模拟Spring的实现将帮助我们理解Spring的内部工作原理,比如如何通过反射创建bean,如何解析和加载bean的配置信息,以及如何实现AOP的动态代理等。这种实践过程不仅加深了对Spring的理解,也为日常开发中的...

    spring3.x权威开发指南

    9. **Spring Aspects**:Spring AOP模块实现了完整的AOP联盟规范,支持自定义切面和通知类型,如前置通知、后置通知、环绕通知等。 10. **Spring Test**:提供了对单元测试和集成测试的支持,包括模拟对象、测试上...

    Spring认证考试指南

    5. **面向切面编程(AOP)**:理解AOP的概念和解决的问题,实现和部署Advices,使用AOP切入点表达式,识别不同类型的Advice并了解其应用场景。 **数据管理部分**: 1. **Spring JDBC**:会配置和使用Spring的...

    Spring入门经典 ((美)Mert Caliskan著) 中文

    5. **AOP**:Spring的面向切面编程,用于实现关注点分离,如日志记录、事务管理等,可以作为核心业务逻辑之外的补充。 6. **数据访问**:Spring对JDBC、ORM(对象关系映射)框架如Hibernate和MyBatis的支持,以及...

    Spring技术内幕:深入解析Spring架构与设计原理

    - AOP是Spring提供的另一重要特性,用于处理系统中的横切关注点,如日志、事务管理等。 - 切面(Aspect)和通知(Advice)是AOP的基本概念,通过定义切入点(Pointcut)和通知类型实现代码的模块化。 4. **Bean的...

    spring demo

    2. **AOP**:Spring的AOP模块允许开发者定义“切面”,这些切面可以插入到应用程序的多个点上,以实现例如日志、事务管理等横切关注点。在SpringProject3中,我们可能找到使用@Aspect注解的类,以及@Before、@After...

    Spring.net教程

    这个练习通常涉及创建一个简单的容器,实现对象的创建、管理和依赖注入,以模拟Spring.NET的基本功能。 4. **对象的创建**:Spring.NET提供了一种声明式的方式来创建和管理对象,包括单例、原型等不同生命周期的...

    手写简单的Spring框架

    5. **AOP支持**:虽然不是必须的,但为了模拟Spring的AOP功能,我们可以创建一个切面类和通知(advice),用于拦截和增强特定的Bean方法。这需要实现一个代理模式,如JDK动态代理或CGLIB代理。 6. **Scope管理**:...

    spring java包

    2. **AOP(面向切面编程)**:Spring 提供了基于代理的 AOP 实现,使得开发者可以创建横切关注点,如日志、事务管理和安全性,而不污染业务逻辑代码。 3. **Spring MVC**:这是一个用于构建 Web 应用的模型-视图-...

    mySpring:Spring IOC的模拟

    在模拟实现中,可以考虑简单实现AOP的概念,例如拦截器模式。 7. **Bean的初始化与销毁**:Spring允许开发者指定Bean的初始化方法和销毁方法。模拟时,需提供调用这些方法的机制。 8. **Bean的自动装配**:Spring...

    Spring学习资料

    - **自动代理**:Spring可以创建JDK动态代理或CGLIB代理来实现AOP。 6. **Spring Boot** - **快速启动**:简化Spring应用程序的初始设置,自动配置。 - **Actuator**:提供监控和健康检查功能。 - **Spring ...

    spring2.5 学习笔记

    模拟Spring功能是为了理解Spring的核心机制,如控制反转(IOC)和依赖注入(DI)。在搭建Spring的运行环境中,我们需要创建一个新的项目,建立Spring的配置文件,引入必要的Spring库,并编写测试代码来验证配置是否...

    Spring 5.1.x(重) (1).docx

    - **AOP代理**:Spring提供两种类型的代理,即JDK动态代理和CGLIB代理,实现面向切面的增强。 2. Spring下载和安装 要使用Spring,首先需要将其引入到项目中。这可以通过两种方式完成: 2.1. 离线下载包导入 可以...

    spring框架案例学习文档笔记.doc

    Spring框架是Java开发中广泛应用的一个开源框架,以其依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)为核心,极大地简化了企业级应用的开发。下面将详细阐述文档...

Global site tag (gtag.js) - Google Analytics