`
_Yggd
  • 浏览: 88734 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

spring最简单的aop实现

阅读更多
其实spring中的aop就是设计模式中的结构型模式中的代理模式还有反射,但是经过spring整合,发扬光大之后代理显得不是那么明显了,代码如下:

业务接口:


/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cn.com.fyz.spring.aop;

/**
*
* @author RDGFT
*/
public interface IHello {
    void syshello(String s);//模拟业务处理
}


实现类:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cn.com.fyz.spring.aop;

/**
*
* @author RDGFT
*/
public class Helloimlp implements IHello{

    @Override
    public void syshello(String s) {
System.out.println("Hello " + s); //模拟业务处理
    }
   
}


现在我们要为这个业务方法加上日志记录的业务,我们在不改变原代码的情况下,
我们会去怎么做呢?也许,你会去写一个类去实现IHello接口,并依赖Hello这个类.代码如下:


/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cn.com.fyz.spring.aop;

/**
*
* @author RDGFT
*/
public class helloproxy implements IHello {

    private IHello hello;

    public helloproxy(IHello hello) {
this.hello = hello;
    }

    public void syshello(String s) {
System.out.println("处理业务之前的代码... ...比如验证身份");
this.hello.syshello(s);
System.out.println("处理业务之后的代码... ...比如资源释放");
    }
}



测试:


/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cn.com.fyz.spring.aop;

/**
*
* @author RDGFT
*/
public class test {

    public static void main(String[] argv) {
IHello hello = new helloproxy(new Helloimlp());
hello.syshello("sadasd");
    }
}









分享到:
评论
1 楼 _Yggd 2013-07-15  
但是我们会发现一个问题,如果我们像Hello这样的类很多,那么,我们是不是要去写很多个HelloProxy这样的类呢.
没错,是的.其实也是一种很麻烦的事.在jdk1.3以后.jdk跟我们提供了一个API java.lang.reflect.InvocationHandler的类. 这个类可以让我们在JVM调用某个类的方法时动态的为些方法做些什么事.让我们把以上的代码改一下来看看效果.

同样,我们写一个IHello的接口和一个Hello的实现类.在接口中.我们定义两个方法;代码如下 :



/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cn.com.fyz.spring.aop;

/**
*
* @author RDGFT
*/
public interface IHello {
    void syshello(String s);//模拟业务逻辑处理
}



/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cn.com.fyz.spring.aop;

/**
*
* @author RDGFT
*/
public class Helloimlp implements IHello{

    @Override
    public void syshello(String s) {
System.out.println("Hello " + s);//模拟业务逻辑处理
    }
   
}


动态代理

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cn.com.fyz.spring.aop;

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

/**
*
* @author RDGFT
*/
public class dynahelloproxy implements InvocationHandler{

    private Object o; 
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object o=null;
System.out.println("处理业务之前的代码... ...比如验证身份");
o=method.invoke(this.o, args);
System.out.println("处理业务之后的代码... ...比如资源释放");
return o;
    }
   
    public Object bind(Object delegate) {
this.o=delegate;
return Proxy.newProxyInstance(this.o.getClass().getClassLoader(),this.o.getClass().getInterfaces(), this);
    }
}



测试:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cn.com.fyz.spring.aop;

/**
*
* @author RDGFT
*/
public class dynatest {
     public static void main(String[] args) {
         IHello hello = (IHello)new dynahelloproxy().bind(new Helloimlp());
         hello.syshello("asdasd");
        
     }
}


输出:

run:
处理业务之前的代码... ...比如验证身份
Hello asdasd
处理业务之后的代码... ...比如资源释放
成功构建 (总时间: 0 秒)


相关推荐

    Spring AOP的简单实现

    在这个场景中,我们将使用Spring AOP来实现一个日志记录的功能,以追踪系统中各个方法的调用情况,包括访问时间以及传递的参数。下面将详细阐述如何实现这一目标。 首先,我们需要了解AOP的基本概念。AOP的核心是切...

    Spring Aop的简单实现

    在本项目中,我们将探讨如何通过配置文件实现Spring AOP,包括前置通知、后置通知以及拦截器的运用。 首先,我们需要理解Spring AOP的核心概念。切面(Aspect)是关注点的模块化,这些关注点定义了跨越多个对象的...

    Spring-Aop源码实现

    根据给定文件的信息来看,这段内容实际上与Spring-AOP源码实现并无直接关联,而是关于Hadoop的基础介绍及其生态系统中的几个重要组件。然而,既然任务要求是从这些信息中提炼相关知识点,我们将尝试从Hadoop的角度...

    spring之AOP(动态代理)

    在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...

    Spring AOP框架实现的结构分析

    "Spring AOP 框架实现的结构分析" 本文主要目标是从实现的角度来认识 SpringAOP 框架。首先,我们需要了解 AOP 的基本概念,包括关注点、核心关注点、横切关注点、方面、连接点、切入点、增强、引介、混入继承和织...

    一个简单的spring AOP的实现

    1. 注解驱动的AOP:这是最常用的实现方式,通过在方法上添加注解(如`@Before`, `@After`, `@Around`, `@AfterReturning`, `@AfterThrowing`)来定义通知,并使用`@Aspect`注解定义切面。 2. XML配置驱动的AOP:...

    Spring基础:Spring AOP简单使用

    2. **Spring AOP实现** - **JDK动态代理**:当目标对象实现了至少一个接口时,Spring会使用Java的Proxy类创建一个代理对象,该代理对象在运行时动态生成,并在调用实际方法前/后插入通知代码。 - **CGLIB代理**:...

    Spring实现AOP的4种方式

    本篇文章将详细探讨Spring实现AOP的四种主要方法:基于代理的方式、基于AspectJ的注解方式、基于XML的AOP配置以及基于Java的AOP配置。 1. 基于代理的实现 Spring的AOP支持两种代理类型:JDK动态代理和CGLIB代理。...

    spring aop 实现源代码--xml and annotation(带lib包)

    在Spring1.2或之前的版本中,实现AOP的传统方式就是通过实现Spring的AOP API来定义Advice,并设置代理对象。Spring根据Adivce加入到业务流程的时机的不同,提供了四种不同的Advice:Before Advice、After Advice、...

    SpringAOP结合ehCache实现简单缓存实例

    本文将深入探讨如何结合Spring AOP与EhCache实现一个简单的缓存实例,以便优化Java应用的运行效率。 首先,让我们了解Spring AOP。Spring AOP是Spring框架的一部分,它允许我们在不修改业务代码的情况下,通过定义...

    Spring IOC AOP MVC 简单例子

    在这个简单的例子中,`Spring IOC AOP MVC 简单例子`可能是整个项目的整合示例,它将上述三个核心组件结合在一起,演示了如何在一个实际的Web应用中使用Spring。这个示例可能会包括一个简单的用户登录功能,展示如何...

    spring aop xml实现

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许程序员在不修改源代码的情况下,通过在关键点(切点)插入拦截器(通知)来增强功能,实现横切关注点,如日志、事务管理等。XML配置是Spring AOP早期...

    Spring AOP面向方面编程原理:AOP概念

    接下来,我们通过一个简单的Spring AOP示例来加深对上述概念的理解。假设我们需要在调用某个公共方法前记录日志,我们可以定义一个`BeforeAdvice`,并在目标方法上应用此通知。 ```java package com.example.aop; ...

    myeclipse spring IOC和AOP 例子

    下面将详细阐述Spring的IOC和AOP,以及如何在实际项目中实现和配置。 ### Spring IOC(Inversion of Control,控制反转) 控制反转是一种设计模式,它的核心思想是将对象的创建和管理交由容器负责,而不是由对象...

    spring aop注解版

    总结起来,Spring AOP注解版通过简单易懂的注解,使得面向切面编程变得更加直观和方便。它降低了横切关注点与业务逻辑之间的耦合度,提高了代码的可维护性和复用性。通过合理利用这些注解,开发者可以轻松地实现日志...

    spring2-aop入门实例教程

    - **Spring AOP支持**:Spring支持多种AOP实现方式,包括AspectJ和自己的AOP实现。 - **配置方法**:Spring AOP可以通过XML配置文件、Java配置类以及注解等多种方式进行配置。 - **切入点(Pointcut)**:定义了通知将...

    Spring源码最难问题:当Spring AOP遇上循环依赖.docx

    Spring源码最难问题:当Spring AOP遇上循环依赖 Spring源码中最难的问题之一是循环依赖问题,当Spring AOP遇上循环依赖时,该如何解决? Spring通过三级缓存机制解决循环依赖的问题。 在Spring中,bean的实例化...

    最简单的SpringAOP入门案例

    5. **代理模式**:Spring AOP通过代理模式实现切面功能,有JDK动态代理和CGLIB代理两种方式,前者针对实现了接口的类,后者则用于未实现接口的类。 通过这个简单的案例,你应该对Spring AOP有了初步的理解。随着...

    Spring注解方式实现AOP demo

    总结来说,这个Spring AOP注解方式的Demo展示了如何通过简单的注解定义切面、切点和通知,实现对业务逻辑的无侵入式增强。这种方式使得代码更简洁、可读性更强,同时也充分利用了Spring框架的优势。对于理解和实践...

    Spring通过注解实现AOP

    本篇文章将详细探讨如何通过注解在Spring中实现AOP。 首先,我们需要理解AOP的基本概念。AOP的核心思想是将那些分散在各个业务逻辑中的共同行为,如日志记录、事务处理、性能监控等,抽取出来,形成独立的模块,...

Global site tag (gtag.js) - Google Analytics